dont try to load nothign
[carveJwlIkooP6JGAAIwe30JlM.git] / dep / sqlite3 / shell.c
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 char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
256 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
257 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
258 #endif
259
260 /* On Windows, we normally run with output mode of TEXT so that \n characters
261 ** are automatically translated into \r\n. However, this behavior needs
262 ** to be disabled in some cases (ex: when generating CSV output and when
263 ** rendering quoted strings that contain \n characters). The following
264 ** routines take care of that.
265 */
266 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
267 static void setBinaryMode(FILE *file, int isOutput){
268 if( isOutput ) fflush(file);
269 _setmode(_fileno(file), _O_BINARY);
270 }
271 static void setTextMode(FILE *file, int isOutput){
272 if( isOutput ) fflush(file);
273 _setmode(_fileno(file), _O_TEXT);
274 }
275 #else
276 # define setBinaryMode(X,Y)
277 # define setTextMode(X,Y)
278 #endif
279
280 /* True if the timer is enabled */
281 static int enableTimer = 0;
282
283 /* A version of strcmp() that works with NULL values */
284 static int cli_strcmp(const char *a, const char *b){
285 if( a==0 ) a = "";
286 if( b==0 ) b = "";
287 return strcmp(a,b);
288 }
289 static int cli_strncmp(const char *a, const char *b, size_t n){
290 if( a==0 ) a = "";
291 if( b==0 ) b = "";
292 return strncmp(a,b,n);
293 }
294
295 /* Return the current wall-clock time */
296 static sqlite3_int64 timeOfDay(void){
297 static sqlite3_vfs *clockVfs = 0;
298 sqlite3_int64 t;
299 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
300 if( clockVfs==0 ) return 0; /* Never actually happens */
301 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
302 clockVfs->xCurrentTimeInt64(clockVfs, &t);
303 }else{
304 double r;
305 clockVfs->xCurrentTime(clockVfs, &r);
306 t = (sqlite3_int64)(r*86400000.0);
307 }
308 return t;
309 }
310
311 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
312 #include <sys/time.h>
313 #include <sys/resource.h>
314
315 /* VxWorks does not support getrusage() as far as we can determine */
316 #if defined(_WRS_KERNEL) || defined(__RTP__)
317 struct rusage {
318 struct timeval ru_utime; /* user CPU time used */
319 struct timeval ru_stime; /* system CPU time used */
320 };
321 #define getrusage(A,B) memset(B,0,sizeof(*B))
322 #endif
323
324 /* Saved resource information for the beginning of an operation */
325 static struct rusage sBegin; /* CPU time at start */
326 static sqlite3_int64 iBegin; /* Wall-clock time at start */
327
328 /*
329 ** Begin timing an operation
330 */
331 static void beginTimer(void){
332 if( enableTimer ){
333 getrusage(RUSAGE_SELF, &sBegin);
334 iBegin = timeOfDay();
335 }
336 }
337
338 /* Return the difference of two time_structs in seconds */
339 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
340 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
341 (double)(pEnd->tv_sec - pStart->tv_sec);
342 }
343
344 /*
345 ** Print the timing results.
346 */
347 static void endTimer(void){
348 if( enableTimer ){
349 sqlite3_int64 iEnd = timeOfDay();
350 struct rusage sEnd;
351 getrusage(RUSAGE_SELF, &sEnd);
352 printf("Run Time: real %.3f user %f sys %f\n",
353 (iEnd - iBegin)*0.001,
354 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
355 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
356 }
357 }
358
359 #define BEGIN_TIMER beginTimer()
360 #define END_TIMER endTimer()
361 #define HAS_TIMER 1
362
363 #elif (defined(_WIN32) || defined(WIN32))
364
365 /* Saved resource information for the beginning of an operation */
366 static HANDLE hProcess;
367 static FILETIME ftKernelBegin;
368 static FILETIME ftUserBegin;
369 static sqlite3_int64 ftWallBegin;
370 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
371 LPFILETIME, LPFILETIME);
372 static GETPROCTIMES getProcessTimesAddr = NULL;
373
374 /*
375 ** Check to see if we have timer support. Return 1 if necessary
376 ** support found (or found previously).
377 */
378 static int hasTimer(void){
379 if( getProcessTimesAddr ){
380 return 1;
381 } else {
382 #if !SQLITE_OS_WINRT
383 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
384 ** versions. See if the version we are running on has it, and if it
385 ** does, save off a pointer to it and the current process handle.
386 */
387 hProcess = GetCurrentProcess();
388 if( hProcess ){
389 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
390 if( NULL != hinstLib ){
391 getProcessTimesAddr =
392 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
393 if( NULL != getProcessTimesAddr ){
394 return 1;
395 }
396 FreeLibrary(hinstLib);
397 }
398 }
399 #endif
400 }
401 return 0;
402 }
403
404 /*
405 ** Begin timing an operation
406 */
407 static void beginTimer(void){
408 if( enableTimer && getProcessTimesAddr ){
409 FILETIME ftCreation, ftExit;
410 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
411 &ftKernelBegin,&ftUserBegin);
412 ftWallBegin = timeOfDay();
413 }
414 }
415
416 /* Return the difference of two FILETIME structs in seconds */
417 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
418 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
419 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
420 return (double) ((i64End - i64Start) / 10000000.0);
421 }
422
423 /*
424 ** Print the timing results.
425 */
426 static void endTimer(void){
427 if( enableTimer && getProcessTimesAddr){
428 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
429 sqlite3_int64 ftWallEnd = timeOfDay();
430 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
431 printf("Run Time: real %.3f user %f sys %f\n",
432 (ftWallEnd - ftWallBegin)*0.001,
433 timeDiff(&ftUserBegin, &ftUserEnd),
434 timeDiff(&ftKernelBegin, &ftKernelEnd));
435 }
436 }
437
438 #define BEGIN_TIMER beginTimer()
439 #define END_TIMER endTimer()
440 #define HAS_TIMER hasTimer()
441
442 #else
443 #define BEGIN_TIMER
444 #define END_TIMER
445 #define HAS_TIMER 0
446 #endif
447
448 /*
449 ** Used to prevent warnings about unused parameters
450 */
451 #define UNUSED_PARAMETER(x) (void)(x)
452
453 /*
454 ** Number of elements in an array
455 */
456 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
457
458 /*
459 ** If the following flag is set, then command execution stops
460 ** at an error if we are not interactive.
461 */
462 static int bail_on_error = 0;
463
464 /*
465 ** Treat stdin as an interactive input if the following variable
466 ** is true. Otherwise, assume stdin is connected to a file or pipe.
467 */
468 static int stdin_is_interactive = 1;
469
470 #if (defined(_WIN32) || defined(WIN32)) && SHELL_USE_LOCAL_GETLINE \
471 && !defined(SHELL_OMIT_WIN_UTF8)
472 # define SHELL_WIN_UTF8_OPT 1
473 #else
474 # define SHELL_WIN_UTF8_OPT 0
475 #endif
476
477 #if SHELL_WIN_UTF8_OPT
478 /*
479 ** Setup console for UTF-8 input/output when following variable true.
480 */
481 static int console_utf8 = 0;
482 #endif
483
484 /*
485 ** On Windows systems we have to know if standard output is a console
486 ** in order to translate UTF-8 into MBCS. The following variable is
487 ** true if translation is required.
488 */
489 static int stdout_is_console = 1;
490
491 /*
492 ** The following is the open SQLite database. We make a pointer
493 ** to this database a static variable so that it can be accessed
494 ** by the SIGINT handler to interrupt database processing.
495 */
496 static sqlite3 *globalDb = 0;
497
498 /*
499 ** True if an interrupt (Control-C) has been received.
500 */
501 static volatile int seenInterrupt = 0;
502
503 /*
504 ** This is the name of our program. It is set in main(), used
505 ** in a number of other places, mostly for error messages.
506 */
507 static char *Argv0;
508
509 /*
510 ** Prompt strings. Initialized in main. Settable with
511 ** .prompt main continue
512 */
513 #define PROMPT_LEN_MAX 20
514 /* First line prompt. default: "sqlite> " */
515 static char mainPrompt[PROMPT_LEN_MAX];
516 /* Continuation prompt. default: " ...> " */
517 static char continuePrompt[PROMPT_LEN_MAX];
518
519 /* This is variant of the standard-library strncpy() routine with the
520 ** one change that the destination string is always zero-terminated, even
521 ** if there is no zero-terminator in the first n-1 characters of the source
522 ** string.
523 */
524 static char *shell_strncpy(char *dest, const char *src, size_t n){
525 size_t i;
526 for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
527 dest[i] = 0;
528 return dest;
529 }
530
531 /*
532 ** Optionally disable dynamic continuation prompt.
533 ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
534 ** or open parentheses level if non-zero, or continuation prompt as set.
535 ** This facility interacts with the scanner and process_input() where the
536 ** below 5 macros are used.
537 */
538 #ifdef SQLITE_OMIT_DYNAPROMPT
539 # define CONTINUATION_PROMPT continuePrompt
540 # define CONTINUE_PROMPT_RESET
541 # define CONTINUE_PROMPT_AWAITS(p,s)
542 # define CONTINUE_PROMPT_AWAITC(p,c)
543 # define CONTINUE_PAREN_INCR(p,n)
544 # define CONTINUE_PROMPT_PSTATE 0
545 typedef void *t_NoDynaPrompt;
546 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
547 #else
548 # define CONTINUATION_PROMPT dynamicContinuePrompt()
549 # define CONTINUE_PROMPT_RESET \
550 do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
551 # define CONTINUE_PROMPT_AWAITS(p,s) \
552 if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
553 # define CONTINUE_PROMPT_AWAITC(p,c) \
554 if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
555 # define CONTINUE_PAREN_INCR(p,n) \
556 if(p && stdin_is_interactive) (trackParenLevel(p,n))
557 # define CONTINUE_PROMPT_PSTATE (&dynPrompt)
558 typedef struct DynaPrompt *t_DynaPromptRef;
559 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
560
561 static struct DynaPrompt {
562 char dynamicPrompt[PROMPT_LEN_MAX];
563 char acAwait[2];
564 int inParenLevel;
565 char *zScannerAwaits;
566 } dynPrompt = { {0}, {0}, 0, 0 };
567
568 /* Record parenthesis nesting level change, or force level to 0. */
569 static void trackParenLevel(struct DynaPrompt *p, int ni){
570 p->inParenLevel += ni;
571 if( ni==0 ) p->inParenLevel = 0;
572 p->zScannerAwaits = 0;
573 }
574
575 /* Record that a lexeme is opened, or closed with args==0. */
576 static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
577 if( s!=0 || c==0 ){
578 p->zScannerAwaits = s;
579 p->acAwait[0] = 0;
580 }else{
581 p->acAwait[0] = c;
582 p->zScannerAwaits = p->acAwait;
583 }
584 }
585
586 /* Upon demand, derive the continuation prompt to display. */
587 static char *dynamicContinuePrompt(void){
588 if( continuePrompt[0]==0
589 || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
590 return continuePrompt;
591 }else{
592 if( dynPrompt.zScannerAwaits ){
593 size_t ncp = strlen(continuePrompt);
594 size_t ndp = strlen(dynPrompt.zScannerAwaits);
595 if( ndp > ncp-3 ) return continuePrompt;
596 strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
597 while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
598 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
599 PROMPT_LEN_MAX-4);
600 }else{
601 if( dynPrompt.inParenLevel>9 ){
602 shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
603 }else if( dynPrompt.inParenLevel<0 ){
604 shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
605 }else{
606 shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
607 dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
608 }
609 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3, PROMPT_LEN_MAX-4);
610 }
611 }
612 return dynPrompt.dynamicPrompt;
613 }
614 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
615
616 #if SHELL_WIN_UTF8_OPT
617 /* Following struct is used for -utf8 operation. */
618 static struct ConsoleState {
619 int stdinEof; /* EOF has been seen on console input */
620 int infsMode; /* Input file stream mode upon shell start */
621 UINT inCodePage; /* Input code page upon shell start */
622 UINT outCodePage; /* Output code page upon shell start */
623 HANDLE hConsoleIn; /* Console input handle */
624 DWORD consoleMode; /* Console mode upon shell start */
625 } conState = { 0, 0, 0, 0, INVALID_HANDLE_VALUE, 0 };
626
627 #ifndef _O_U16TEXT /* For build environments lacking this constant: */
628 # define _O_U16TEXT 0x20000
629 #endif
630
631 /*
632 ** Prepare console, (if known to be a WIN32 console), for UTF-8
633 ** input (from either typing or suitable paste operations) and for
634 ** UTF-8 rendering. This may "fail" with a message to stderr, where
635 ** the preparation is not done and common "code page" issues occur.
636 */
637 static void console_prepare(void){
638 HANDLE hCI = GetStdHandle(STD_INPUT_HANDLE);
639 DWORD consoleMode = 0;
640 if( isatty(0) && GetFileType(hCI)==FILE_TYPE_CHAR
641 && GetConsoleMode( hCI, &consoleMode) ){
642 if( !IsValidCodePage(CP_UTF8) ){
643 fprintf(stderr, "Cannot use UTF-8 code page.\n");
644 console_utf8 = 0;
645 return;
646 }
647 conState.hConsoleIn = hCI;
648 conState.consoleMode = consoleMode;
649 conState.inCodePage = GetConsoleCP();
650 conState.outCodePage = GetConsoleOutputCP();
651 SetConsoleCP(CP_UTF8);
652 SetConsoleOutputCP(CP_UTF8);
653 consoleMode |= ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
654 SetConsoleMode(conState.hConsoleIn, consoleMode);
655 conState.infsMode = _setmode(_fileno(stdin), _O_U16TEXT);
656 console_utf8 = 1;
657 }else{
658 console_utf8 = 0;
659 }
660 }
661
662 /*
663 ** Undo the effects of console_prepare(), if any.
664 */
665 static void SQLITE_CDECL console_restore(void){
666 if( console_utf8 && conState.inCodePage!=0
667 && conState.hConsoleIn!=INVALID_HANDLE_VALUE ){
668 _setmode(_fileno(stdin), conState.infsMode);
669 SetConsoleCP(conState.inCodePage);
670 SetConsoleOutputCP(conState.outCodePage);
671 SetConsoleMode(conState.hConsoleIn, conState.consoleMode);
672 /* Avoid multiple calls. */
673 conState.hConsoleIn = INVALID_HANDLE_VALUE;
674 conState.consoleMode = 0;
675 console_utf8 = 0;
676 }
677 }
678
679 /*
680 ** Collect input like fgets(...) with special provisions for input
681 ** from the Windows console to get around its strange coding issues.
682 ** Defers to plain fgets() when input is not interactive or when the
683 ** startup option, -utf8, has not been provided or taken effect.
684 */
685 static char* utf8_fgets(char *buf, int ncmax, FILE *fin){
686 if( fin==0 ) fin = stdin;
687 if( fin==stdin && stdin_is_interactive && console_utf8 ){
688 # define SQLITE_IALIM 150
689 wchar_t wbuf[SQLITE_IALIM];
690 int lend = 0;
691 int noc = 0;
692 if( ncmax==0 || conState.stdinEof ) return 0;
693 buf[0] = 0;
694 while( noc<ncmax-7-1 && !lend ){
695 /* There is room for at least 2 more characters and a 0-terminator. */
696 int na = (ncmax > SQLITE_IALIM*4+1 + noc)
697 ? SQLITE_IALIM : (ncmax-1 - noc)/4;
698 # undef SQLITE_IALIM
699 DWORD nbr = 0;
700 BOOL bRC = ReadConsoleW(conState.hConsoleIn, wbuf, na, &nbr, 0);
701 if( !bRC || (noc==0 && nbr==0) ) return 0;
702 if( nbr > 0 ){
703 int nmb = WideCharToMultiByte(CP_UTF8,WC_COMPOSITECHECK|WC_DEFAULTCHAR,
704 wbuf,nbr,0,0,0,0);
705 if( nmb !=0 && noc+nmb <= ncmax ){
706 int iseg = noc;
707 nmb = WideCharToMultiByte(CP_UTF8,WC_COMPOSITECHECK|WC_DEFAULTCHAR,
708 wbuf,nbr,buf+noc,nmb,0,0);
709 noc += nmb;
710 /* Fixup line-ends as coded by Windows for CR (or "Enter".)*/
711 if( noc > 0 ){
712 if( buf[noc-1]=='\n' ){
713 lend = 1;
714 if( noc > 1 && buf[noc-2]=='\r' ){
715 buf[noc-2] = '\n';
716 --noc;
717 }
718 }
719 }
720 /* Check for ^Z (anywhere in line) too. */
721 while( iseg < noc ){
722 if( buf[iseg]==0x1a ){
723 conState.stdinEof = 1;
724 noc = iseg; /* Chop ^Z and anything following. */
725 break;
726 }
727 ++iseg;
728 }
729 }else break; /* Drop apparent garbage in. (Could assert.) */
730 }else break;
731 }
732 /* If got nothing, (after ^Z chop), must be at end-of-file. */
733 if( noc == 0 ) return 0;
734 buf[noc] = 0;
735 return buf;
736 }else{
737 return fgets(buf, ncmax, fin);
738 }
739 }
740
741 # define fgets(b,n,f) utf8_fgets(b,n,f)
742 #endif /* SHELL_WIN_UTF8_OPT */
743
744 /*
745 ** Render output like fprintf(). Except, if the output is going to the
746 ** console and if this is running on a Windows machine, and if the -utf8
747 ** option is unavailable or (available and inactive), translate the
748 ** output from UTF-8 into MBCS for output through 8-bit stdout stream.
749 ** (With -utf8 active, no translation is needed and must not be done.)
750 */
751 #if defined(_WIN32) || defined(WIN32)
752 void utf8_printf(FILE *out, const char *zFormat, ...){
753 va_list ap;
754 va_start(ap, zFormat);
755 if( stdout_is_console && (out==stdout || out==stderr)
756 # if SHELL_WIN_UTF8_OPT
757 && !console_utf8
758 # endif
759 ){
760 char *z1 = sqlite3_vmprintf(zFormat, ap);
761 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
762 sqlite3_free(z1);
763 fputs(z2, out);
764 sqlite3_free(z2);
765 }else{
766 vfprintf(out, zFormat, ap);
767 }
768 va_end(ap);
769 }
770 #elif !defined(utf8_printf)
771 # define utf8_printf fprintf
772 #endif
773
774 /*
775 ** Render output like fprintf(). This should not be used on anything that
776 ** includes string formatting (e.g. "%s").
777 */
778 #if !defined(raw_printf)
779 # define raw_printf fprintf
780 #endif
781
782 /* Indicate out-of-memory and exit. */
783 static void shell_out_of_memory(void){
784 raw_printf(stderr,"Error: out of memory\n");
785 exit(1);
786 }
787
788 /* Check a pointer to see if it is NULL. If it is NULL, exit with an
789 ** out-of-memory error.
790 */
791 static void shell_check_oom(const void *p){
792 if( p==0 ) shell_out_of_memory();
793 }
794
795 /*
796 ** Write I/O traces to the following stream.
797 */
798 #ifdef SQLITE_ENABLE_IOTRACE
799 static FILE *iotrace = 0;
800 #endif
801
802 /*
803 ** This routine works like printf in that its first argument is a
804 ** format string and subsequent arguments are values to be substituted
805 ** in place of % fields. The result of formatting this string
806 ** is written to iotrace.
807 */
808 #ifdef SQLITE_ENABLE_IOTRACE
809 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
810 va_list ap;
811 char *z;
812 if( iotrace==0 ) return;
813 va_start(ap, zFormat);
814 z = sqlite3_vmprintf(zFormat, ap);
815 va_end(ap);
816 utf8_printf(iotrace, "%s", z);
817 sqlite3_free(z);
818 }
819 #endif
820
821 /*
822 ** Output string zUtf to stream pOut as w characters. If w is negative,
823 ** then right-justify the text. W is the width in UTF-8 characters, not
824 ** in bytes. This is different from the %*.*s specification in printf
825 ** since with %*.*s the width is measured in bytes, not characters.
826 */
827 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
828 int i;
829 int n;
830 int aw = w<0 ? -w : w;
831 if( zUtf==0 ) zUtf = "";
832 for(i=n=0; zUtf[i]; i++){
833 if( (zUtf[i]&0xc0)!=0x80 ){
834 n++;
835 if( n==aw ){
836 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
837 break;
838 }
839 }
840 }
841 if( n>=aw ){
842 utf8_printf(pOut, "%.*s", i, zUtf);
843 }else if( w<0 ){
844 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
845 }else{
846 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
847 }
848 }
849
850
851 /*
852 ** Determines if a string is a number of not.
853 */
854 static int isNumber(const char *z, int *realnum){
855 if( *z=='-' || *z=='+' ) z++;
856 if( !IsDigit(*z) ){
857 return 0;
858 }
859 z++;
860 if( realnum ) *realnum = 0;
861 while( IsDigit(*z) ){ z++; }
862 if( *z=='.' ){
863 z++;
864 if( !IsDigit(*z) ) return 0;
865 while( IsDigit(*z) ){ z++; }
866 if( realnum ) *realnum = 1;
867 }
868 if( *z=='e' || *z=='E' ){
869 z++;
870 if( *z=='+' || *z=='-' ) z++;
871 if( !IsDigit(*z) ) return 0;
872 while( IsDigit(*z) ){ z++; }
873 if( realnum ) *realnum = 1;
874 }
875 return *z==0;
876 }
877
878 /*
879 ** Compute a string length that is limited to what can be stored in
880 ** lower 30 bits of a 32-bit signed integer.
881 */
882 static int strlen30(const char *z){
883 const char *z2 = z;
884 while( *z2 ){ z2++; }
885 return 0x3fffffff & (int)(z2 - z);
886 }
887
888 /*
889 ** Return the length of a string in characters. Multibyte UTF8 characters
890 ** count as a single character.
891 */
892 static int strlenChar(const char *z){
893 int n = 0;
894 while( *z ){
895 if( (0xc0&*(z++))!=0x80 ) n++;
896 }
897 return n;
898 }
899
900 /*
901 ** Return open FILE * if zFile exists, can be opened for read
902 ** and is an ordinary file or a character stream source.
903 ** Otherwise return 0.
904 */
905 static FILE * openChrSource(const char *zFile){
906 #ifdef _WIN32
907 struct _stat x = {0};
908 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
909 /* On Windows, open first, then check the stream nature. This order
910 ** is necessary because _stat() and sibs, when checking a named pipe,
911 ** effectively break the pipe as its supplier sees it. */
912 FILE *rv = fopen(zFile, "rb");
913 if( rv==0 ) return 0;
914 if( _fstat(_fileno(rv), &x) != 0
915 || !STAT_CHR_SRC(x.st_mode)){
916 fclose(rv);
917 rv = 0;
918 }
919 return rv;
920 #else
921 struct stat x = {0};
922 int rc = stat(zFile, &x);
923 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
924 if( rc!=0 ) return 0;
925 if( STAT_CHR_SRC(x.st_mode) ){
926 return fopen(zFile, "rb");
927 }else{
928 return 0;
929 }
930 #endif
931 #undef STAT_CHR_SRC
932 }
933
934 /*
935 ** This routine reads a line of text from FILE in, stores
936 ** the text in memory obtained from malloc() and returns a pointer
937 ** to the text. NULL is returned at end of file, or if malloc()
938 ** fails.
939 **
940 ** If zLine is not NULL then it is a malloced buffer returned from
941 ** a previous call to this routine that may be reused.
942 */
943 static char *local_getline(char *zLine, FILE *in){
944 int nLine = zLine==0 ? 0 : 100;
945 int n = 0;
946
947 while( 1 ){
948 if( n+100>nLine ){
949 nLine = nLine*2 + 100;
950 zLine = realloc(zLine, nLine);
951 shell_check_oom(zLine);
952 }
953 if( fgets(&zLine[n], nLine - n, in)==0 ){
954 if( n==0 ){
955 free(zLine);
956 return 0;
957 }
958 zLine[n] = 0;
959 break;
960 }
961 while( zLine[n] ) n++;
962 if( n>0 && zLine[n-1]=='\n' ){
963 n--;
964 if( n>0 && zLine[n-1]=='\r' ) n--;
965 zLine[n] = 0;
966 break;
967 }
968 }
969 #if defined(_WIN32) || defined(WIN32)
970 /* For interactive input on Windows systems, without -utf8,
971 ** translate the multi-byte characterset characters into UTF-8.
972 ** This is the translation that predates the -utf8 option. */
973 if( stdin_is_interactive && in==stdin
974 # if SHELL_WIN_UTF8_OPT
975 && !console_utf8
976 # endif /* SHELL_WIN_UTF8_OPT */
977 ){
978 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
979 if( zTrans ){
980 i64 nTrans = strlen(zTrans)+1;
981 if( nTrans>nLine ){
982 zLine = realloc(zLine, nTrans);
983 shell_check_oom(zLine);
984 }
985 memcpy(zLine, zTrans, nTrans);
986 sqlite3_free(zTrans);
987 }
988 }
989 #endif /* defined(_WIN32) || defined(WIN32) */
990 return zLine;
991 }
992
993 /*
994 ** Retrieve a single line of input text.
995 **
996 ** If in==0 then read from standard input and prompt before each line.
997 ** If isContinuation is true, then a continuation prompt is appropriate.
998 ** If isContinuation is zero, then the main prompt should be used.
999 **
1000 ** If zPrior is not NULL then it is a buffer from a prior call to this
1001 ** routine that can be reused.
1002 **
1003 ** The result is stored in space obtained from malloc() and must either
1004 ** be freed by the caller or else passed back into this routine via the
1005 ** zPrior argument for reuse.
1006 */
1007 #ifndef SQLITE_SHELL_FIDDLE
1008 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
1009 char *zPrompt;
1010 char *zResult;
1011 if( in!=0 ){
1012 zResult = local_getline(zPrior, in);
1013 }else{
1014 zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
1015 #if SHELL_USE_LOCAL_GETLINE
1016 printf("%s", zPrompt);
1017 fflush(stdout);
1018 do{
1019 zResult = local_getline(zPrior, stdin);
1020 zPrior = 0;
1021 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1022 if( zResult==0 ) sqlite3_sleep(50);
1023 }while( zResult==0 && seenInterrupt>0 );
1024 #else
1025 free(zPrior);
1026 zResult = shell_readline(zPrompt);
1027 while( zResult==0 ){
1028 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1029 sqlite3_sleep(50);
1030 if( seenInterrupt==0 ) break;
1031 zResult = shell_readline("");
1032 }
1033 if( zResult && *zResult ) shell_add_history(zResult);
1034 #endif
1035 }
1036 return zResult;
1037 }
1038 #endif /* !SQLITE_SHELL_FIDDLE */
1039
1040 /*
1041 ** Return the value of a hexadecimal digit. Return -1 if the input
1042 ** is not a hex digit.
1043 */
1044 static int hexDigitValue(char c){
1045 if( c>='0' && c<='9' ) return c - '0';
1046 if( c>='a' && c<='f' ) return c - 'a' + 10;
1047 if( c>='A' && c<='F' ) return c - 'A' + 10;
1048 return -1;
1049 }
1050
1051 /*
1052 ** Interpret zArg as an integer value, possibly with suffixes.
1053 */
1054 static sqlite3_int64 integerValue(const char *zArg){
1055 sqlite3_int64 v = 0;
1056 static const struct { char *zSuffix; int iMult; } aMult[] = {
1057 { "KiB", 1024 },
1058 { "MiB", 1024*1024 },
1059 { "GiB", 1024*1024*1024 },
1060 { "KB", 1000 },
1061 { "MB", 1000000 },
1062 { "GB", 1000000000 },
1063 { "K", 1000 },
1064 { "M", 1000000 },
1065 { "G", 1000000000 },
1066 };
1067 int i;
1068 int isNeg = 0;
1069 if( zArg[0]=='-' ){
1070 isNeg = 1;
1071 zArg++;
1072 }else if( zArg[0]=='+' ){
1073 zArg++;
1074 }
1075 if( zArg[0]=='0' && zArg[1]=='x' ){
1076 int x;
1077 zArg += 2;
1078 while( (x = hexDigitValue(zArg[0]))>=0 ){
1079 v = (v<<4) + x;
1080 zArg++;
1081 }
1082 }else{
1083 while( IsDigit(zArg[0]) ){
1084 v = v*10 + zArg[0] - '0';
1085 zArg++;
1086 }
1087 }
1088 for(i=0; i<ArraySize(aMult); i++){
1089 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1090 v *= aMult[i].iMult;
1091 break;
1092 }
1093 }
1094 return isNeg? -v : v;
1095 }
1096
1097 /*
1098 ** A variable length string to which one can append text.
1099 */
1100 typedef struct ShellText ShellText;
1101 struct ShellText {
1102 char *z;
1103 int n;
1104 int nAlloc;
1105 };
1106
1107 /*
1108 ** Initialize and destroy a ShellText object
1109 */
1110 static void initText(ShellText *p){
1111 memset(p, 0, sizeof(*p));
1112 }
1113 static void freeText(ShellText *p){
1114 free(p->z);
1115 initText(p);
1116 }
1117
1118 /* zIn is either a pointer to a NULL-terminated string in memory obtained
1119 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1120 ** added to zIn, and the result returned in memory obtained from malloc().
1121 ** zIn, if it was not NULL, is freed.
1122 **
1123 ** If the third argument, quote, is not '\0', then it is used as a
1124 ** quote character for zAppend.
1125 */
1126 static void appendText(ShellText *p, const char *zAppend, char quote){
1127 i64 len;
1128 i64 i;
1129 i64 nAppend = strlen30(zAppend);
1130
1131 len = nAppend+p->n+1;
1132 if( quote ){
1133 len += 2;
1134 for(i=0; i<nAppend; i++){
1135 if( zAppend[i]==quote ) len++;
1136 }
1137 }
1138
1139 if( p->z==0 || p->n+len>=p->nAlloc ){
1140 p->nAlloc = p->nAlloc*2 + len + 20;
1141 p->z = realloc(p->z, p->nAlloc);
1142 shell_check_oom(p->z);
1143 }
1144
1145 if( quote ){
1146 char *zCsr = p->z+p->n;
1147 *zCsr++ = quote;
1148 for(i=0; i<nAppend; i++){
1149 *zCsr++ = zAppend[i];
1150 if( zAppend[i]==quote ) *zCsr++ = quote;
1151 }
1152 *zCsr++ = quote;
1153 p->n = (int)(zCsr - p->z);
1154 *zCsr = '\0';
1155 }else{
1156 memcpy(p->z+p->n, zAppend, nAppend);
1157 p->n += nAppend;
1158 p->z[p->n] = '\0';
1159 }
1160 }
1161
1162 /*
1163 ** Attempt to determine if identifier zName needs to be quoted, either
1164 ** because it contains non-alphanumeric characters, or because it is an
1165 ** SQLite keyword. Be conservative in this estimate: When in doubt assume
1166 ** that quoting is required.
1167 **
1168 ** Return '"' if quoting is required. Return 0 if no quoting is required.
1169 */
1170 static char quoteChar(const char *zName){
1171 int i;
1172 if( zName==0 ) return '"';
1173 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
1174 for(i=0; zName[i]; i++){
1175 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
1176 }
1177 return sqlite3_keyword_check(zName, i) ? '"' : 0;
1178 }
1179
1180 /*
1181 ** Construct a fake object name and column list to describe the structure
1182 ** of the view, virtual table, or table valued function zSchema.zName.
1183 */
1184 static char *shellFakeSchema(
1185 sqlite3 *db, /* The database connection containing the vtab */
1186 const char *zSchema, /* Schema of the database holding the vtab */
1187 const char *zName /* The name of the virtual table */
1188 ){
1189 sqlite3_stmt *pStmt = 0;
1190 char *zSql;
1191 ShellText s;
1192 char cQuote;
1193 char *zDiv = "(";
1194 int nRow = 0;
1195
1196 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
1197 zSchema ? zSchema : "main", zName);
1198 shell_check_oom(zSql);
1199 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
1200 sqlite3_free(zSql);
1201 initText(&s);
1202 if( zSchema ){
1203 cQuote = quoteChar(zSchema);
1204 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
1205 appendText(&s, zSchema, cQuote);
1206 appendText(&s, ".", 0);
1207 }
1208 cQuote = quoteChar(zName);
1209 appendText(&s, zName, cQuote);
1210 while( sqlite3_step(pStmt)==SQLITE_ROW ){
1211 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
1212 nRow++;
1213 appendText(&s, zDiv, 0);
1214 zDiv = ",";
1215 if( zCol==0 ) zCol = "";
1216 cQuote = quoteChar(zCol);
1217 appendText(&s, zCol, cQuote);
1218 }
1219 appendText(&s, ")", 0);
1220 sqlite3_finalize(pStmt);
1221 if( nRow==0 ){
1222 freeText(&s);
1223 s.z = 0;
1224 }
1225 return s.z;
1226 }
1227
1228 /*
1229 ** SQL function: strtod(X)
1230 **
1231 ** Use the C-library strtod() function to convert string X into a double.
1232 ** Used for comparing the accuracy of SQLite's internal text-to-float conversion
1233 ** routines against the C-library.
1234 */
1235 static void shellStrtod(
1236 sqlite3_context *pCtx,
1237 int nVal,
1238 sqlite3_value **apVal
1239 ){
1240 char *z = (char*)sqlite3_value_text(apVal[0]);
1241 UNUSED_PARAMETER(nVal);
1242 if( z==0 ) return;
1243 sqlite3_result_double(pCtx, strtod(z,0));
1244 }
1245
1246 /*
1247 ** SQL function: dtostr(X)
1248 **
1249 ** Use the C-library printf() function to convert real value X into a string.
1250 ** Used for comparing the accuracy of SQLite's internal float-to-text conversion
1251 ** routines against the C-library.
1252 */
1253 static void shellDtostr(
1254 sqlite3_context *pCtx,
1255 int nVal,
1256 sqlite3_value **apVal
1257 ){
1258 double r = sqlite3_value_double(apVal[0]);
1259 int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
1260 char z[400];
1261 if( n<1 ) n = 1;
1262 if( n>350 ) n = 350;
1263 sprintf(z, "%#+.*e", n, r);
1264 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
1265 }
1266
1267
1268 /*
1269 ** SQL function: shell_module_schema(X)
1270 **
1271 ** Return a fake schema for the table-valued function or eponymous virtual
1272 ** table X.
1273 */
1274 static void shellModuleSchema(
1275 sqlite3_context *pCtx,
1276 int nVal,
1277 sqlite3_value **apVal
1278 ){
1279 const char *zName;
1280 char *zFake;
1281 UNUSED_PARAMETER(nVal);
1282 zName = (const char*)sqlite3_value_text(apVal[0]);
1283 zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
1284 if( zFake ){
1285 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
1286 -1, sqlite3_free);
1287 free(zFake);
1288 }
1289 }
1290
1291 /*
1292 ** SQL function: shell_add_schema(S,X)
1293 **
1294 ** Add the schema name X to the CREATE statement in S and return the result.
1295 ** Examples:
1296 **
1297 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
1298 **
1299 ** Also works on
1300 **
1301 ** CREATE INDEX
1302 ** CREATE UNIQUE INDEX
1303 ** CREATE VIEW
1304 ** CREATE TRIGGER
1305 ** CREATE VIRTUAL TABLE
1306 **
1307 ** This UDF is used by the .schema command to insert the schema name of
1308 ** attached databases into the middle of the sqlite_schema.sql field.
1309 */
1310 static void shellAddSchemaName(
1311 sqlite3_context *pCtx,
1312 int nVal,
1313 sqlite3_value **apVal
1314 ){
1315 static const char *aPrefix[] = {
1316 "TABLE",
1317 "INDEX",
1318 "UNIQUE INDEX",
1319 "VIEW",
1320 "TRIGGER",
1321 "VIRTUAL TABLE"
1322 };
1323 int i = 0;
1324 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
1325 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
1326 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
1327 sqlite3 *db = sqlite3_context_db_handle(pCtx);
1328 UNUSED_PARAMETER(nVal);
1329 if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
1330 for(i=0; i<ArraySize(aPrefix); i++){
1331 int n = strlen30(aPrefix[i]);
1332 if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
1333 char *z = 0;
1334 char *zFake = 0;
1335 if( zSchema ){
1336 char cQuote = quoteChar(zSchema);
1337 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
1338 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1339 }else{
1340 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1341 }
1342 }
1343 if( zName
1344 && aPrefix[i][0]=='V'
1345 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1346 ){
1347 if( z==0 ){
1348 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1349 }else{
1350 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1351 }
1352 free(zFake);
1353 }
1354 if( z ){
1355 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
1356 return;
1357 }
1358 }
1359 }
1360 }
1361 sqlite3_result_value(pCtx, apVal[0]);
1362 }
1363
1364 /*
1365 ** The source code for several run-time loadable extensions is inserted
1366 ** below by the ../tool/mkshellc.tcl script. Before processing that included
1367 ** code, we need to override some macros to make the included program code
1368 ** work here in the middle of this regular program.
1369 */
1370 #define SQLITE_EXTENSION_INIT1
1371 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
1372
1373 #if defined(_WIN32) && defined(_MSC_VER)
1374 /************************* Begin test_windirent.h ******************/
1375 /*
1376 ** 2015 November 30
1377 **
1378 ** The author disclaims copyright to this source code. In place of
1379 ** a legal notice, here is a blessing:
1380 **
1381 ** May you do good and not evil.
1382 ** May you find forgiveness for yourself and forgive others.
1383 ** May you share freely, never taking more than you give.
1384 **
1385 *************************************************************************
1386 ** This file contains declarations for most of the opendir() family of
1387 ** POSIX functions on Win32 using the MSVCRT.
1388 */
1389
1390 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
1391 #define SQLITE_WINDIRENT_H
1392
1393 /*
1394 ** We need several data types from the Windows SDK header.
1395 */
1396
1397 #ifndef WIN32_LEAN_AND_MEAN
1398 #define WIN32_LEAN_AND_MEAN
1399 #endif
1400
1401 #include "windows.h"
1402
1403 /*
1404 ** We need several support functions from the SQLite core.
1405 */
1406
1407 /* #include "sqlite3.h" */
1408
1409 /*
1410 ** We need several things from the ANSI and MSVCRT headers.
1411 */
1412
1413 #include <stdio.h>
1414 #include <stdlib.h>
1415 #include <errno.h>
1416 #include <io.h>
1417 #include <limits.h>
1418 #include <sys/types.h>
1419 #include <sys/stat.h>
1420
1421 /*
1422 ** We may need several defines that should have been in "sys/stat.h".
1423 */
1424
1425 #ifndef S_ISREG
1426 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1427 #endif
1428
1429 #ifndef S_ISDIR
1430 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1431 #endif
1432
1433 #ifndef S_ISLNK
1434 #define S_ISLNK(mode) (0)
1435 #endif
1436
1437 /*
1438 ** We may need to provide the "mode_t" type.
1439 */
1440
1441 #ifndef MODE_T_DEFINED
1442 #define MODE_T_DEFINED
1443 typedef unsigned short mode_t;
1444 #endif
1445
1446 /*
1447 ** We may need to provide the "ino_t" type.
1448 */
1449
1450 #ifndef INO_T_DEFINED
1451 #define INO_T_DEFINED
1452 typedef unsigned short ino_t;
1453 #endif
1454
1455 /*
1456 ** We need to define "NAME_MAX" if it was not present in "limits.h".
1457 */
1458
1459 #ifndef NAME_MAX
1460 # ifdef FILENAME_MAX
1461 # define NAME_MAX (FILENAME_MAX)
1462 # else
1463 # define NAME_MAX (260)
1464 # endif
1465 #endif
1466
1467 /*
1468 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1469 */
1470
1471 #ifndef NULL_INTPTR_T
1472 # define NULL_INTPTR_T ((intptr_t)(0))
1473 #endif
1474
1475 #ifndef BAD_INTPTR_T
1476 # define BAD_INTPTR_T ((intptr_t)(-1))
1477 #endif
1478
1479 /*
1480 ** We need to provide the necessary structures and related types.
1481 */
1482
1483 #ifndef DIRENT_DEFINED
1484 #define DIRENT_DEFINED
1485 typedef struct DIRENT DIRENT;
1486 typedef DIRENT *LPDIRENT;
1487 struct DIRENT {
1488 ino_t d_ino; /* Sequence number, do not use. */
1489 unsigned d_attributes; /* Win32 file attributes. */
1490 char d_name[NAME_MAX + 1]; /* Name within the directory. */
1491 };
1492 #endif
1493
1494 #ifndef DIR_DEFINED
1495 #define DIR_DEFINED
1496 typedef struct DIR DIR;
1497 typedef DIR *LPDIR;
1498 struct DIR {
1499 intptr_t d_handle; /* Value returned by "_findfirst". */
1500 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */
1501 DIRENT d_next; /* DIRENT constructed based on "_findnext". */
1502 };
1503 #endif
1504
1505 /*
1506 ** Provide a macro, for use by the implementation, to determine if a
1507 ** particular directory entry should be skipped over when searching for
1508 ** the next directory entry that should be returned by the readdir() or
1509 ** readdir_r() functions.
1510 */
1511
1512 #ifndef is_filtered
1513 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1514 #endif
1515
1516 /*
1517 ** Provide the function prototype for the POSIX compatible getenv()
1518 ** function. This function is not thread-safe.
1519 */
1520
1521 extern const char *windirent_getenv(const char *name);
1522
1523 /*
1524 ** Finally, we can provide the function prototypes for the opendir(),
1525 ** readdir(), readdir_r(), and closedir() POSIX functions.
1526 */
1527
1528 extern LPDIR opendir(const char *dirname);
1529 extern LPDIRENT readdir(LPDIR dirp);
1530 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1531 extern INT closedir(LPDIR dirp);
1532
1533 #endif /* defined(WIN32) && defined(_MSC_VER) */
1534
1535 /************************* End test_windirent.h ********************/
1536 /************************* Begin test_windirent.c ******************/
1537 /*
1538 ** 2015 November 30
1539 **
1540 ** The author disclaims copyright to this source code. In place of
1541 ** a legal notice, here is a blessing:
1542 **
1543 ** May you do good and not evil.
1544 ** May you find forgiveness for yourself and forgive others.
1545 ** May you share freely, never taking more than you give.
1546 **
1547 *************************************************************************
1548 ** This file contains code to implement most of the opendir() family of
1549 ** POSIX functions on Win32 using the MSVCRT.
1550 */
1551
1552 #if defined(_WIN32) && defined(_MSC_VER)
1553 /* #include "test_windirent.h" */
1554
1555 /*
1556 ** Implementation of the POSIX getenv() function using the Win32 API.
1557 ** This function is not thread-safe.
1558 */
1559 const char *windirent_getenv(
1560 const char *name
1561 ){
1562 static char value[32768]; /* Maximum length, per MSDN */
1563 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1564 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1565
1566 memset(value, 0, sizeof(value));
1567 dwRet = GetEnvironmentVariableA(name, value, dwSize);
1568 if( dwRet==0 || dwRet>dwSize ){
1569 /*
1570 ** The function call to GetEnvironmentVariableA() failed -OR-
1571 ** the buffer is not large enough. Either way, return NULL.
1572 */
1573 return 0;
1574 }else{
1575 /*
1576 ** The function call to GetEnvironmentVariableA() succeeded
1577 ** -AND- the buffer contains the entire value.
1578 */
1579 return value;
1580 }
1581 }
1582
1583 /*
1584 ** Implementation of the POSIX opendir() function using the MSVCRT.
1585 */
1586 LPDIR opendir(
1587 const char *dirname
1588 ){
1589 struct _finddata_t data;
1590 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1591 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1592
1593 if( dirp==NULL ) return NULL;
1594 memset(dirp, 0, sizeof(DIR));
1595
1596 /* TODO: Remove this if Unix-style root paths are not used. */
1597 if( sqlite3_stricmp(dirname, "/")==0 ){
1598 dirname = windirent_getenv("SystemDrive");
1599 }
1600
1601 memset(&data, 0, sizeof(struct _finddata_t));
1602 _snprintf(data.name, namesize, "%s\\*", dirname);
1603 dirp->d_handle = _findfirst(data.name, &data);
1604
1605 if( dirp->d_handle==BAD_INTPTR_T ){
1606 closedir(dirp);
1607 return NULL;
1608 }
1609
1610 /* TODO: Remove this block to allow hidden and/or system files. */
1611 if( is_filtered(data) ){
1612 next:
1613
1614 memset(&data, 0, sizeof(struct _finddata_t));
1615 if( _findnext(dirp->d_handle, &data)==-1 ){
1616 closedir(dirp);
1617 return NULL;
1618 }
1619
1620 /* TODO: Remove this block to allow hidden and/or system files. */
1621 if( is_filtered(data) ) goto next;
1622 }
1623
1624 dirp->d_first.d_attributes = data.attrib;
1625 strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1626 dirp->d_first.d_name[NAME_MAX] = '\0';
1627
1628 return dirp;
1629 }
1630
1631 /*
1632 ** Implementation of the POSIX readdir() function using the MSVCRT.
1633 */
1634 LPDIRENT readdir(
1635 LPDIR dirp
1636 ){
1637 struct _finddata_t data;
1638
1639 if( dirp==NULL ) return NULL;
1640
1641 if( dirp->d_first.d_ino==0 ){
1642 dirp->d_first.d_ino++;
1643 dirp->d_next.d_ino++;
1644
1645 return &dirp->d_first;
1646 }
1647
1648 next:
1649
1650 memset(&data, 0, sizeof(struct _finddata_t));
1651 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1652
1653 /* TODO: Remove this block to allow hidden and/or system files. */
1654 if( is_filtered(data) ) goto next;
1655
1656 dirp->d_next.d_ino++;
1657 dirp->d_next.d_attributes = data.attrib;
1658 strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1659 dirp->d_next.d_name[NAME_MAX] = '\0';
1660
1661 return &dirp->d_next;
1662 }
1663
1664 /*
1665 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
1666 */
1667 INT readdir_r(
1668 LPDIR dirp,
1669 LPDIRENT entry,
1670 LPDIRENT *result
1671 ){
1672 struct _finddata_t data;
1673
1674 if( dirp==NULL ) return EBADF;
1675
1676 if( dirp->d_first.d_ino==0 ){
1677 dirp->d_first.d_ino++;
1678 dirp->d_next.d_ino++;
1679
1680 entry->d_ino = dirp->d_first.d_ino;
1681 entry->d_attributes = dirp->d_first.d_attributes;
1682 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1683 entry->d_name[NAME_MAX] = '\0';
1684
1685 *result = entry;
1686 return 0;
1687 }
1688
1689 next:
1690
1691 memset(&data, 0, sizeof(struct _finddata_t));
1692 if( _findnext(dirp->d_handle, &data)==-1 ){
1693 *result = NULL;
1694 return ENOENT;
1695 }
1696
1697 /* TODO: Remove this block to allow hidden and/or system files. */
1698 if( is_filtered(data) ) goto next;
1699
1700 entry->d_ino = (ino_t)-1; /* not available */
1701 entry->d_attributes = data.attrib;
1702 strncpy(entry->d_name, data.name, NAME_MAX);
1703 entry->d_name[NAME_MAX] = '\0';
1704
1705 *result = entry;
1706 return 0;
1707 }
1708
1709 /*
1710 ** Implementation of the POSIX closedir() function using the MSVCRT.
1711 */
1712 INT closedir(
1713 LPDIR dirp
1714 ){
1715 INT result = 0;
1716
1717 if( dirp==NULL ) return EINVAL;
1718
1719 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1720 result = _findclose(dirp->d_handle);
1721 }
1722
1723 sqlite3_free(dirp);
1724 return result;
1725 }
1726
1727 #endif /* defined(WIN32) && defined(_MSC_VER) */
1728
1729 /************************* End test_windirent.c ********************/
1730 #define dirent DIRENT
1731 #endif
1732 /************************* Begin ../ext/misc/memtrace.c ******************/
1733 /*
1734 ** 2019-01-21
1735 **
1736 ** The author disclaims copyright to this source code. In place of
1737 ** a legal notice, here is a blessing:
1738 **
1739 ** May you do good and not evil.
1740 ** May you find forgiveness for yourself and forgive others.
1741 ** May you share freely, never taking more than you give.
1742 **
1743 *************************************************************************
1744 **
1745 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
1746 ** mechanism to add a tracing layer on top of SQLite. If this extension
1747 ** is registered prior to sqlite3_initialize(), it will cause all memory
1748 ** allocation activities to be logged on standard output, or to some other
1749 ** FILE specified by the initializer.
1750 **
1751 ** This file needs to be compiled into the application that uses it.
1752 **
1753 ** This extension is used to implement the --memtrace option of the
1754 ** command-line shell.
1755 */
1756 #include <assert.h>
1757 #include <string.h>
1758 #include <stdio.h>
1759
1760 /* The original memory allocation routines */
1761 static sqlite3_mem_methods memtraceBase;
1762 static FILE *memtraceOut;
1763
1764 /* Methods that trace memory allocations */
1765 static void *memtraceMalloc(int n){
1766 if( memtraceOut ){
1767 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
1768 memtraceBase.xRoundup(n));
1769 }
1770 return memtraceBase.xMalloc(n);
1771 }
1772 static void memtraceFree(void *p){
1773 if( p==0 ) return;
1774 if( memtraceOut ){
1775 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
1776 }
1777 memtraceBase.xFree(p);
1778 }
1779 static void *memtraceRealloc(void *p, int n){
1780 if( p==0 ) return memtraceMalloc(n);
1781 if( n==0 ){
1782 memtraceFree(p);
1783 return 0;
1784 }
1785 if( memtraceOut ){
1786 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
1787 memtraceBase.xSize(p), memtraceBase.xRoundup(n));
1788 }
1789 return memtraceBase.xRealloc(p, n);
1790 }
1791 static int memtraceSize(void *p){
1792 return memtraceBase.xSize(p);
1793 }
1794 static int memtraceRoundup(int n){
1795 return memtraceBase.xRoundup(n);
1796 }
1797 static int memtraceInit(void *p){
1798 return memtraceBase.xInit(p);
1799 }
1800 static void memtraceShutdown(void *p){
1801 memtraceBase.xShutdown(p);
1802 }
1803
1804 /* The substitute memory allocator */
1805 static sqlite3_mem_methods ersaztMethods = {
1806 memtraceMalloc,
1807 memtraceFree,
1808 memtraceRealloc,
1809 memtraceSize,
1810 memtraceRoundup,
1811 memtraceInit,
1812 memtraceShutdown,
1813 0
1814 };
1815
1816 /* Begin tracing memory allocations to out. */
1817 int sqlite3MemTraceActivate(FILE *out){
1818 int rc = SQLITE_OK;
1819 if( memtraceBase.xMalloc==0 ){
1820 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
1821 if( rc==SQLITE_OK ){
1822 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
1823 }
1824 }
1825 memtraceOut = out;
1826 return rc;
1827 }
1828
1829 /* Deactivate memory tracing */
1830 int sqlite3MemTraceDeactivate(void){
1831 int rc = SQLITE_OK;
1832 if( memtraceBase.xMalloc!=0 ){
1833 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
1834 if( rc==SQLITE_OK ){
1835 memset(&memtraceBase, 0, sizeof(memtraceBase));
1836 }
1837 }
1838 memtraceOut = 0;
1839 return rc;
1840 }
1841
1842 /************************* End ../ext/misc/memtrace.c ********************/
1843 /************************* Begin ../ext/misc/pcachetrace.c ******************/
1844 /*
1845 ** 2023-06-21
1846 **
1847 ** The author disclaims copyright to this source code. In place of
1848 ** a legal notice, here is a blessing:
1849 **
1850 ** May you do good and not evil.
1851 ** May you find forgiveness for yourself and forgive others.
1852 ** May you share freely, never taking more than you give.
1853 **
1854 *************************************************************************
1855 **
1856 ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
1857 ** mechanism to add a tracing layer on top of pluggable page cache of
1858 ** SQLite. If this extension is registered prior to sqlite3_initialize(),
1859 ** it will cause all page cache activities to be logged on standard output,
1860 ** or to some other FILE specified by the initializer.
1861 **
1862 ** This file needs to be compiled into the application that uses it.
1863 **
1864 ** This extension is used to implement the --pcachetrace option of the
1865 ** command-line shell.
1866 */
1867 #include <assert.h>
1868 #include <string.h>
1869 #include <stdio.h>
1870
1871 /* The original page cache routines */
1872 static sqlite3_pcache_methods2 pcacheBase;
1873 static FILE *pcachetraceOut;
1874
1875 /* Methods that trace pcache activity */
1876 static int pcachetraceInit(void *pArg){
1877 int nRes;
1878 if( pcachetraceOut ){
1879 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
1880 }
1881 nRes = pcacheBase.xInit(pArg);
1882 if( pcachetraceOut ){
1883 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
1884 }
1885 return nRes;
1886 }
1887 static void pcachetraceShutdown(void *pArg){
1888 if( pcachetraceOut ){
1889 fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
1890 }
1891 pcacheBase.xShutdown(pArg);
1892 }
1893 static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
1894 sqlite3_pcache *pRes;
1895 if( pcachetraceOut ){
1896 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
1897 szPage, szExtra, bPurge);
1898 }
1899 pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
1900 if( pcachetraceOut ){
1901 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
1902 szPage, szExtra, bPurge, pRes);
1903 }
1904 return pRes;
1905 }
1906 static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
1907 if( pcachetraceOut ){
1908 fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
1909 }
1910 pcacheBase.xCachesize(p, nCachesize);
1911 }
1912 static int pcachetracePagecount(sqlite3_pcache *p){
1913 int nRes;
1914 if( pcachetraceOut ){
1915 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
1916 }
1917 nRes = pcacheBase.xPagecount(p);
1918 if( pcachetraceOut ){
1919 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
1920 }
1921 return nRes;
1922 }
1923 static sqlite3_pcache_page *pcachetraceFetch(
1924 sqlite3_pcache *p,
1925 unsigned key,
1926 int crFg
1927 ){
1928 sqlite3_pcache_page *pRes;
1929 if( pcachetraceOut ){
1930 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
1931 }
1932 pRes = pcacheBase.xFetch(p, key, crFg);
1933 if( pcachetraceOut ){
1934 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
1935 p, key, crFg, pRes);
1936 }
1937 return pRes;
1938 }
1939 static void pcachetraceUnpin(
1940 sqlite3_pcache *p,
1941 sqlite3_pcache_page *pPg,
1942 int bDiscard
1943 ){
1944 if( pcachetraceOut ){
1945 fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
1946 p, pPg, bDiscard);
1947 }
1948 pcacheBase.xUnpin(p, pPg, bDiscard);
1949 }
1950 static void pcachetraceRekey(
1951 sqlite3_pcache *p,
1952 sqlite3_pcache_page *pPg,
1953 unsigned oldKey,
1954 unsigned newKey
1955 ){
1956 if( pcachetraceOut ){
1957 fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
1958 p, pPg, oldKey, newKey);
1959 }
1960 pcacheBase.xRekey(p, pPg, oldKey, newKey);
1961 }
1962 static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
1963 if( pcachetraceOut ){
1964 fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
1965 }
1966 pcacheBase.xTruncate(p, n);
1967 }
1968 static void pcachetraceDestroy(sqlite3_pcache *p){
1969 if( pcachetraceOut ){
1970 fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
1971 }
1972 pcacheBase.xDestroy(p);
1973 }
1974 static void pcachetraceShrink(sqlite3_pcache *p){
1975 if( pcachetraceOut ){
1976 fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
1977 }
1978 pcacheBase.xShrink(p);
1979 }
1980
1981 /* The substitute pcache methods */
1982 static sqlite3_pcache_methods2 ersaztPcacheMethods = {
1983 0,
1984 0,
1985 pcachetraceInit,
1986 pcachetraceShutdown,
1987 pcachetraceCreate,
1988 pcachetraceCachesize,
1989 pcachetracePagecount,
1990 pcachetraceFetch,
1991 pcachetraceUnpin,
1992 pcachetraceRekey,
1993 pcachetraceTruncate,
1994 pcachetraceDestroy,
1995 pcachetraceShrink
1996 };
1997
1998 /* Begin tracing memory allocations to out. */
1999 int sqlite3PcacheTraceActivate(FILE *out){
2000 int rc = SQLITE_OK;
2001 if( pcacheBase.xFetch==0 ){
2002 rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase);
2003 if( rc==SQLITE_OK ){
2004 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods);
2005 }
2006 }
2007 pcachetraceOut = out;
2008 return rc;
2009 }
2010
2011 /* Deactivate memory tracing */
2012 int sqlite3PcacheTraceDeactivate(void){
2013 int rc = SQLITE_OK;
2014 if( pcacheBase.xFetch!=0 ){
2015 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase);
2016 if( rc==SQLITE_OK ){
2017 memset(&pcacheBase, 0, sizeof(pcacheBase));
2018 }
2019 }
2020 pcachetraceOut = 0;
2021 return rc;
2022 }
2023
2024 /************************* End ../ext/misc/pcachetrace.c ********************/
2025 /************************* Begin ../ext/misc/shathree.c ******************/
2026 /*
2027 ** 2017-03-08
2028 **
2029 ** The author disclaims copyright to this source code. In place of
2030 ** a legal notice, here is a blessing:
2031 **
2032 ** May you do good and not evil.
2033 ** May you find forgiveness for yourself and forgive others.
2034 ** May you share freely, never taking more than you give.
2035 **
2036 ******************************************************************************
2037 **
2038 ** This SQLite extension implements functions that compute SHA3 hashes
2039 ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
2040 ** Two SQL functions are implemented:
2041 **
2042 ** sha3(X,SIZE)
2043 ** sha3_query(Y,SIZE)
2044 **
2045 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
2046 ** X is NULL.
2047 **
2048 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
2049 ** and returns a hash of their results.
2050 **
2051 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm
2052 ** is used. If SIZE is included it must be one of the integers 224, 256,
2053 ** 384, or 512, to determine SHA3 hash variant that is computed.
2054 */
2055 /* #include "sqlite3ext.h" */
2056 SQLITE_EXTENSION_INIT1
2057 #include <assert.h>
2058 #include <string.h>
2059 #include <stdarg.h>
2060
2061 #ifndef SQLITE_AMALGAMATION
2062 /* typedef sqlite3_uint64 u64; */
2063 #endif /* SQLITE_AMALGAMATION */
2064
2065 /******************************************************************************
2066 ** The Hash Engine
2067 */
2068 /*
2069 ** Macros to determine whether the machine is big or little endian,
2070 ** and whether or not that determination is run-time or compile-time.
2071 **
2072 ** For best performance, an attempt is made to guess at the byte-order
2073 ** using C-preprocessor macros. If that is unsuccessful, or if
2074 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
2075 ** at run-time.
2076 */
2077 #ifndef SHA3_BYTEORDER
2078 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
2079 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
2080 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
2081 defined(__arm__)
2082 # define SHA3_BYTEORDER 1234
2083 # elif defined(sparc) || defined(__ppc__)
2084 # define SHA3_BYTEORDER 4321
2085 # else
2086 # define SHA3_BYTEORDER 0
2087 # endif
2088 #endif
2089
2090
2091 /*
2092 ** State structure for a SHA3 hash in progress
2093 */
2094 typedef struct SHA3Context SHA3Context;
2095 struct SHA3Context {
2096 union {
2097 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
2098 unsigned char x[1600]; /* ... or 1600 bytes */
2099 } u;
2100 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
2101 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
2102 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
2103 };
2104
2105 /*
2106 ** A single step of the Keccak mixing function for a 1600-bit state
2107 */
2108 static void KeccakF1600Step(SHA3Context *p){
2109 int i;
2110 u64 b0, b1, b2, b3, b4;
2111 u64 c0, c1, c2, c3, c4;
2112 u64 d0, d1, d2, d3, d4;
2113 static const u64 RC[] = {
2114 0x0000000000000001ULL, 0x0000000000008082ULL,
2115 0x800000000000808aULL, 0x8000000080008000ULL,
2116 0x000000000000808bULL, 0x0000000080000001ULL,
2117 0x8000000080008081ULL, 0x8000000000008009ULL,
2118 0x000000000000008aULL, 0x0000000000000088ULL,
2119 0x0000000080008009ULL, 0x000000008000000aULL,
2120 0x000000008000808bULL, 0x800000000000008bULL,
2121 0x8000000000008089ULL, 0x8000000000008003ULL,
2122 0x8000000000008002ULL, 0x8000000000000080ULL,
2123 0x000000000000800aULL, 0x800000008000000aULL,
2124 0x8000000080008081ULL, 0x8000000000008080ULL,
2125 0x0000000080000001ULL, 0x8000000080008008ULL
2126 };
2127 # define a00 (p->u.s[0])
2128 # define a01 (p->u.s[1])
2129 # define a02 (p->u.s[2])
2130 # define a03 (p->u.s[3])
2131 # define a04 (p->u.s[4])
2132 # define a10 (p->u.s[5])
2133 # define a11 (p->u.s[6])
2134 # define a12 (p->u.s[7])
2135 # define a13 (p->u.s[8])
2136 # define a14 (p->u.s[9])
2137 # define a20 (p->u.s[10])
2138 # define a21 (p->u.s[11])
2139 # define a22 (p->u.s[12])
2140 # define a23 (p->u.s[13])
2141 # define a24 (p->u.s[14])
2142 # define a30 (p->u.s[15])
2143 # define a31 (p->u.s[16])
2144 # define a32 (p->u.s[17])
2145 # define a33 (p->u.s[18])
2146 # define a34 (p->u.s[19])
2147 # define a40 (p->u.s[20])
2148 # define a41 (p->u.s[21])
2149 # define a42 (p->u.s[22])
2150 # define a43 (p->u.s[23])
2151 # define a44 (p->u.s[24])
2152 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
2153
2154 for(i=0; i<24; i+=4){
2155 c0 = a00^a10^a20^a30^a40;
2156 c1 = a01^a11^a21^a31^a41;
2157 c2 = a02^a12^a22^a32^a42;
2158 c3 = a03^a13^a23^a33^a43;
2159 c4 = a04^a14^a24^a34^a44;
2160 d0 = c4^ROL64(c1, 1);
2161 d1 = c0^ROL64(c2, 1);
2162 d2 = c1^ROL64(c3, 1);
2163 d3 = c2^ROL64(c4, 1);
2164 d4 = c3^ROL64(c0, 1);
2165
2166 b0 = (a00^d0);
2167 b1 = ROL64((a11^d1), 44);
2168 b2 = ROL64((a22^d2), 43);
2169 b3 = ROL64((a33^d3), 21);
2170 b4 = ROL64((a44^d4), 14);
2171 a00 = b0 ^((~b1)& b2 );
2172 a00 ^= RC[i];
2173 a11 = b1 ^((~b2)& b3 );
2174 a22 = b2 ^((~b3)& b4 );
2175 a33 = b3 ^((~b4)& b0 );
2176 a44 = b4 ^((~b0)& b1 );
2177
2178 b2 = ROL64((a20^d0), 3);
2179 b3 = ROL64((a31^d1), 45);
2180 b4 = ROL64((a42^d2), 61);
2181 b0 = ROL64((a03^d3), 28);
2182 b1 = ROL64((a14^d4), 20);
2183 a20 = b0 ^((~b1)& b2 );
2184 a31 = b1 ^((~b2)& b3 );
2185 a42 = b2 ^((~b3)& b4 );
2186 a03 = b3 ^((~b4)& b0 );
2187 a14 = b4 ^((~b0)& b1 );
2188
2189 b4 = ROL64((a40^d0), 18);
2190 b0 = ROL64((a01^d1), 1);
2191 b1 = ROL64((a12^d2), 6);
2192 b2 = ROL64((a23^d3), 25);
2193 b3 = ROL64((a34^d4), 8);
2194 a40 = b0 ^((~b1)& b2 );
2195 a01 = b1 ^((~b2)& b3 );
2196 a12 = b2 ^((~b3)& b4 );
2197 a23 = b3 ^((~b4)& b0 );
2198 a34 = b4 ^((~b0)& b1 );
2199
2200 b1 = ROL64((a10^d0), 36);
2201 b2 = ROL64((a21^d1), 10);
2202 b3 = ROL64((a32^d2), 15);
2203 b4 = ROL64((a43^d3), 56);
2204 b0 = ROL64((a04^d4), 27);
2205 a10 = b0 ^((~b1)& b2 );
2206 a21 = b1 ^((~b2)& b3 );
2207 a32 = b2 ^((~b3)& b4 );
2208 a43 = b3 ^((~b4)& b0 );
2209 a04 = b4 ^((~b0)& b1 );
2210
2211 b3 = ROL64((a30^d0), 41);
2212 b4 = ROL64((a41^d1), 2);
2213 b0 = ROL64((a02^d2), 62);
2214 b1 = ROL64((a13^d3), 55);
2215 b2 = ROL64((a24^d4), 39);
2216 a30 = b0 ^((~b1)& b2 );
2217 a41 = b1 ^((~b2)& b3 );
2218 a02 = b2 ^((~b3)& b4 );
2219 a13 = b3 ^((~b4)& b0 );
2220 a24 = b4 ^((~b0)& b1 );
2221
2222 c0 = a00^a20^a40^a10^a30;
2223 c1 = a11^a31^a01^a21^a41;
2224 c2 = a22^a42^a12^a32^a02;
2225 c3 = a33^a03^a23^a43^a13;
2226 c4 = a44^a14^a34^a04^a24;
2227 d0 = c4^ROL64(c1, 1);
2228 d1 = c0^ROL64(c2, 1);
2229 d2 = c1^ROL64(c3, 1);
2230 d3 = c2^ROL64(c4, 1);
2231 d4 = c3^ROL64(c0, 1);
2232
2233 b0 = (a00^d0);
2234 b1 = ROL64((a31^d1), 44);
2235 b2 = ROL64((a12^d2), 43);
2236 b3 = ROL64((a43^d3), 21);
2237 b4 = ROL64((a24^d4), 14);
2238 a00 = b0 ^((~b1)& b2 );
2239 a00 ^= RC[i+1];
2240 a31 = b1 ^((~b2)& b3 );
2241 a12 = b2 ^((~b3)& b4 );
2242 a43 = b3 ^((~b4)& b0 );
2243 a24 = b4 ^((~b0)& b1 );
2244
2245 b2 = ROL64((a40^d0), 3);
2246 b3 = ROL64((a21^d1), 45);
2247 b4 = ROL64((a02^d2), 61);
2248 b0 = ROL64((a33^d3), 28);
2249 b1 = ROL64((a14^d4), 20);
2250 a40 = b0 ^((~b1)& b2 );
2251 a21 = b1 ^((~b2)& b3 );
2252 a02 = b2 ^((~b3)& b4 );
2253 a33 = b3 ^((~b4)& b0 );
2254 a14 = b4 ^((~b0)& b1 );
2255
2256 b4 = ROL64((a30^d0), 18);
2257 b0 = ROL64((a11^d1), 1);
2258 b1 = ROL64((a42^d2), 6);
2259 b2 = ROL64((a23^d3), 25);
2260 b3 = ROL64((a04^d4), 8);
2261 a30 = b0 ^((~b1)& b2 );
2262 a11 = b1 ^((~b2)& b3 );
2263 a42 = b2 ^((~b3)& b4 );
2264 a23 = b3 ^((~b4)& b0 );
2265 a04 = b4 ^((~b0)& b1 );
2266
2267 b1 = ROL64((a20^d0), 36);
2268 b2 = ROL64((a01^d1), 10);
2269 b3 = ROL64((a32^d2), 15);
2270 b4 = ROL64((a13^d3), 56);
2271 b0 = ROL64((a44^d4), 27);
2272 a20 = b0 ^((~b1)& b2 );
2273 a01 = b1 ^((~b2)& b3 );
2274 a32 = b2 ^((~b3)& b4 );
2275 a13 = b3 ^((~b4)& b0 );
2276 a44 = b4 ^((~b0)& b1 );
2277
2278 b3 = ROL64((a10^d0), 41);
2279 b4 = ROL64((a41^d1), 2);
2280 b0 = ROL64((a22^d2), 62);
2281 b1 = ROL64((a03^d3), 55);
2282 b2 = ROL64((a34^d4), 39);
2283 a10 = b0 ^((~b1)& b2 );
2284 a41 = b1 ^((~b2)& b3 );
2285 a22 = b2 ^((~b3)& b4 );
2286 a03 = b3 ^((~b4)& b0 );
2287 a34 = b4 ^((~b0)& b1 );
2288
2289 c0 = a00^a40^a30^a20^a10;
2290 c1 = a31^a21^a11^a01^a41;
2291 c2 = a12^a02^a42^a32^a22;
2292 c3 = a43^a33^a23^a13^a03;
2293 c4 = a24^a14^a04^a44^a34;
2294 d0 = c4^ROL64(c1, 1);
2295 d1 = c0^ROL64(c2, 1);
2296 d2 = c1^ROL64(c3, 1);
2297 d3 = c2^ROL64(c4, 1);
2298 d4 = c3^ROL64(c0, 1);
2299
2300 b0 = (a00^d0);
2301 b1 = ROL64((a21^d1), 44);
2302 b2 = ROL64((a42^d2), 43);
2303 b3 = ROL64((a13^d3), 21);
2304 b4 = ROL64((a34^d4), 14);
2305 a00 = b0 ^((~b1)& b2 );
2306 a00 ^= RC[i+2];
2307 a21 = b1 ^((~b2)& b3 );
2308 a42 = b2 ^((~b3)& b4 );
2309 a13 = b3 ^((~b4)& b0 );
2310 a34 = b4 ^((~b0)& b1 );
2311
2312 b2 = ROL64((a30^d0), 3);
2313 b3 = ROL64((a01^d1), 45);
2314 b4 = ROL64((a22^d2), 61);
2315 b0 = ROL64((a43^d3), 28);
2316 b1 = ROL64((a14^d4), 20);
2317 a30 = b0 ^((~b1)& b2 );
2318 a01 = b1 ^((~b2)& b3 );
2319 a22 = b2 ^((~b3)& b4 );
2320 a43 = b3 ^((~b4)& b0 );
2321 a14 = b4 ^((~b0)& b1 );
2322
2323 b4 = ROL64((a10^d0), 18);
2324 b0 = ROL64((a31^d1), 1);
2325 b1 = ROL64((a02^d2), 6);
2326 b2 = ROL64((a23^d3), 25);
2327 b3 = ROL64((a44^d4), 8);
2328 a10 = b0 ^((~b1)& b2 );
2329 a31 = b1 ^((~b2)& b3 );
2330 a02 = b2 ^((~b3)& b4 );
2331 a23 = b3 ^((~b4)& b0 );
2332 a44 = b4 ^((~b0)& b1 );
2333
2334 b1 = ROL64((a40^d0), 36);
2335 b2 = ROL64((a11^d1), 10);
2336 b3 = ROL64((a32^d2), 15);
2337 b4 = ROL64((a03^d3), 56);
2338 b0 = ROL64((a24^d4), 27);
2339 a40 = b0 ^((~b1)& b2 );
2340 a11 = b1 ^((~b2)& b3 );
2341 a32 = b2 ^((~b3)& b4 );
2342 a03 = b3 ^((~b4)& b0 );
2343 a24 = b4 ^((~b0)& b1 );
2344
2345 b3 = ROL64((a20^d0), 41);
2346 b4 = ROL64((a41^d1), 2);
2347 b0 = ROL64((a12^d2), 62);
2348 b1 = ROL64((a33^d3), 55);
2349 b2 = ROL64((a04^d4), 39);
2350 a20 = b0 ^((~b1)& b2 );
2351 a41 = b1 ^((~b2)& b3 );
2352 a12 = b2 ^((~b3)& b4 );
2353 a33 = b3 ^((~b4)& b0 );
2354 a04 = b4 ^((~b0)& b1 );
2355
2356 c0 = a00^a30^a10^a40^a20;
2357 c1 = a21^a01^a31^a11^a41;
2358 c2 = a42^a22^a02^a32^a12;
2359 c3 = a13^a43^a23^a03^a33;
2360 c4 = a34^a14^a44^a24^a04;
2361 d0 = c4^ROL64(c1, 1);
2362 d1 = c0^ROL64(c2, 1);
2363 d2 = c1^ROL64(c3, 1);
2364 d3 = c2^ROL64(c4, 1);
2365 d4 = c3^ROL64(c0, 1);
2366
2367 b0 = (a00^d0);
2368 b1 = ROL64((a01^d1), 44);
2369 b2 = ROL64((a02^d2), 43);
2370 b3 = ROL64((a03^d3), 21);
2371 b4 = ROL64((a04^d4), 14);
2372 a00 = b0 ^((~b1)& b2 );
2373 a00 ^= RC[i+3];
2374 a01 = b1 ^((~b2)& b3 );
2375 a02 = b2 ^((~b3)& b4 );
2376 a03 = b3 ^((~b4)& b0 );
2377 a04 = b4 ^((~b0)& b1 );
2378
2379 b2 = ROL64((a10^d0), 3);
2380 b3 = ROL64((a11^d1), 45);
2381 b4 = ROL64((a12^d2), 61);
2382 b0 = ROL64((a13^d3), 28);
2383 b1 = ROL64((a14^d4), 20);
2384 a10 = b0 ^((~b1)& b2 );
2385 a11 = b1 ^((~b2)& b3 );
2386 a12 = b2 ^((~b3)& b4 );
2387 a13 = b3 ^((~b4)& b0 );
2388 a14 = b4 ^((~b0)& b1 );
2389
2390 b4 = ROL64((a20^d0), 18);
2391 b0 = ROL64((a21^d1), 1);
2392 b1 = ROL64((a22^d2), 6);
2393 b2 = ROL64((a23^d3), 25);
2394 b3 = ROL64((a24^d4), 8);
2395 a20 = b0 ^((~b1)& b2 );
2396 a21 = b1 ^((~b2)& b3 );
2397 a22 = b2 ^((~b3)& b4 );
2398 a23 = b3 ^((~b4)& b0 );
2399 a24 = b4 ^((~b0)& b1 );
2400
2401 b1 = ROL64((a30^d0), 36);
2402 b2 = ROL64((a31^d1), 10);
2403 b3 = ROL64((a32^d2), 15);
2404 b4 = ROL64((a33^d3), 56);
2405 b0 = ROL64((a34^d4), 27);
2406 a30 = b0 ^((~b1)& b2 );
2407 a31 = b1 ^((~b2)& b3 );
2408 a32 = b2 ^((~b3)& b4 );
2409 a33 = b3 ^((~b4)& b0 );
2410 a34 = b4 ^((~b0)& b1 );
2411
2412 b3 = ROL64((a40^d0), 41);
2413 b4 = ROL64((a41^d1), 2);
2414 b0 = ROL64((a42^d2), 62);
2415 b1 = ROL64((a43^d3), 55);
2416 b2 = ROL64((a44^d4), 39);
2417 a40 = b0 ^((~b1)& b2 );
2418 a41 = b1 ^((~b2)& b3 );
2419 a42 = b2 ^((~b3)& b4 );
2420 a43 = b3 ^((~b4)& b0 );
2421 a44 = b4 ^((~b0)& b1 );
2422 }
2423 }
2424
2425 /*
2426 ** Initialize a new hash. iSize determines the size of the hash
2427 ** in bits and should be one of 224, 256, 384, or 512. Or iSize
2428 ** can be zero to use the default hash size of 256 bits.
2429 */
2430 static void SHA3Init(SHA3Context *p, int iSize){
2431 memset(p, 0, sizeof(*p));
2432 if( iSize>=128 && iSize<=512 ){
2433 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
2434 }else{
2435 p->nRate = (1600 - 2*256)/8;
2436 }
2437 #if SHA3_BYTEORDER==1234
2438 /* Known to be little-endian at compile-time. No-op */
2439 #elif SHA3_BYTEORDER==4321
2440 p->ixMask = 7; /* Big-endian */
2441 #else
2442 {
2443 static unsigned int one = 1;
2444 if( 1==*(unsigned char*)&one ){
2445 /* Little endian. No byte swapping. */
2446 p->ixMask = 0;
2447 }else{
2448 /* Big endian. Byte swap. */
2449 p->ixMask = 7;
2450 }
2451 }
2452 #endif
2453 }
2454
2455 /*
2456 ** Make consecutive calls to the SHA3Update function to add new content
2457 ** to the hash
2458 */
2459 static void SHA3Update(
2460 SHA3Context *p,
2461 const unsigned char *aData,
2462 unsigned int nData
2463 ){
2464 unsigned int i = 0;
2465 if( aData==0 ) return;
2466 #if SHA3_BYTEORDER==1234
2467 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
2468 for(; i+7<nData; i+=8){
2469 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
2470 p->nLoaded += 8;
2471 if( p->nLoaded>=p->nRate ){
2472 KeccakF1600Step(p);
2473 p->nLoaded = 0;
2474 }
2475 }
2476 }
2477 #endif
2478 for(; i<nData; i++){
2479 #if SHA3_BYTEORDER==1234
2480 p->u.x[p->nLoaded] ^= aData[i];
2481 #elif SHA3_BYTEORDER==4321
2482 p->u.x[p->nLoaded^0x07] ^= aData[i];
2483 #else
2484 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
2485 #endif
2486 p->nLoaded++;
2487 if( p->nLoaded==p->nRate ){
2488 KeccakF1600Step(p);
2489 p->nLoaded = 0;
2490 }
2491 }
2492 }
2493
2494 /*
2495 ** After all content has been added, invoke SHA3Final() to compute
2496 ** the final hash. The function returns a pointer to the binary
2497 ** hash value.
2498 */
2499 static unsigned char *SHA3Final(SHA3Context *p){
2500 unsigned int i;
2501 if( p->nLoaded==p->nRate-1 ){
2502 const unsigned char c1 = 0x86;
2503 SHA3Update(p, &c1, 1);
2504 }else{
2505 const unsigned char c2 = 0x06;
2506 const unsigned char c3 = 0x80;
2507 SHA3Update(p, &c2, 1);
2508 p->nLoaded = p->nRate - 1;
2509 SHA3Update(p, &c3, 1);
2510 }
2511 for(i=0; i<p->nRate; i++){
2512 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
2513 }
2514 return &p->u.x[p->nRate];
2515 }
2516 /* End of the hashing logic
2517 *****************************************************************************/
2518
2519 /*
2520 ** Implementation of the sha3(X,SIZE) function.
2521 **
2522 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
2523 ** size is 256. If X is a BLOB, it is hashed as is.
2524 ** For all other non-NULL types of input, X is converted into a UTF-8 string
2525 ** and the string is hashed without the trailing 0x00 terminator. The hash
2526 ** of a NULL value is NULL.
2527 */
2528 static void sha3Func(
2529 sqlite3_context *context,
2530 int argc,
2531 sqlite3_value **argv
2532 ){
2533 SHA3Context cx;
2534 int eType = sqlite3_value_type(argv[0]);
2535 int nByte = sqlite3_value_bytes(argv[0]);
2536 int iSize;
2537 if( argc==1 ){
2538 iSize = 256;
2539 }else{
2540 iSize = sqlite3_value_int(argv[1]);
2541 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
2542 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
2543 "384 512", -1);
2544 return;
2545 }
2546 }
2547 if( eType==SQLITE_NULL ) return;
2548 SHA3Init(&cx, iSize);
2549 if( eType==SQLITE_BLOB ){
2550 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
2551 }else{
2552 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
2553 }
2554 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2555 }
2556
2557 /* Compute a string using sqlite3_vsnprintf() with a maximum length
2558 ** of 50 bytes and add it to the hash.
2559 */
2560 static void sha3_step_vformat(
2561 SHA3Context *p, /* Add content to this context */
2562 const char *zFormat,
2563 ...
2564 ){
2565 va_list ap;
2566 int n;
2567 char zBuf[50];
2568 va_start(ap, zFormat);
2569 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
2570 va_end(ap);
2571 n = (int)strlen(zBuf);
2572 SHA3Update(p, (unsigned char*)zBuf, n);
2573 }
2574
2575 /*
2576 ** Implementation of the sha3_query(SQL,SIZE) function.
2577 **
2578 ** This function compiles and runs the SQL statement(s) given in the
2579 ** argument. The results are hashed using a SIZE-bit SHA3. The default
2580 ** size is 256.
2581 **
2582 ** The format of the byte stream that is hashed is summarized as follows:
2583 **
2584 ** S<n>:<sql>
2585 ** R
2586 ** N
2587 ** I<int>
2588 ** F<ieee-float>
2589 ** B<size>:<bytes>
2590 ** T<size>:<text>
2591 **
2592 ** <sql> is the original SQL text for each statement run and <n> is
2593 ** the size of that text. The SQL text is UTF-8. A single R character
2594 ** occurs before the start of each row. N means a NULL value.
2595 ** I mean an 8-byte little-endian integer <int>. F is a floating point
2596 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
2597 ** B means blobs of <size> bytes. T means text rendered as <size>
2598 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
2599 ** text integers.
2600 **
2601 ** For each SQL statement in the X input, there is one S segment. Each
2602 ** S segment is followed by zero or more R segments, one for each row in the
2603 ** result set. After each R, there are one or more N, I, F, B, or T segments,
2604 ** one for each column in the result set. Segments are concatentated directly
2605 ** with no delimiters of any kind.
2606 */
2607 static void sha3QueryFunc(
2608 sqlite3_context *context,
2609 int argc,
2610 sqlite3_value **argv
2611 ){
2612 sqlite3 *db = sqlite3_context_db_handle(context);
2613 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
2614 sqlite3_stmt *pStmt = 0;
2615 int nCol; /* Number of columns in the result set */
2616 int i; /* Loop counter */
2617 int rc;
2618 int n;
2619 const char *z;
2620 SHA3Context cx;
2621 int iSize;
2622
2623 if( argc==1 ){
2624 iSize = 256;
2625 }else{
2626 iSize = sqlite3_value_int(argv[1]);
2627 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
2628 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
2629 "384 512", -1);
2630 return;
2631 }
2632 }
2633 if( zSql==0 ) return;
2634 SHA3Init(&cx, iSize);
2635 while( zSql[0] ){
2636 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
2637 if( rc ){
2638 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
2639 zSql, sqlite3_errmsg(db));
2640 sqlite3_finalize(pStmt);
2641 sqlite3_result_error(context, zMsg, -1);
2642 sqlite3_free(zMsg);
2643 return;
2644 }
2645 if( !sqlite3_stmt_readonly(pStmt) ){
2646 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
2647 sqlite3_finalize(pStmt);
2648 sqlite3_result_error(context, zMsg, -1);
2649 sqlite3_free(zMsg);
2650 return;
2651 }
2652 nCol = sqlite3_column_count(pStmt);
2653 z = sqlite3_sql(pStmt);
2654 if( z ){
2655 n = (int)strlen(z);
2656 sha3_step_vformat(&cx,"S%d:",n);
2657 SHA3Update(&cx,(unsigned char*)z,n);
2658 }
2659
2660 /* Compute a hash over the result of the query */
2661 while( SQLITE_ROW==sqlite3_step(pStmt) ){
2662 SHA3Update(&cx,(const unsigned char*)"R",1);
2663 for(i=0; i<nCol; i++){
2664 switch( sqlite3_column_type(pStmt,i) ){
2665 case SQLITE_NULL: {
2666 SHA3Update(&cx, (const unsigned char*)"N",1);
2667 break;
2668 }
2669 case SQLITE_INTEGER: {
2670 sqlite3_uint64 u;
2671 int j;
2672 unsigned char x[9];
2673 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
2674 memcpy(&u, &v, 8);
2675 for(j=8; j>=1; j--){
2676 x[j] = u & 0xff;
2677 u >>= 8;
2678 }
2679 x[0] = 'I';
2680 SHA3Update(&cx, x, 9);
2681 break;
2682 }
2683 case SQLITE_FLOAT: {
2684 sqlite3_uint64 u;
2685 int j;
2686 unsigned char x[9];
2687 double r = sqlite3_column_double(pStmt,i);
2688 memcpy(&u, &r, 8);
2689 for(j=8; j>=1; j--){
2690 x[j] = u & 0xff;
2691 u >>= 8;
2692 }
2693 x[0] = 'F';
2694 SHA3Update(&cx,x,9);
2695 break;
2696 }
2697 case SQLITE_TEXT: {
2698 int n2 = sqlite3_column_bytes(pStmt, i);
2699 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
2700 sha3_step_vformat(&cx,"T%d:",n2);
2701 SHA3Update(&cx, z2, n2);
2702 break;
2703 }
2704 case SQLITE_BLOB: {
2705 int n2 = sqlite3_column_bytes(pStmt, i);
2706 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
2707 sha3_step_vformat(&cx,"B%d:",n2);
2708 SHA3Update(&cx, z2, n2);
2709 break;
2710 }
2711 }
2712 }
2713 }
2714 sqlite3_finalize(pStmt);
2715 }
2716 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2717 }
2718
2719
2720 #ifdef _WIN32
2721
2722 #endif
2723 int sqlite3_shathree_init(
2724 sqlite3 *db,
2725 char **pzErrMsg,
2726 const sqlite3_api_routines *pApi
2727 ){
2728 int rc = SQLITE_OK;
2729 SQLITE_EXTENSION_INIT2(pApi);
2730 (void)pzErrMsg; /* Unused parameter */
2731 rc = sqlite3_create_function(db, "sha3", 1,
2732 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2733 0, sha3Func, 0, 0);
2734 if( rc==SQLITE_OK ){
2735 rc = sqlite3_create_function(db, "sha3", 2,
2736 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2737 0, sha3Func, 0, 0);
2738 }
2739 if( rc==SQLITE_OK ){
2740 rc = sqlite3_create_function(db, "sha3_query", 1,
2741 SQLITE_UTF8 | SQLITE_DIRECTONLY,
2742 0, sha3QueryFunc, 0, 0);
2743 }
2744 if( rc==SQLITE_OK ){
2745 rc = sqlite3_create_function(db, "sha3_query", 2,
2746 SQLITE_UTF8 | SQLITE_DIRECTONLY,
2747 0, sha3QueryFunc, 0, 0);
2748 }
2749 return rc;
2750 }
2751
2752 /************************* End ../ext/misc/shathree.c ********************/
2753 /************************* Begin ../ext/misc/uint.c ******************/
2754 /*
2755 ** 2020-04-14
2756 **
2757 ** The author disclaims copyright to this source code. In place of
2758 ** a legal notice, here is a blessing:
2759 **
2760 ** May you do good and not evil.
2761 ** May you find forgiveness for yourself and forgive others.
2762 ** May you share freely, never taking more than you give.
2763 **
2764 ******************************************************************************
2765 **
2766 ** This SQLite extension implements the UINT collating sequence.
2767 **
2768 ** UINT works like BINARY for text, except that embedded strings
2769 ** of digits compare in numeric order.
2770 **
2771 ** * Leading zeros are handled properly, in the sense that
2772 ** they do not mess of the maginitude comparison of embedded
2773 ** strings of digits. "x00123y" is equal to "x123y".
2774 **
2775 ** * Only unsigned integers are recognized. Plus and minus
2776 ** signs are ignored. Decimal points and exponential notation
2777 ** are ignored.
2778 **
2779 ** * Embedded integers can be of arbitrary length. Comparison
2780 ** is *not* limited integers that can be expressed as a
2781 ** 64-bit machine integer.
2782 */
2783 /* #include "sqlite3ext.h" */
2784 SQLITE_EXTENSION_INIT1
2785 #include <assert.h>
2786 #include <string.h>
2787 #include <ctype.h>
2788
2789 /*
2790 ** Compare text in lexicographic order, except strings of digits
2791 ** compare in numeric order.
2792 */
2793 static int uintCollFunc(
2794 void *notUsed,
2795 int nKey1, const void *pKey1,
2796 int nKey2, const void *pKey2
2797 ){
2798 const unsigned char *zA = (const unsigned char*)pKey1;
2799 const unsigned char *zB = (const unsigned char*)pKey2;
2800 int i=0, j=0, x;
2801 (void)notUsed;
2802 while( i<nKey1 && j<nKey2 ){
2803 x = zA[i] - zB[j];
2804 if( isdigit(zA[i]) ){
2805 int k;
2806 if( !isdigit(zB[j]) ) return x;
2807 while( i<nKey1 && zA[i]=='0' ){ i++; }
2808 while( j<nKey2 && zB[j]=='0' ){ j++; }
2809 k = 0;
2810 while( i+k<nKey1 && isdigit(zA[i+k])
2811 && j+k<nKey2 && isdigit(zB[j+k]) ){
2812 k++;
2813 }
2814 if( i+k<nKey1 && isdigit(zA[i+k]) ){
2815 return +1;
2816 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
2817 return -1;
2818 }else{
2819 x = memcmp(zA+i, zB+j, k);
2820 if( x ) return x;
2821 i += k;
2822 j += k;
2823 }
2824 }else if( x ){
2825 return x;
2826 }else{
2827 i++;
2828 j++;
2829 }
2830 }
2831 return (nKey1 - i) - (nKey2 - j);
2832 }
2833
2834 #ifdef _WIN32
2835
2836 #endif
2837 int sqlite3_uint_init(
2838 sqlite3 *db,
2839 char **pzErrMsg,
2840 const sqlite3_api_routines *pApi
2841 ){
2842 SQLITE_EXTENSION_INIT2(pApi);
2843 (void)pzErrMsg; /* Unused parameter */
2844 return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
2845 }
2846
2847 /************************* End ../ext/misc/uint.c ********************/
2848 /************************* Begin ../ext/misc/decimal.c ******************/
2849 /*
2850 ** 2020-06-22
2851 **
2852 ** The author disclaims copyright to this source code. In place of
2853 ** a legal notice, here is a blessing:
2854 **
2855 ** May you do good and not evil.
2856 ** May you find forgiveness for yourself and forgive others.
2857 ** May you share freely, never taking more than you give.
2858 **
2859 ******************************************************************************
2860 **
2861 ** Routines to implement arbitrary-precision decimal math.
2862 **
2863 ** The focus here is on simplicity and correctness, not performance.
2864 */
2865 /* #include "sqlite3ext.h" */
2866 SQLITE_EXTENSION_INIT1
2867 #include <assert.h>
2868 #include <string.h>
2869 #include <ctype.h>
2870 #include <stdlib.h>
2871
2872 /* Mark a function parameter as unused, to suppress nuisance compiler
2873 ** warnings. */
2874 #ifndef UNUSED_PARAMETER
2875 # define UNUSED_PARAMETER(X) (void)(X)
2876 #endif
2877
2878
2879 /* A decimal object */
2880 typedef struct Decimal Decimal;
2881 struct Decimal {
2882 char sign; /* 0 for positive, 1 for negative */
2883 char oom; /* True if an OOM is encountered */
2884 char isNull; /* True if holds a NULL rather than a number */
2885 char isInit; /* True upon initialization */
2886 int nDigit; /* Total number of digits */
2887 int nFrac; /* Number of digits to the right of the decimal point */
2888 signed char *a; /* Array of digits. Most significant first. */
2889 };
2890
2891 /*
2892 ** Release memory held by a Decimal, but do not free the object itself.
2893 */
2894 static void decimal_clear(Decimal *p){
2895 sqlite3_free(p->a);
2896 }
2897
2898 /*
2899 ** Destroy a Decimal object
2900 */
2901 static void decimal_free(Decimal *p){
2902 if( p ){
2903 decimal_clear(p);
2904 sqlite3_free(p);
2905 }
2906 }
2907
2908 /*
2909 ** Allocate a new Decimal object initialized to the text in zIn[].
2910 ** Return NULL if any kind of error occurs.
2911 */
2912 static Decimal *decimalNewFromText(const char *zIn, int n){
2913 Decimal *p = 0;
2914 int i;
2915 int iExp = 0;
2916
2917 p = sqlite3_malloc( sizeof(*p) );
2918 if( p==0 ) goto new_from_text_failed;
2919 p->sign = 0;
2920 p->oom = 0;
2921 p->isInit = 1;
2922 p->isNull = 0;
2923 p->nDigit = 0;
2924 p->nFrac = 0;
2925 p->a = sqlite3_malloc64( n+1 );
2926 if( p->a==0 ) goto new_from_text_failed;
2927 for(i=0; isspace(zIn[i]); i++){}
2928 if( zIn[i]=='-' ){
2929 p->sign = 1;
2930 i++;
2931 }else if( zIn[i]=='+' ){
2932 i++;
2933 }
2934 while( i<n && zIn[i]=='0' ) i++;
2935 while( i<n ){
2936 char c = zIn[i];
2937 if( c>='0' && c<='9' ){
2938 p->a[p->nDigit++] = c - '0';
2939 }else if( c=='.' ){
2940 p->nFrac = p->nDigit + 1;
2941 }else if( c=='e' || c=='E' ){
2942 int j = i+1;
2943 int neg = 0;
2944 if( j>=n ) break;
2945 if( zIn[j]=='-' ){
2946 neg = 1;
2947 j++;
2948 }else if( zIn[j]=='+' ){
2949 j++;
2950 }
2951 while( j<n && iExp<1000000 ){
2952 if( zIn[j]>='0' && zIn[j]<='9' ){
2953 iExp = iExp*10 + zIn[j] - '0';
2954 }
2955 j++;
2956 }
2957 if( neg ) iExp = -iExp;
2958 break;
2959 }
2960 i++;
2961 }
2962 if( p->nFrac ){
2963 p->nFrac = p->nDigit - (p->nFrac - 1);
2964 }
2965 if( iExp>0 ){
2966 if( p->nFrac>0 ){
2967 if( iExp<=p->nFrac ){
2968 p->nFrac -= iExp;
2969 iExp = 0;
2970 }else{
2971 iExp -= p->nFrac;
2972 p->nFrac = 0;
2973 }
2974 }
2975 if( iExp>0 ){
2976 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
2977 if( p->a==0 ) goto new_from_text_failed;
2978 memset(p->a+p->nDigit, 0, iExp);
2979 p->nDigit += iExp;
2980 }
2981 }else if( iExp<0 ){
2982 int nExtra;
2983 iExp = -iExp;
2984 nExtra = p->nDigit - p->nFrac - 1;
2985 if( nExtra ){
2986 if( nExtra>=iExp ){
2987 p->nFrac += iExp;
2988 iExp = 0;
2989 }else{
2990 iExp -= nExtra;
2991 p->nFrac = p->nDigit - 1;
2992 }
2993 }
2994 if( iExp>0 ){
2995 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
2996 if( p->a==0 ) goto new_from_text_failed;
2997 memmove(p->a+iExp, p->a, p->nDigit);
2998 memset(p->a, 0, iExp);
2999 p->nDigit += iExp;
3000 p->nFrac += iExp;
3001 }
3002 }
3003 return p;
3004
3005 new_from_text_failed:
3006 if( p ){
3007 if( p->a ) sqlite3_free(p->a);
3008 sqlite3_free(p);
3009 }
3010 return 0;
3011 }
3012
3013 /* Forward reference */
3014 static Decimal *decimalFromDouble(double);
3015
3016 /*
3017 ** Allocate a new Decimal object from an sqlite3_value. Return a pointer
3018 ** to the new object, or NULL if there is an error. If the pCtx argument
3019 ** is not NULL, then errors are reported on it as well.
3020 **
3021 ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
3022 ** directly into a Decimal. For SQLITE_FLOAT or for SQLITE_BLOB of length
3023 ** 8 bytes, the resulting double value is expanded into its decimal equivalent.
3024 ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
3025 ** then NULL is returned.
3026 */
3027 static Decimal *decimal_new(
3028 sqlite3_context *pCtx, /* Report error here, if not null */
3029 sqlite3_value *pIn, /* Construct the decimal object from this */
3030 int bTextOnly /* Always interpret pIn as text if true */
3031 ){
3032 Decimal *p = 0;
3033 int eType = sqlite3_value_type(pIn);
3034 if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
3035 eType = SQLITE_TEXT;
3036 }
3037 switch( eType ){
3038 case SQLITE_TEXT:
3039 case SQLITE_INTEGER: {
3040 const char *zIn = (const char*)sqlite3_value_text(pIn);
3041 int n = sqlite3_value_bytes(pIn);
3042 p = decimalNewFromText(zIn, n);
3043 if( p==0 ) goto new_failed;
3044 break;
3045 }
3046
3047 case SQLITE_FLOAT: {
3048 p = decimalFromDouble(sqlite3_value_double(pIn));
3049 break;
3050 }
3051
3052 case SQLITE_BLOB: {
3053 const unsigned char *x;
3054 unsigned int i;
3055 sqlite3_uint64 v = 0;
3056 double r;
3057
3058 if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
3059 x = sqlite3_value_blob(pIn);
3060 for(i=0; i<sizeof(r); i++){
3061 v = (v<<8) | x[i];
3062 }
3063 memcpy(&r, &v, sizeof(r));
3064 p = decimalFromDouble(r);
3065 break;
3066 }
3067
3068 case SQLITE_NULL: {
3069 break;
3070 }
3071 }
3072 return p;
3073
3074 new_failed:
3075 if( pCtx ) sqlite3_result_error_nomem(pCtx);
3076 sqlite3_free(p);
3077 return 0;
3078 }
3079
3080 /*
3081 ** Make the given Decimal the result.
3082 */
3083 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
3084 char *z;
3085 int i, j;
3086 int n;
3087 if( p==0 || p->oom ){
3088 sqlite3_result_error_nomem(pCtx);
3089 return;
3090 }
3091 if( p->isNull ){
3092 sqlite3_result_null(pCtx);
3093 return;
3094 }
3095 z = sqlite3_malloc( p->nDigit+4 );
3096 if( z==0 ){
3097 sqlite3_result_error_nomem(pCtx);
3098 return;
3099 }
3100 i = 0;
3101 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
3102 p->sign = 0;
3103 }
3104 if( p->sign ){
3105 z[0] = '-';
3106 i = 1;
3107 }
3108 n = p->nDigit - p->nFrac;
3109 if( n<=0 ){
3110 z[i++] = '0';
3111 }
3112 j = 0;
3113 while( n>1 && p->a[j]==0 ){
3114 j++;
3115 n--;
3116 }
3117 while( n>0 ){
3118 z[i++] = p->a[j] + '0';
3119 j++;
3120 n--;
3121 }
3122 if( p->nFrac ){
3123 z[i++] = '.';
3124 do{
3125 z[i++] = p->a[j] + '0';
3126 j++;
3127 }while( j<p->nDigit );
3128 }
3129 z[i] = 0;
3130 sqlite3_result_text(pCtx, z, i, sqlite3_free);
3131 }
3132
3133 /*
3134 ** Make the given Decimal the result in an format similar to '%+#e'.
3135 ** In other words, show exponential notation with leading and trailing
3136 ** zeros omitted.
3137 */
3138 static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
3139 char *z; /* The output buffer */
3140 int i; /* Loop counter */
3141 int nZero; /* Number of leading zeros */
3142 int nDigit; /* Number of digits not counting trailing zeros */
3143 int nFrac; /* Digits to the right of the decimal point */
3144 int exp; /* Exponent value */
3145 signed char zero; /* Zero value */
3146 signed char *a; /* Array of digits */
3147
3148 if( p==0 || p->oom ){
3149 sqlite3_result_error_nomem(pCtx);
3150 return;
3151 }
3152 if( p->isNull ){
3153 sqlite3_result_null(pCtx);
3154 return;
3155 }
3156 for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
3157 for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
3158 nFrac = p->nFrac + (nDigit - p->nDigit);
3159 nDigit -= nZero;
3160 z = sqlite3_malloc( nDigit+20 );
3161 if( z==0 ){
3162 sqlite3_result_error_nomem(pCtx);
3163 return;
3164 }
3165 if( nDigit==0 ){
3166 zero = 0;
3167 a = &zero;
3168 nDigit = 1;
3169 nFrac = 0;
3170 }else{
3171 a = &p->a[nZero];
3172 }
3173 if( p->sign && nDigit>0 ){
3174 z[0] = '-';
3175 }else{
3176 z[0] = '+';
3177 }
3178 z[1] = a[0]+'0';
3179 z[2] = '.';
3180 if( nDigit==1 ){
3181 z[3] = '0';
3182 i = 4;
3183 }else{
3184 for(i=1; i<nDigit; i++){
3185 z[2+i] = a[i]+'0';
3186 }
3187 i = nDigit+2;
3188 }
3189 exp = nDigit - nFrac - 1;
3190 sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
3191 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
3192 }
3193
3194 /*
3195 ** Compare to Decimal objects. Return negative, 0, or positive if the
3196 ** first object is less than, equal to, or greater than the second.
3197 **
3198 ** Preconditions for this routine:
3199 **
3200 ** pA!=0
3201 ** pA->isNull==0
3202 ** pB!=0
3203 ** pB->isNull==0
3204 */
3205 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
3206 int nASig, nBSig, rc, n;
3207 if( pA->sign!=pB->sign ){
3208 return pA->sign ? -1 : +1;
3209 }
3210 if( pA->sign ){
3211 const Decimal *pTemp = pA;
3212 pA = pB;
3213 pB = pTemp;
3214 }
3215 nASig = pA->nDigit - pA->nFrac;
3216 nBSig = pB->nDigit - pB->nFrac;
3217 if( nASig!=nBSig ){
3218 return nASig - nBSig;
3219 }
3220 n = pA->nDigit;
3221 if( n>pB->nDigit ) n = pB->nDigit;
3222 rc = memcmp(pA->a, pB->a, n);
3223 if( rc==0 ){
3224 rc = pA->nDigit - pB->nDigit;
3225 }
3226 return rc;
3227 }
3228
3229 /*
3230 ** SQL Function: decimal_cmp(X, Y)
3231 **
3232 ** Return negative, zero, or positive if X is less then, equal to, or
3233 ** greater than Y.
3234 */
3235 static void decimalCmpFunc(
3236 sqlite3_context *context,
3237 int argc,
3238 sqlite3_value **argv
3239 ){
3240 Decimal *pA = 0, *pB = 0;
3241 int rc;
3242
3243 UNUSED_PARAMETER(argc);
3244 pA = decimal_new(context, argv[0], 1);
3245 if( pA==0 || pA->isNull ) goto cmp_done;
3246 pB = decimal_new(context, argv[1], 1);
3247 if( pB==0 || pB->isNull ) goto cmp_done;
3248 rc = decimal_cmp(pA, pB);
3249 if( rc<0 ) rc = -1;
3250 else if( rc>0 ) rc = +1;
3251 sqlite3_result_int(context, rc);
3252 cmp_done:
3253 decimal_free(pA);
3254 decimal_free(pB);
3255 }
3256
3257 /*
3258 ** Expand the Decimal so that it has a least nDigit digits and nFrac
3259 ** digits to the right of the decimal point.
3260 */
3261 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
3262 int nAddSig;
3263 int nAddFrac;
3264 if( p==0 ) return;
3265 nAddFrac = nFrac - p->nFrac;
3266 nAddSig = (nDigit - p->nDigit) - nAddFrac;
3267 if( nAddFrac==0 && nAddSig==0 ) return;
3268 p->a = sqlite3_realloc64(p->a, nDigit+1);
3269 if( p->a==0 ){
3270 p->oom = 1;
3271 return;
3272 }
3273 if( nAddSig ){
3274 memmove(p->a+nAddSig, p->a, p->nDigit);
3275 memset(p->a, 0, nAddSig);
3276 p->nDigit += nAddSig;
3277 }
3278 if( nAddFrac ){
3279 memset(p->a+p->nDigit, 0, nAddFrac);
3280 p->nDigit += nAddFrac;
3281 p->nFrac += nAddFrac;
3282 }
3283 }
3284
3285 /*
3286 ** Add the value pB into pA. A := A + B.
3287 **
3288 ** Both pA and pB might become denormalized by this routine.
3289 */
3290 static void decimal_add(Decimal *pA, Decimal *pB){
3291 int nSig, nFrac, nDigit;
3292 int i, rc;
3293 if( pA==0 ){
3294 return;
3295 }
3296 if( pA->oom || pB==0 || pB->oom ){
3297 pA->oom = 1;
3298 return;
3299 }
3300 if( pA->isNull || pB->isNull ){
3301 pA->isNull = 1;
3302 return;
3303 }
3304 nSig = pA->nDigit - pA->nFrac;
3305 if( nSig && pA->a[0]==0 ) nSig--;
3306 if( nSig<pB->nDigit-pB->nFrac ){
3307 nSig = pB->nDigit - pB->nFrac;
3308 }
3309 nFrac = pA->nFrac;
3310 if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
3311 nDigit = nSig + nFrac + 1;
3312 decimal_expand(pA, nDigit, nFrac);
3313 decimal_expand(pB, nDigit, nFrac);
3314 if( pA->oom || pB->oom ){
3315 pA->oom = 1;
3316 }else{
3317 if( pA->sign==pB->sign ){
3318 int carry = 0;
3319 for(i=nDigit-1; i>=0; i--){
3320 int x = pA->a[i] + pB->a[i] + carry;
3321 if( x>=10 ){
3322 carry = 1;
3323 pA->a[i] = x - 10;
3324 }else{
3325 carry = 0;
3326 pA->a[i] = x;
3327 }
3328 }
3329 }else{
3330 signed char *aA, *aB;
3331 int borrow = 0;
3332 rc = memcmp(pA->a, pB->a, nDigit);
3333 if( rc<0 ){
3334 aA = pB->a;
3335 aB = pA->a;
3336 pA->sign = !pA->sign;
3337 }else{
3338 aA = pA->a;
3339 aB = pB->a;
3340 }
3341 for(i=nDigit-1; i>=0; i--){
3342 int x = aA[i] - aB[i] - borrow;
3343 if( x<0 ){
3344 pA->a[i] = x+10;
3345 borrow = 1;
3346 }else{
3347 pA->a[i] = x;
3348 borrow = 0;
3349 }
3350 }
3351 }
3352 }
3353 }
3354
3355 /*
3356 ** Multiply A by B. A := A * B
3357 **
3358 ** All significant digits after the decimal point are retained.
3359 ** Trailing zeros after the decimal point are omitted as long as
3360 ** the number of digits after the decimal point is no less than
3361 ** either the number of digits in either input.
3362 */
3363 static void decimalMul(Decimal *pA, Decimal *pB){
3364 signed char *acc = 0;
3365 int i, j, k;
3366 int minFrac;
3367
3368 if( pA==0 || pA->oom || pA->isNull
3369 || pB==0 || pB->oom || pB->isNull
3370 ){
3371 goto mul_end;
3372 }
3373 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
3374 if( acc==0 ){
3375 pA->oom = 1;
3376 goto mul_end;
3377 }
3378 memset(acc, 0, pA->nDigit + pB->nDigit + 2);
3379 minFrac = pA->nFrac;
3380 if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
3381 for(i=pA->nDigit-1; i>=0; i--){
3382 signed char f = pA->a[i];
3383 int carry = 0, x;
3384 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
3385 x = acc[k] + f*pB->a[j] + carry;
3386 acc[k] = x%10;
3387 carry = x/10;
3388 }
3389 x = acc[k] + carry;
3390 acc[k] = x%10;
3391 acc[k-1] += x/10;
3392 }
3393 sqlite3_free(pA->a);
3394 pA->a = acc;
3395 acc = 0;
3396 pA->nDigit += pB->nDigit + 2;
3397 pA->nFrac += pB->nFrac;
3398 pA->sign ^= pB->sign;
3399 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
3400 pA->nFrac--;
3401 pA->nDigit--;
3402 }
3403
3404 mul_end:
3405 sqlite3_free(acc);
3406 }
3407
3408 /*
3409 ** Create a new Decimal object that contains an integer power of 2.
3410 */
3411 static Decimal *decimalPow2(int N){
3412 Decimal *pA = 0; /* The result to be returned */
3413 Decimal *pX = 0; /* Multiplier */
3414 if( N<-20000 || N>20000 ) goto pow2_fault;
3415 pA = decimalNewFromText("1.0", 3);
3416 if( pA==0 || pA->oom ) goto pow2_fault;
3417 if( N==0 ) return pA;
3418 if( N>0 ){
3419 pX = decimalNewFromText("2.0", 3);
3420 }else{
3421 N = -N;
3422 pX = decimalNewFromText("0.5", 3);
3423 }
3424 if( pX==0 || pX->oom ) goto pow2_fault;
3425 while( 1 /* Exit by break */ ){
3426 if( N & 1 ){
3427 decimalMul(pA, pX);
3428 if( pA->oom ) goto pow2_fault;
3429 }
3430 N >>= 1;
3431 if( N==0 ) break;
3432 decimalMul(pX, pX);
3433 }
3434 decimal_free(pX);
3435 return pA;
3436
3437 pow2_fault:
3438 decimal_free(pA);
3439 decimal_free(pX);
3440 return 0;
3441 }
3442
3443 /*
3444 ** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
3445 */
3446 static Decimal *decimalFromDouble(double r){
3447 sqlite3_int64 m, a;
3448 int e;
3449 int isNeg;
3450 Decimal *pA;
3451 Decimal *pX;
3452 char zNum[100];
3453 if( r<0.0 ){
3454 isNeg = 1;
3455 r = -r;
3456 }else{
3457 isNeg = 0;
3458 }
3459 memcpy(&a,&r,sizeof(a));
3460 if( a==0 ){
3461 e = 0;
3462 m = 0;
3463 }else{
3464 e = a>>52;
3465 m = a & ((((sqlite3_int64)1)<<52)-1);
3466 if( e==0 ){
3467 m <<= 1;
3468 }else{
3469 m |= ((sqlite3_int64)1)<<52;
3470 }
3471 while( e<1075 && m>0 && (m&1)==0 ){
3472 m >>= 1;
3473 e++;
3474 }
3475 if( isNeg ) m = -m;
3476 e = e - 1075;
3477 if( e>971 ){
3478 return 0; /* A NaN or an Infinity */
3479 }
3480 }
3481
3482 /* At this point m is the integer significand and e is the exponent */
3483 sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
3484 pA = decimalNewFromText(zNum, (int)strlen(zNum));
3485 pX = decimalPow2(e);
3486 decimalMul(pA, pX);
3487 decimal_free(pX);
3488 return pA;
3489 }
3490
3491 /*
3492 ** SQL Function: decimal(X)
3493 ** OR: decimal_exp(X)
3494 **
3495 ** Convert input X into decimal and then back into text.
3496 **
3497 ** If X is originally a float, then a full decimal expansion of that floating
3498 ** point value is done. Or if X is an 8-byte blob, it is interpreted
3499 ** as a float and similarly expanded.
3500 **
3501 ** The decimal_exp(X) function returns the result in exponential notation.
3502 ** decimal(X) returns a complete decimal, without the e+NNN at the end.
3503 */
3504 static void decimalFunc(
3505 sqlite3_context *context,
3506 int argc,
3507 sqlite3_value **argv
3508 ){
3509 Decimal *p = decimal_new(context, argv[0], 0);
3510 UNUSED_PARAMETER(argc);
3511 if( p ){
3512 if( sqlite3_user_data(context)!=0 ){
3513 decimal_result_sci(context, p);
3514 }else{
3515 decimal_result(context, p);
3516 }
3517 decimal_free(p);
3518 }
3519 }
3520
3521 /*
3522 ** Compare text in decimal order.
3523 */
3524 static int decimalCollFunc(
3525 void *notUsed,
3526 int nKey1, const void *pKey1,
3527 int nKey2, const void *pKey2
3528 ){
3529 const unsigned char *zA = (const unsigned char*)pKey1;
3530 const unsigned char *zB = (const unsigned char*)pKey2;
3531 Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
3532 Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
3533 int rc;
3534 UNUSED_PARAMETER(notUsed);
3535 if( pA==0 || pB==0 ){
3536 rc = 0;
3537 }else{
3538 rc = decimal_cmp(pA, pB);
3539 }
3540 decimal_free(pA);
3541 decimal_free(pB);
3542 return rc;
3543 }
3544
3545
3546 /*
3547 ** SQL Function: decimal_add(X, Y)
3548 ** decimal_sub(X, Y)
3549 **
3550 ** Return the sum or difference of X and Y.
3551 */
3552 static void decimalAddFunc(
3553 sqlite3_context *context,
3554 int argc,
3555 sqlite3_value **argv
3556 ){
3557 Decimal *pA = decimal_new(context, argv[0], 1);
3558 Decimal *pB = decimal_new(context, argv[1], 1);
3559 UNUSED_PARAMETER(argc);
3560 decimal_add(pA, pB);
3561 decimal_result(context, pA);
3562 decimal_free(pA);
3563 decimal_free(pB);
3564 }
3565 static void decimalSubFunc(
3566 sqlite3_context *context,
3567 int argc,
3568 sqlite3_value **argv
3569 ){
3570 Decimal *pA = decimal_new(context, argv[0], 1);
3571 Decimal *pB = decimal_new(context, argv[1], 1);
3572 UNUSED_PARAMETER(argc);
3573 if( pB ){
3574 pB->sign = !pB->sign;
3575 decimal_add(pA, pB);
3576 decimal_result(context, pA);
3577 }
3578 decimal_free(pA);
3579 decimal_free(pB);
3580 }
3581
3582 /* Aggregate funcion: decimal_sum(X)
3583 **
3584 ** Works like sum() except that it uses decimal arithmetic for unlimited
3585 ** precision.
3586 */
3587 static void decimalSumStep(
3588 sqlite3_context *context,
3589 int argc,
3590 sqlite3_value **argv
3591 ){
3592 Decimal *p;
3593 Decimal *pArg;
3594 UNUSED_PARAMETER(argc);
3595 p = sqlite3_aggregate_context(context, sizeof(*p));
3596 if( p==0 ) return;
3597 if( !p->isInit ){
3598 p->isInit = 1;
3599 p->a = sqlite3_malloc(2);
3600 if( p->a==0 ){
3601 p->oom = 1;
3602 }else{
3603 p->a[0] = 0;
3604 }
3605 p->nDigit = 1;
3606 p->nFrac = 0;
3607 }
3608 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
3609 pArg = decimal_new(context, argv[0], 1);
3610 decimal_add(p, pArg);
3611 decimal_free(pArg);
3612 }
3613 static void decimalSumInverse(
3614 sqlite3_context *context,
3615 int argc,
3616 sqlite3_value **argv
3617 ){
3618 Decimal *p;
3619 Decimal *pArg;
3620 UNUSED_PARAMETER(argc);
3621 p = sqlite3_aggregate_context(context, sizeof(*p));
3622 if( p==0 ) return;
3623 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
3624 pArg = decimal_new(context, argv[0], 1);
3625 if( pArg ) pArg->sign = !pArg->sign;
3626 decimal_add(p, pArg);
3627 decimal_free(pArg);
3628 }
3629 static void decimalSumValue(sqlite3_context *context){
3630 Decimal *p = sqlite3_aggregate_context(context, 0);
3631 if( p==0 ) return;
3632 decimal_result(context, p);
3633 }
3634 static void decimalSumFinalize(sqlite3_context *context){
3635 Decimal *p = sqlite3_aggregate_context(context, 0);
3636 if( p==0 ) return;
3637 decimal_result(context, p);
3638 decimal_clear(p);
3639 }
3640
3641 /*
3642 ** SQL Function: decimal_mul(X, Y)
3643 **
3644 ** Return the product of X and Y.
3645 */
3646 static void decimalMulFunc(
3647 sqlite3_context *context,
3648 int argc,
3649 sqlite3_value **argv
3650 ){
3651 Decimal *pA = decimal_new(context, argv[0], 1);
3652 Decimal *pB = decimal_new(context, argv[1], 1);
3653 UNUSED_PARAMETER(argc);
3654 if( pA==0 || pA->oom || pA->isNull
3655 || pB==0 || pB->oom || pB->isNull
3656 ){
3657 goto mul_end;
3658 }
3659 decimalMul(pA, pB);
3660 if( pA->oom ){
3661 goto mul_end;
3662 }
3663 decimal_result(context, pA);
3664
3665 mul_end:
3666 decimal_free(pA);
3667 decimal_free(pB);
3668 }
3669
3670 /*
3671 ** SQL Function: decimal_pow2(N)
3672 **
3673 ** Return the N-th power of 2. N must be an integer.
3674 */
3675 static void decimalPow2Func(
3676 sqlite3_context *context,
3677 int argc,
3678 sqlite3_value **argv
3679 ){
3680 UNUSED_PARAMETER(argc);
3681 if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
3682 Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
3683 decimal_result_sci(context, pA);
3684 decimal_free(pA);
3685 }
3686 }
3687
3688 #ifdef _WIN32
3689
3690 #endif
3691 int sqlite3_decimal_init(
3692 sqlite3 *db,
3693 char **pzErrMsg,
3694 const sqlite3_api_routines *pApi
3695 ){
3696 int rc = SQLITE_OK;
3697 static const struct {
3698 const char *zFuncName;
3699 int nArg;
3700 int iArg;
3701 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
3702 } aFunc[] = {
3703 { "decimal", 1, 0, decimalFunc },
3704 { "decimal_exp", 1, 1, decimalFunc },
3705 { "decimal_cmp", 2, 0, decimalCmpFunc },
3706 { "decimal_add", 2, 0, decimalAddFunc },
3707 { "decimal_sub", 2, 0, decimalSubFunc },
3708 { "decimal_mul", 2, 0, decimalMulFunc },
3709 { "decimal_pow2", 1, 0, decimalPow2Func },
3710 };
3711 unsigned int i;
3712 (void)pzErrMsg; /* Unused parameter */
3713
3714 SQLITE_EXTENSION_INIT2(pApi);
3715
3716 for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
3717 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
3718 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
3719 aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
3720 }
3721 if( rc==SQLITE_OK ){
3722 rc = sqlite3_create_window_function(db, "decimal_sum", 1,
3723 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
3724 decimalSumStep, decimalSumFinalize,
3725 decimalSumValue, decimalSumInverse, 0);
3726 }
3727 if( rc==SQLITE_OK ){
3728 rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
3729 0, decimalCollFunc);
3730 }
3731 return rc;
3732 }
3733
3734 /************************* End ../ext/misc/decimal.c ********************/
3735 #undef sqlite3_base_init
3736 #define sqlite3_base_init sqlite3_base64_init
3737 /************************* Begin ../ext/misc/base64.c ******************/
3738 /*
3739 ** 2022-11-18
3740 **
3741 ** The author disclaims copyright to this source code. In place of
3742 ** a legal notice, here is a blessing:
3743 **
3744 ** May you do good and not evil.
3745 ** May you find forgiveness for yourself and forgive others.
3746 ** May you share freely, never taking more than you give.
3747 **
3748 *************************************************************************
3749 **
3750 ** This is a SQLite extension for converting in either direction
3751 ** between a (binary) blob and base64 text. Base64 can transit a
3752 ** sane USASCII channel unmolested. It also plays nicely in CSV or
3753 ** written as TCL brace-enclosed literals or SQL string literals,
3754 ** and can be used unmodified in XML-like documents.
3755 **
3756 ** This is an independent implementation of conversions specified in
3757 ** RFC 4648, done on the above date by the author (Larry Brasfield)
3758 ** who thereby has the right to put this into the public domain.
3759 **
3760 ** The conversions meet RFC 4648 requirements, provided that this
3761 ** C source specifies that line-feeds are included in the encoded
3762 ** data to limit visible line lengths to 72 characters and to
3763 ** terminate any encoded blob having non-zero length.
3764 **
3765 ** Length limitations are not imposed except that the runtime
3766 ** SQLite string or blob length limits are respected. Otherwise,
3767 ** any length binary sequence can be represented and recovered.
3768 ** Generated base64 sequences, with their line-feeds included,
3769 ** can be concatenated; the result converted back to binary will
3770 ** be the concatenation of the represented binary sequences.
3771 **
3772 ** This SQLite3 extension creates a function, base64(x), which
3773 ** either: converts text x containing base64 to a returned blob;
3774 ** or converts a blob x to returned text containing base64. An
3775 ** error will be thrown for other input argument types.
3776 **
3777 ** This code relies on UTF-8 encoding only with respect to the
3778 ** meaning of the first 128 (7-bit) codes matching that of USASCII.
3779 ** It will fail miserably if somehow made to try to convert EBCDIC.
3780 ** Because it is table-driven, it could be enhanced to handle that,
3781 ** but the world and SQLite have moved on from that anachronism.
3782 **
3783 ** To build the extension:
3784 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
3785 ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
3786 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
3787 ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
3788 ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
3789 */
3790
3791 #include <assert.h>
3792
3793 /* #include "sqlite3ext.h" */
3794
3795 #ifndef deliberate_fall_through
3796 /* Quiet some compilers about some of our intentional code. */
3797 # if GCC_VERSION>=7000000
3798 # define deliberate_fall_through __attribute__((fallthrough));
3799 # else
3800 # define deliberate_fall_through
3801 # endif
3802 #endif
3803
3804 SQLITE_EXTENSION_INIT1;
3805
3806 #define PC 0x80 /* pad character */
3807 #define WS 0x81 /* whitespace */
3808 #define ND 0x82 /* Not above or digit-value */
3809 #define PAD_CHAR '='
3810
3811 #ifndef U8_TYPEDEF
3812 /* typedef unsigned char u8; */
3813 #define U8_TYPEDEF
3814 #endif
3815
3816 /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
3817 static const u8 b64DigitValues[128] = {
3818 /* HT LF VT FF CR */
3819 ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
3820 /* US */
3821 ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
3822 /*sp + / */
3823 WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
3824 /* 0 1 5 9 = */
3825 52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
3826 /* A O */
3827 ND, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
3828 /* P Z */
3829 15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
3830 /* a o */
3831 ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
3832 /* p z */
3833 41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
3834 };
3835
3836 static const char b64Numerals[64+1]
3837 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3838
3839 #define BX_DV_PROTO(c) \
3840 ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
3841 #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
3842 #define IS_BX_WS(bdp) ((bdp)==WS)
3843 #define IS_BX_PAD(bdp) ((bdp)==PC)
3844 #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
3845 /* Width of base64 lines. Should be an integer multiple of 4. */
3846 #define B64_DARK_MAX 72
3847
3848 /* Encode a byte buffer into base64 text with linefeeds appended to limit
3849 ** encoded group lengths to B64_DARK_MAX or to terminate the last group.
3850 */
3851 static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
3852 int nCol = 0;
3853 while( nbIn >= 3 ){
3854 /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
3855 pOut[0] = BX_NUMERAL(pIn[0]>>2);
3856 pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
3857 pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
3858 pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
3859 pOut += 4;
3860 nbIn -= 3;
3861 pIn += 3;
3862 if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
3863 *pOut++ = '\n';
3864 nCol = 0;
3865 }
3866 }
3867 if( nbIn > 0 ){
3868 signed char nco = nbIn+1;
3869 int nbe;
3870 unsigned long qv = *pIn++;
3871 for( nbe=1; nbe<3; ++nbe ){
3872 qv <<= 8;
3873 if( nbe<nbIn ) qv |= *pIn++;
3874 }
3875 for( nbe=3; nbe>=0; --nbe ){
3876 char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
3877 qv >>= 6;
3878 pOut[nbe] = ce;
3879 }
3880 pOut += 4;
3881 *pOut++ = '\n';
3882 }
3883 *pOut = 0;
3884 return pOut;
3885 }
3886
3887 /* Skip over text which is not base64 numeral(s). */
3888 static char * skipNonB64( char *s, int nc ){
3889 char c;
3890 while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
3891 return s;
3892 }
3893
3894 /* Decode base64 text into a byte buffer. */
3895 static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
3896 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
3897 while( ncIn>0 && *pIn!=PAD_CHAR ){
3898 static signed char nboi[] = { 0, 0, 1, 2, 3 };
3899 char *pUse = skipNonB64(pIn, ncIn);
3900 unsigned long qv = 0L;
3901 int nti, nbo, nac;
3902 ncIn -= (pUse - pIn);
3903 pIn = pUse;
3904 nti = (ncIn>4)? 4 : ncIn;
3905 ncIn -= nti;
3906 nbo = nboi[nti];
3907 if( nbo==0 ) break;
3908 for( nac=0; nac<4; ++nac ){
3909 char c = (nac<nti)? *pIn++ : b64Numerals[0];
3910 u8 bdp = BX_DV_PROTO(c);
3911 switch( bdp ){
3912 case ND:
3913 /* Treat dark non-digits as pad, but they terminate decode too. */
3914 ncIn = 0;
3915 deliberate_fall_through;
3916 case WS:
3917 /* Treat whitespace as pad and terminate this group.*/
3918 nti = nac;
3919 deliberate_fall_through;
3920 case PC:
3921 bdp = 0;
3922 --nbo;
3923 deliberate_fall_through;
3924 default: /* bdp is the digit value. */
3925 qv = qv<<6 | bdp;
3926 break;
3927 }
3928 }
3929 switch( nbo ){
3930 case 3:
3931 pOut[2] = (qv) & 0xff;
3932 case 2:
3933 pOut[1] = (qv>>8) & 0xff;
3934 case 1:
3935 pOut[0] = (qv>>16) & 0xff;
3936 }
3937 pOut += nbo;
3938 }
3939 return pOut;
3940 }
3941
3942 /* This function does the work for the SQLite base64(x) UDF. */
3943 static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
3944 int nb, nc, nv = sqlite3_value_bytes(av[0]);
3945 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
3946 SQLITE_LIMIT_LENGTH, -1);
3947 char *cBuf;
3948 u8 *bBuf;
3949 assert(na==1);
3950 switch( sqlite3_value_type(av[0]) ){
3951 case SQLITE_BLOB:
3952 nb = nv;
3953 nc = 4*(nv+2/3); /* quads needed */
3954 nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
3955 if( nvMax < nc ){
3956 sqlite3_result_error(context, "blob expanded to base64 too big", -1);
3957 return;
3958 }
3959 bBuf = (u8*)sqlite3_value_blob(av[0]);
3960 if( !bBuf ){
3961 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
3962 goto memFail;
3963 }
3964 sqlite3_result_text(context,"",-1,SQLITE_STATIC);
3965 break;
3966 }
3967 cBuf = sqlite3_malloc(nc);
3968 if( !cBuf ) goto memFail;
3969 nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
3970 sqlite3_result_text(context, cBuf, nc, sqlite3_free);
3971 break;
3972 case SQLITE_TEXT:
3973 nc = nv;
3974 nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
3975 if( nvMax < nb ){
3976 sqlite3_result_error(context, "blob from base64 may be too big", -1);
3977 return;
3978 }else if( nb<1 ){
3979 nb = 1;
3980 }
3981 cBuf = (char *)sqlite3_value_text(av[0]);
3982 if( !cBuf ){
3983 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
3984 goto memFail;
3985 }
3986 sqlite3_result_zeroblob(context, 0);
3987 break;
3988 }
3989 bBuf = sqlite3_malloc(nb);
3990 if( !bBuf ) goto memFail;
3991 nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
3992 sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
3993 break;
3994 default:
3995 sqlite3_result_error(context, "base64 accepts only blob or text", -1);
3996 return;
3997 }
3998 return;
3999 memFail:
4000 sqlite3_result_error(context, "base64 OOM", -1);
4001 }
4002
4003 /*
4004 ** Establish linkage to running SQLite library.
4005 */
4006 #ifndef SQLITE_SHELL_EXTFUNCS
4007 #ifdef _WIN32
4008
4009 #endif
4010 int sqlite3_base_init
4011 #else
4012 static int sqlite3_base64_init
4013 #endif
4014 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
4015 SQLITE_EXTENSION_INIT2(pApi);
4016 (void)pzErr;
4017 return sqlite3_create_function
4018 (db, "base64", 1,
4019 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
4020 0, base64, 0, 0);
4021 }
4022
4023 /*
4024 ** Define some macros to allow this extension to be built into the shell
4025 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
4026 ** allows shell.c, as distributed, to have this extension built in.
4027 */
4028 #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
4029 #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
4030
4031 /************************* End ../ext/misc/base64.c ********************/
4032 #undef sqlite3_base_init
4033 #define sqlite3_base_init sqlite3_base85_init
4034 #define OMIT_BASE85_CHECKER
4035 /************************* Begin ../ext/misc/base85.c ******************/
4036 /*
4037 ** 2022-11-16
4038 **
4039 ** The author disclaims copyright to this source code. In place of
4040 ** a legal notice, here is a blessing:
4041 **
4042 ** May you do good and not evil.
4043 ** May you find forgiveness for yourself and forgive others.
4044 ** May you share freely, never taking more than you give.
4045 **
4046 *************************************************************************
4047 **
4048 ** This is a utility for converting binary to base85 or vice-versa.
4049 ** It can be built as a standalone program or an SQLite3 extension.
4050 **
4051 ** Much like base64 representations, base85 can be sent through a
4052 ** sane USASCII channel unmolested. It also plays nicely in CSV or
4053 ** written as TCL brace-enclosed literals or SQL string literals.
4054 ** It is not suited for unmodified use in XML-like documents.
4055 **
4056 ** The encoding used resembles Ascii85, but was devised by the author
4057 ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
4058 ** variant sources existed, in the 1984 timeframe on a VAX mainframe.
4059 ** Further, this is an independent implementation of a base85 system.
4060 ** Hence, the author has rightfully put this into the public domain.
4061 **
4062 ** Base85 numerals are taken from the set of 7-bit USASCII codes,
4063 ** excluding control characters and Space ! " ' ( ) { | } ~ Del
4064 ** in code order representing digit values 0 to 84 (base 10.)
4065 **
4066 ** Groups of 4 bytes, interpreted as big-endian 32-bit values,
4067 ** are represented as 5-digit base85 numbers with MS to LS digit
4068 ** order. Groups of 1-3 bytes are represented with 2-4 digits,
4069 ** still big-endian but 8-24 bit values. (Using big-endian yields
4070 ** the simplest transition to byte groups smaller than 4 bytes.
4071 ** These byte groups can also be considered base-256 numbers.)
4072 ** Groups of 0 bytes are represented with 0 digits and vice-versa.
4073 ** No pad characters are used; Encoded base85 numeral sequence
4074 ** (aka "group") length maps 1-to-1 to the decoded binary length.
4075 **
4076 ** Any character not in the base85 numeral set delimits groups.
4077 ** When base85 is streamed or stored in containers of indefinite
4078 ** size, newline is used to separate it into sub-sequences of no
4079 ** more than 80 digits so that fgets() can be used to read it.
4080 **
4081 ** Length limitations are not imposed except that the runtime
4082 ** SQLite string or blob length limits are respected. Otherwise,
4083 ** any length binary sequence can be represented and recovered.
4084 ** Base85 sequences can be concatenated by separating them with
4085 ** a non-base85 character; the conversion to binary will then
4086 ** be the concatenation of the represented binary sequences.
4087
4088 ** The standalone program either converts base85 on stdin to create
4089 ** a binary file or converts a binary file to base85 on stdout.
4090 ** Read or make it blurt its help for invocation details.
4091 **
4092 ** The SQLite3 extension creates a function, base85(x), which will
4093 ** either convert text base85 to a blob or a blob to text base85
4094 ** and return the result (or throw an error for other types.)
4095 ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
4096 ** function, is_base85(t), which returns 1 iff the text t contains
4097 ** nothing other than base85 numerals and whitespace, or 0 otherwise.
4098 **
4099 ** To build the extension:
4100 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
4101 ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
4102 ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
4103 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
4104 ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
4105 ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
4106 **
4107 ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
4108 ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
4109 ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
4110 ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
4111 */
4112
4113 #include <stdio.h>
4114 #include <memory.h>
4115 #include <string.h>
4116 #include <assert.h>
4117 #ifndef OMIT_BASE85_CHECKER
4118 # include <ctype.h>
4119 #endif
4120
4121 #ifndef BASE85_STANDALONE
4122
4123 /* # include "sqlite3ext.h" */
4124
4125 SQLITE_EXTENSION_INIT1;
4126
4127 #else
4128
4129 # ifdef _WIN32
4130 # include <io.h>
4131 # include <fcntl.h>
4132 # else
4133 # define setmode(fd,m)
4134 # endif
4135
4136 static char *zHelp =
4137 "Usage: base85 <dirFlag> <binFile>\n"
4138 " <dirFlag> is either -r to read or -w to write <binFile>,\n"
4139 " content to be converted to/from base85 on stdout/stdin.\n"
4140 " <binFile> names a binary file to be rendered or created.\n"
4141 " Or, the name '-' refers to the stdin or stdout stream.\n"
4142 ;
4143
4144 static void sayHelp(){
4145 printf("%s", zHelp);
4146 }
4147 #endif
4148
4149 #ifndef U8_TYPEDEF
4150 /* typedef unsigned char u8; */
4151 #define U8_TYPEDEF
4152 #endif
4153
4154 /* Classify c according to interval within USASCII set w.r.t. base85
4155 * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
4156 */
4157 #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
4158
4159 /* Provide digitValue to b85Numeral offset as a function of above class. */
4160 static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
4161 #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
4162
4163 /* Say whether c is a base85 numeral. */
4164 #define IS_B85( c ) (B85_CLASS(c) & 1)
4165
4166 #if 0 /* Not used, */
4167 static u8 base85DigitValue( char c ){
4168 u8 dv = (u8)(c - '#');
4169 if( dv>87 ) return 0xff;
4170 return (dv > 3)? dv-3 : dv;
4171 }
4172 #endif
4173
4174 /* Width of base64 lines. Should be an integer multiple of 5. */
4175 #define B85_DARK_MAX 80
4176
4177
4178 static char * skipNonB85( char *s, int nc ){
4179 char c;
4180 while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
4181 return s;
4182 }
4183
4184 /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
4185 * Do not use the macro form with argument expression having a side-effect.*/
4186 #if 0
4187 static char base85Numeral( u8 b ){
4188 return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
4189 }
4190 #else
4191 # define base85Numeral( dn )\
4192 ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
4193 #endif
4194
4195 static char *putcs(char *pc, char *s){
4196 char c;
4197 while( (c = *s++)!=0 ) *pc++ = c;
4198 return pc;
4199 }
4200
4201 /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
4202 ** to be appended to encoded groups to limit their length to B85_DARK_MAX
4203 ** or to terminate the last group (to aid concatenation.)
4204 */
4205 static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
4206 int nCol = 0;
4207 while( nbIn >= 4 ){
4208 int nco = 5;
4209 unsigned long qbv = (((unsigned long)pIn[0])<<24) |
4210 (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
4211 while( nco > 0 ){
4212 unsigned nqv = (unsigned)(qbv/85UL);
4213 unsigned char dv = qbv - 85UL*nqv;
4214 qbv = nqv;
4215 pOut[--nco] = base85Numeral(dv);
4216 }
4217 nbIn -= 4;
4218 pIn += 4;
4219 pOut += 5;
4220 if( pSep && (nCol += 5)>=B85_DARK_MAX ){
4221 pOut = putcs(pOut, pSep);
4222 nCol = 0;
4223 }
4224 }
4225 if( nbIn > 0 ){
4226 int nco = nbIn + 1;
4227 unsigned long qv = *pIn++;
4228 int nbe = 1;
4229 while( nbe++ < nbIn ){
4230 qv = (qv<<8) | *pIn++;
4231 }
4232 nCol += nco;
4233 while( nco > 0 ){
4234 u8 dv = (u8)(qv % 85);
4235 qv /= 85;
4236 pOut[--nco] = base85Numeral(dv);
4237 }
4238 pOut += (nbIn+1);
4239 }
4240 if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
4241 *pOut = 0;
4242 return pOut;
4243 }
4244
4245 /* Decode base85 text into a byte buffer. */
4246 static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
4247 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
4248 while( ncIn>0 ){
4249 static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
4250 char *pUse = skipNonB85(pIn, ncIn);
4251 unsigned long qv = 0L;
4252 int nti, nbo;
4253 ncIn -= (pUse - pIn);
4254 pIn = pUse;
4255 nti = (ncIn>5)? 5 : ncIn;
4256 nbo = nboi[nti];
4257 if( nbo==0 ) break;
4258 while( nti>0 ){
4259 char c = *pIn++;
4260 u8 cdo = B85_DNOS(c);
4261 --ncIn;
4262 if( cdo==0 ) break;
4263 qv = 85 * qv + (c - cdo);
4264 --nti;
4265 }
4266 nbo -= nti; /* Adjust for early (non-digit) end of group. */
4267 switch( nbo ){
4268 case 4:
4269 *pOut++ = (qv >> 24)&0xff;
4270 case 3:
4271 *pOut++ = (qv >> 16)&0xff;
4272 case 2:
4273 *pOut++ = (qv >> 8)&0xff;
4274 case 1:
4275 *pOut++ = qv&0xff;
4276 case 0:
4277 break;
4278 }
4279 }
4280 return pOut;
4281 }
4282
4283 #ifndef OMIT_BASE85_CHECKER
4284 /* Say whether input char sequence is all (base85 and/or whitespace).*/
4285 static int allBase85( char *p, int len ){
4286 char c;
4287 while( len-- > 0 && (c = *p++) != 0 ){
4288 if( !IS_B85(c) && !isspace(c) ) return 0;
4289 }
4290 return 1;
4291 }
4292 #endif
4293
4294 #ifndef BASE85_STANDALONE
4295
4296 # ifndef OMIT_BASE85_CHECKER
4297 /* This function does the work for the SQLite is_base85(t) UDF. */
4298 static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
4299 assert(na==1);
4300 switch( sqlite3_value_type(av[0]) ){
4301 case SQLITE_TEXT:
4302 {
4303 int rv = allBase85( (char *)sqlite3_value_text(av[0]),
4304 sqlite3_value_bytes(av[0]) );
4305 sqlite3_result_int(context, rv);
4306 }
4307 break;
4308 case SQLITE_NULL:
4309 sqlite3_result_null(context);
4310 break;
4311 default:
4312 sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
4313 return;
4314 }
4315 }
4316 # endif
4317
4318 /* This function does the work for the SQLite base85(x) UDF. */
4319 static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
4320 int nb, nc, nv = sqlite3_value_bytes(av[0]);
4321 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
4322 SQLITE_LIMIT_LENGTH, -1);
4323 char *cBuf;
4324 u8 *bBuf;
4325 assert(na==1);
4326 switch( sqlite3_value_type(av[0]) ){
4327 case SQLITE_BLOB:
4328 nb = nv;
4329 /* ulongs tail newlines tailenc+nul*/
4330 nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
4331 if( nvMax < nc ){
4332 sqlite3_result_error(context, "blob expanded to base85 too big", -1);
4333 return;
4334 }
4335 bBuf = (u8*)sqlite3_value_blob(av[0]);
4336 if( !bBuf ){
4337 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4338 goto memFail;
4339 }
4340 sqlite3_result_text(context,"",-1,SQLITE_STATIC);
4341 break;
4342 }
4343 cBuf = sqlite3_malloc(nc);
4344 if( !cBuf ) goto memFail;
4345 nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
4346 sqlite3_result_text(context, cBuf, nc, sqlite3_free);
4347 break;
4348 case SQLITE_TEXT:
4349 nc = nv;
4350 nb = 4*(nv/5) + nv%5; /* may overestimate */
4351 if( nvMax < nb ){
4352 sqlite3_result_error(context, "blob from base85 may be too big", -1);
4353 return;
4354 }else if( nb<1 ){
4355 nb = 1;
4356 }
4357 cBuf = (char *)sqlite3_value_text(av[0]);
4358 if( !cBuf ){
4359 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4360 goto memFail;
4361 }
4362 sqlite3_result_zeroblob(context, 0);
4363 break;
4364 }
4365 bBuf = sqlite3_malloc(nb);
4366 if( !bBuf ) goto memFail;
4367 nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
4368 sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
4369 break;
4370 default:
4371 sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
4372 return;
4373 }
4374 return;
4375 memFail:
4376 sqlite3_result_error(context, "base85 OOM", -1);
4377 }
4378
4379 /*
4380 ** Establish linkage to running SQLite library.
4381 */
4382 #ifndef SQLITE_SHELL_EXTFUNCS
4383 #ifdef _WIN32
4384
4385 #endif
4386 int sqlite3_base_init
4387 #else
4388 static int sqlite3_base85_init
4389 #endif
4390 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
4391 SQLITE_EXTENSION_INIT2(pApi);
4392 (void)pzErr;
4393 # ifndef OMIT_BASE85_CHECKER
4394 {
4395 int rc = sqlite3_create_function
4396 (db, "is_base85", 1,
4397 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
4398 0, is_base85, 0, 0);
4399 if( rc!=SQLITE_OK ) return rc;
4400 }
4401 # endif
4402 return sqlite3_create_function
4403 (db, "base85", 1,
4404 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
4405 0, base85, 0, 0);
4406 }
4407
4408 /*
4409 ** Define some macros to allow this extension to be built into the shell
4410 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
4411 ** allows shell.c, as distributed, to have this extension built in.
4412 */
4413 # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
4414 # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
4415
4416 #else /* standalone program */
4417
4418 int main(int na, char *av[]){
4419 int cin;
4420 int rc = 0;
4421 u8 bBuf[4*(B85_DARK_MAX/5)];
4422 char cBuf[5*(sizeof(bBuf)/4)+2];
4423 size_t nio;
4424 # ifndef OMIT_BASE85_CHECKER
4425 int b85Clean = 1;
4426 # endif
4427 char rw;
4428 FILE *fb = 0, *foc = 0;
4429 char fmode[3] = "xb";
4430 if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
4431 sayHelp();
4432 return 0;
4433 }
4434 fmode[0] = rw;
4435 if( av[2][0]=='-' && av[2][1]==0 ){
4436 switch( rw ){
4437 case 'r':
4438 fb = stdin;
4439 setmode(fileno(stdin), O_BINARY);
4440 break;
4441 case 'w':
4442 fb = stdout;
4443 setmode(fileno(stdout), O_BINARY);
4444 break;
4445 }
4446 }else{
4447 fb = fopen(av[2], fmode);
4448 foc = fb;
4449 }
4450 if( !fb ){
4451 fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
4452 rc = 1;
4453 }else{
4454 switch( rw ){
4455 case 'r':
4456 while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
4457 toBase85( bBuf, (int)nio, cBuf, 0 );
4458 fprintf(stdout, "%s\n", cBuf);
4459 }
4460 break;
4461 case 'w':
4462 while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
4463 int nc = strlen(cBuf);
4464 size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
4465 if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
4466 # ifndef OMIT_BASE85_CHECKER
4467 b85Clean &= allBase85( cBuf, nc );
4468 # endif
4469 }
4470 break;
4471 default:
4472 sayHelp();
4473 rc = 1;
4474 }
4475 if( foc ) fclose(foc);
4476 }
4477 # ifndef OMIT_BASE85_CHECKER
4478 if( !b85Clean ){
4479 fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
4480 }
4481 # endif
4482 return rc;
4483 }
4484
4485 #endif
4486
4487 /************************* End ../ext/misc/base85.c ********************/
4488 /************************* Begin ../ext/misc/ieee754.c ******************/
4489 /*
4490 ** 2013-04-17
4491 **
4492 ** The author disclaims copyright to this source code. In place of
4493 ** a legal notice, here is a blessing:
4494 **
4495 ** May you do good and not evil.
4496 ** May you find forgiveness for yourself and forgive others.
4497 ** May you share freely, never taking more than you give.
4498 **
4499 ******************************************************************************
4500 **
4501 ** This SQLite extension implements functions for the exact display
4502 ** and input of IEEE754 Binary64 floating-point numbers.
4503 **
4504 ** ieee754(X)
4505 ** ieee754(Y,Z)
4506 **
4507 ** In the first form, the value X should be a floating-point number.
4508 ** The function will return a string of the form 'ieee754(Y,Z)' where
4509 ** Y and Z are integers such that X==Y*pow(2,Z).
4510 **
4511 ** In the second form, Y and Z are integers which are the mantissa and
4512 ** base-2 exponent of a new floating point number. The function returns
4513 ** a floating-point value equal to Y*pow(2,Z).
4514 **
4515 ** Examples:
4516 **
4517 ** ieee754(2.0) -> 'ieee754(2,0)'
4518 ** ieee754(45.25) -> 'ieee754(181,-2)'
4519 ** ieee754(2, 0) -> 2.0
4520 ** ieee754(181, -2) -> 45.25
4521 **
4522 ** Two additional functions break apart the one-argument ieee754()
4523 ** result into separate integer values:
4524 **
4525 ** ieee754_mantissa(45.25) -> 181
4526 ** ieee754_exponent(45.25) -> -2
4527 **
4528 ** These functions convert binary64 numbers into blobs and back again.
4529 **
4530 ** ieee754_from_blob(x'3ff0000000000000') -> 1.0
4531 ** ieee754_to_blob(1.0) -> x'3ff0000000000000'
4532 **
4533 ** In all single-argument functions, if the argument is an 8-byte blob
4534 ** then that blob is interpreted as a big-endian binary64 value.
4535 **
4536 **
4537 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
4538 ** -----------------------------------------------
4539 **
4540 ** This extension in combination with the separate 'decimal' extension
4541 ** can be used to compute the exact decimal representation of binary64
4542 ** values. To begin, first compute a table of exponent values:
4543 **
4544 ** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
4545 ** WITH RECURSIVE c(x,v) AS (
4546 ** VALUES(0,'1')
4547 ** UNION ALL
4548 ** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
4549 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
4550 ** WITH RECURSIVE c(x,v) AS (
4551 ** VALUES(-1,'0.5')
4552 ** UNION ALL
4553 ** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
4554 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
4555 **
4556 ** Then, to compute the exact decimal representation of a floating
4557 ** point value (the value 47.49 is used in the example) do:
4558 **
4559 ** WITH c(n) AS (VALUES(47.49))
4560 ** ---------------^^^^^---- Replace with whatever you want
4561 ** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
4562 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
4563 **
4564 ** Here is a query to show various boundry values for the binary64
4565 ** number format:
4566 **
4567 ** WITH c(name,bin) AS (VALUES
4568 ** ('minimum positive value', x'0000000000000001'),
4569 ** ('maximum subnormal value', x'000fffffffffffff'),
4570 ** ('mininum positive nornal value', x'0010000000000000'),
4571 ** ('maximum value', x'7fefffffffffffff'))
4572 ** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
4573 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
4574 **
4575 */
4576 /* #include "sqlite3ext.h" */
4577 SQLITE_EXTENSION_INIT1
4578 #include <assert.h>
4579 #include <string.h>
4580
4581 /* Mark a function parameter as unused, to suppress nuisance compiler
4582 ** warnings. */
4583 #ifndef UNUSED_PARAMETER
4584 # define UNUSED_PARAMETER(X) (void)(X)
4585 #endif
4586
4587 /*
4588 ** Implementation of the ieee754() function
4589 */
4590 static void ieee754func(
4591 sqlite3_context *context,
4592 int argc,
4593 sqlite3_value **argv
4594 ){
4595 if( argc==1 ){
4596 sqlite3_int64 m, a;
4597 double r;
4598 int e;
4599 int isNeg;
4600 char zResult[100];
4601 assert( sizeof(m)==sizeof(r) );
4602 if( sqlite3_value_type(argv[0])==SQLITE_BLOB
4603 && sqlite3_value_bytes(argv[0])==sizeof(r)
4604 ){
4605 const unsigned char *x = sqlite3_value_blob(argv[0]);
4606 unsigned int i;
4607 sqlite3_uint64 v = 0;
4608 for(i=0; i<sizeof(r); i++){
4609 v = (v<<8) | x[i];
4610 }
4611 memcpy(&r, &v, sizeof(r));
4612 }else{
4613 r = sqlite3_value_double(argv[0]);
4614 }
4615 if( r<0.0 ){
4616 isNeg = 1;
4617 r = -r;
4618 }else{
4619 isNeg = 0;
4620 }
4621 memcpy(&a,&r,sizeof(a));
4622 if( a==0 ){
4623 e = 0;
4624 m = 0;
4625 }else{
4626 e = a>>52;
4627 m = a & ((((sqlite3_int64)1)<<52)-1);
4628 if( e==0 ){
4629 m <<= 1;
4630 }else{
4631 m |= ((sqlite3_int64)1)<<52;
4632 }
4633 while( e<1075 && m>0 && (m&1)==0 ){
4634 m >>= 1;
4635 e++;
4636 }
4637 if( isNeg ) m = -m;
4638 }
4639 switch( *(int*)sqlite3_user_data(context) ){
4640 case 0:
4641 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
4642 m, e-1075);
4643 sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
4644 break;
4645 case 1:
4646 sqlite3_result_int64(context, m);
4647 break;
4648 case 2:
4649 sqlite3_result_int(context, e-1075);
4650 break;
4651 }
4652 }else{
4653 sqlite3_int64 m, e, a;
4654 double r;
4655 int isNeg = 0;
4656 m = sqlite3_value_int64(argv[0]);
4657 e = sqlite3_value_int64(argv[1]);
4658
4659 /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */
4660 if( e>10000 ){
4661 e = 10000;
4662 }else if( e<-10000 ){
4663 e = -10000;
4664 }
4665
4666 if( m<0 ){
4667 isNeg = 1;
4668 m = -m;
4669 if( m<0 ) return;
4670 }else if( m==0 && e>-1000 && e<1000 ){
4671 sqlite3_result_double(context, 0.0);
4672 return;
4673 }
4674 while( (m>>32)&0xffe00000 ){
4675 m >>= 1;
4676 e++;
4677 }
4678 while( m!=0 && ((m>>32)&0xfff00000)==0 ){
4679 m <<= 1;
4680 e--;
4681 }
4682 e += 1075;
4683 if( e<=0 ){
4684 /* Subnormal */
4685 if( 1-e >= 64 ){
4686 m = 0;
4687 }else{
4688 m >>= 1-e;
4689 }
4690 e = 0;
4691 }else if( e>0x7ff ){
4692 e = 0x7ff;
4693 }
4694 a = m & ((((sqlite3_int64)1)<<52)-1);
4695 a |= e<<52;
4696 if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
4697 memcpy(&r, &a, sizeof(r));
4698 sqlite3_result_double(context, r);
4699 }
4700 }
4701
4702 /*
4703 ** Functions to convert between blobs and floats.
4704 */
4705 static void ieee754func_from_blob(
4706 sqlite3_context *context,
4707 int argc,
4708 sqlite3_value **argv
4709 ){
4710 UNUSED_PARAMETER(argc);
4711 if( sqlite3_value_type(argv[0])==SQLITE_BLOB
4712 && sqlite3_value_bytes(argv[0])==sizeof(double)
4713 ){
4714 double r;
4715 const unsigned char *x = sqlite3_value_blob(argv[0]);
4716 unsigned int i;
4717 sqlite3_uint64 v = 0;
4718 for(i=0; i<sizeof(r); i++){
4719 v = (v<<8) | x[i];
4720 }
4721 memcpy(&r, &v, sizeof(r));
4722 sqlite3_result_double(context, r);
4723 }
4724 }
4725 static void ieee754func_to_blob(
4726 sqlite3_context *context,
4727 int argc,
4728 sqlite3_value **argv
4729 ){
4730 UNUSED_PARAMETER(argc);
4731 if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
4732 || sqlite3_value_type(argv[0])==SQLITE_INTEGER
4733 ){
4734 double r = sqlite3_value_double(argv[0]);
4735 sqlite3_uint64 v;
4736 unsigned char a[sizeof(r)];
4737 unsigned int i;
4738 memcpy(&v, &r, sizeof(r));
4739 for(i=1; i<=sizeof(r); i++){
4740 a[sizeof(r)-i] = v&0xff;
4741 v >>= 8;
4742 }
4743 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
4744 }
4745 }
4746
4747 /*
4748 ** SQL Function: ieee754_inc(r,N)
4749 **
4750 ** Move the floating point value r by N quantums and return the new
4751 ** values.
4752 **
4753 ** Behind the scenes: this routine merely casts r into a 64-bit unsigned
4754 ** integer, adds N, then casts the value back into float.
4755 **
4756 ** Example: To find the smallest positive number:
4757 **
4758 ** SELECT ieee754_inc(0.0,+1);
4759 */
4760 static void ieee754inc(
4761 sqlite3_context *context,
4762 int argc,
4763 sqlite3_value **argv
4764 ){
4765 double r;
4766 sqlite3_int64 N;
4767 sqlite3_uint64 m1, m2;
4768 double r2;
4769 UNUSED_PARAMETER(argc);
4770 r = sqlite3_value_double(argv[0]);
4771 N = sqlite3_value_int64(argv[1]);
4772 memcpy(&m1, &r, 8);
4773 m2 = m1 + N;
4774 memcpy(&r2, &m2, 8);
4775 sqlite3_result_double(context, r2);
4776 }
4777
4778
4779 #ifdef _WIN32
4780
4781 #endif
4782 int sqlite3_ieee_init(
4783 sqlite3 *db,
4784 char **pzErrMsg,
4785 const sqlite3_api_routines *pApi
4786 ){
4787 static const struct {
4788 char *zFName;
4789 int nArg;
4790 int iAux;
4791 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
4792 } aFunc[] = {
4793 { "ieee754", 1, 0, ieee754func },
4794 { "ieee754", 2, 0, ieee754func },
4795 { "ieee754_mantissa", 1, 1, ieee754func },
4796 { "ieee754_exponent", 1, 2, ieee754func },
4797 { "ieee754_to_blob", 1, 0, ieee754func_to_blob },
4798 { "ieee754_from_blob", 1, 0, ieee754func_from_blob },
4799 { "ieee754_inc", 2, 0, ieee754inc },
4800 };
4801 unsigned int i;
4802 int rc = SQLITE_OK;
4803 SQLITE_EXTENSION_INIT2(pApi);
4804 (void)pzErrMsg; /* Unused parameter */
4805 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
4806 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
4807 SQLITE_UTF8|SQLITE_INNOCUOUS,
4808 (void*)&aFunc[i].iAux,
4809 aFunc[i].xFunc, 0, 0);
4810 }
4811 return rc;
4812 }
4813
4814 /************************* End ../ext/misc/ieee754.c ********************/
4815 /************************* Begin ../ext/misc/series.c ******************/
4816 /*
4817 ** 2015-08-18, 2023-04-28
4818 **
4819 ** The author disclaims copyright to this source code. In place of
4820 ** a legal notice, here is a blessing:
4821 **
4822 ** May you do good and not evil.
4823 ** May you find forgiveness for yourself and forgive others.
4824 ** May you share freely, never taking more than you give.
4825 **
4826 *************************************************************************
4827 **
4828 ** This file demonstrates how to create a table-valued-function using
4829 ** a virtual table. This demo implements the generate_series() function
4830 ** which gives the same results as the eponymous function in PostgreSQL,
4831 ** within the limitation that its arguments are signed 64-bit integers.
4832 **
4833 ** Considering its equivalents to generate_series(start,stop,step): A
4834 ** value V[n] sequence is produced for integer n ascending from 0 where
4835 ** ( V[n] == start + n * step && sgn(V[n] - stop) * sgn(step) >= 0 )
4836 ** for each produced value (independent of production time ordering.)
4837 **
4838 ** All parameters must be either integer or convertable to integer.
4839 ** The start parameter is required.
4840 ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
4841 ** The step parameter defaults to 1 and 0 is treated as 1.
4842 **
4843 ** Examples:
4844 **
4845 ** SELECT * FROM generate_series(0,100,5);
4846 **
4847 ** The query above returns integers from 0 through 100 counting by steps
4848 ** of 5.
4849 **
4850 ** SELECT * FROM generate_series(0,100);
4851 **
4852 ** Integers from 0 through 100 with a step size of 1.
4853 **
4854 ** SELECT * FROM generate_series(20) LIMIT 10;
4855 **
4856 ** Integers 20 through 29.
4857 **
4858 ** SELECT * FROM generate_series(0,-100,-5);
4859 **
4860 ** Integers 0 -5 -10 ... -100.
4861 **
4862 ** SELECT * FROM generate_series(0,-1);
4863 **
4864 ** Empty sequence.
4865 **
4866 ** HOW IT WORKS
4867 **
4868 ** The generate_series "function" is really a virtual table with the
4869 ** following schema:
4870 **
4871 ** CREATE TABLE generate_series(
4872 ** value,
4873 ** start HIDDEN,
4874 ** stop HIDDEN,
4875 ** step HIDDEN
4876 ** );
4877 **
4878 ** The virtual table also has a rowid, logically equivalent to n+1 where
4879 ** "n" is the ascending integer in the aforesaid production definition.
4880 **
4881 ** Function arguments in queries against this virtual table are translated
4882 ** into equality constraints against successive hidden columns. In other
4883 ** words, the following pairs of queries are equivalent to each other:
4884 **
4885 ** SELECT * FROM generate_series(0,100,5);
4886 ** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
4887 **
4888 ** SELECT * FROM generate_series(0,100);
4889 ** SELECT * FROM generate_series WHERE start=0 AND stop=100;
4890 **
4891 ** SELECT * FROM generate_series(20) LIMIT 10;
4892 ** SELECT * FROM generate_series WHERE start=20 LIMIT 10;
4893 **
4894 ** The generate_series virtual table implementation leaves the xCreate method
4895 ** set to NULL. This means that it is not possible to do a CREATE VIRTUAL
4896 ** TABLE command with "generate_series" as the USING argument. Instead, there
4897 ** is a single generate_series virtual table that is always available without
4898 ** having to be created first.
4899 **
4900 ** The xBestIndex method looks for equality constraints against the hidden
4901 ** start, stop, and step columns, and if present, it uses those constraints
4902 ** to bound the sequence of generated values. If the equality constraints
4903 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
4904 ** xBestIndex returns a small cost when both start and stop are available,
4905 ** and a very large cost if either start or stop are unavailable. This
4906 ** encourages the query planner to order joins such that the bounds of the
4907 ** series are well-defined.
4908 */
4909 /* #include "sqlite3ext.h" */
4910 SQLITE_EXTENSION_INIT1
4911 #include <assert.h>
4912 #include <string.h>
4913 #include <limits.h>
4914
4915 #ifndef SQLITE_OMIT_VIRTUALTABLE
4916 /*
4917 ** Return that member of a generate_series(...) sequence whose 0-based
4918 ** index is ix. The 0th member is given by smBase. The sequence members
4919 ** progress per ix increment by smStep.
4920 */
4921 static sqlite3_int64 genSeqMember(sqlite3_int64 smBase,
4922 sqlite3_int64 smStep,
4923 sqlite3_uint64 ix){
4924 if( ix>=(sqlite3_uint64)LLONG_MAX ){
4925 /* Get ix into signed i64 range. */
4926 ix -= (sqlite3_uint64)LLONG_MAX;
4927 /* With 2's complement ALU, this next can be 1 step, but is split into
4928 * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
4929 smBase += (LLONG_MAX/2) * smStep;
4930 smBase += (LLONG_MAX - LLONG_MAX/2) * smStep;
4931 }
4932 /* Under UBSAN (or on 1's complement machines), must do this last term
4933 * in steps to avoid the dreaded (and harmless) signed multiply overlow. */
4934 if( ix>=2 ){
4935 sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
4936 smBase += ix2*smStep;
4937 ix -= ix2;
4938 }
4939 return smBase + ((sqlite3_int64)ix)*smStep;
4940 }
4941
4942 /* typedef unsigned char u8; */
4943
4944 typedef struct SequenceSpec {
4945 sqlite3_int64 iBase; /* Starting value ("start") */
4946 sqlite3_int64 iTerm; /* Given terminal value ("stop") */
4947 sqlite3_int64 iStep; /* Increment ("step") */
4948 sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
4949 sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
4950 sqlite3_int64 iValueNow; /* Current value during generation */
4951 u8 isNotEOF; /* Sequence generation not exhausted */
4952 u8 isReversing; /* Sequence is being reverse generated */
4953 } SequenceSpec;
4954
4955 /*
4956 ** Prepare a SequenceSpec for use in generating an integer series
4957 ** given initialized iBase, iTerm and iStep values. Sequence is
4958 ** initialized per given isReversing. Other members are computed.
4959 */
4960 static void setupSequence( SequenceSpec *pss ){
4961 int bSameSigns;
4962 pss->uSeqIndexMax = 0;
4963 pss->isNotEOF = 0;
4964 bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
4965 if( pss->iTerm < pss->iBase ){
4966 sqlite3_uint64 nuspan = 0;
4967 if( bSameSigns ){
4968 nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
4969 }else{
4970 /* Under UBSAN (or on 1's complement machines), must do this in steps.
4971 * In this clause, iBase>=0 and iTerm<0 . */
4972 nuspan = 1;
4973 nuspan += pss->iBase;
4974 nuspan += -(pss->iTerm+1);
4975 }
4976 if( pss->iStep<0 ){
4977 pss->isNotEOF = 1;
4978 if( nuspan==ULONG_MAX ){
4979 pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
4980 }else if( pss->iStep>LLONG_MIN ){
4981 pss->uSeqIndexMax = nuspan/-pss->iStep;
4982 }
4983 }
4984 }else if( pss->iTerm > pss->iBase ){
4985 sqlite3_uint64 puspan = 0;
4986 if( bSameSigns ){
4987 puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
4988 }else{
4989 /* Under UBSAN (or on 1's complement machines), must do this in steps.
4990 * In this clause, iTerm>=0 and iBase<0 . */
4991 puspan = 1;
4992 puspan += pss->iTerm;
4993 puspan += -(pss->iBase+1);
4994 }
4995 if( pss->iStep>0 ){
4996 pss->isNotEOF = 1;
4997 pss->uSeqIndexMax = puspan/pss->iStep;
4998 }
4999 }else if( pss->iTerm == pss->iBase ){
5000 pss->isNotEOF = 1;
5001 pss->uSeqIndexMax = 0;
5002 }
5003 pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0;
5004 pss->iValueNow = (pss->isReversing)
5005 ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax)
5006 : pss->iBase;
5007 }
5008
5009 /*
5010 ** Progress sequence generator to yield next value, if any.
5011 ** Leave its state to either yield next value or be at EOF.
5012 ** Return whether there is a next value, or 0 at EOF.
5013 */
5014 static int progressSequence( SequenceSpec *pss ){
5015 if( !pss->isNotEOF ) return 0;
5016 if( pss->isReversing ){
5017 if( pss->uSeqIndexNow > 0 ){
5018 pss->uSeqIndexNow--;
5019 pss->iValueNow -= pss->iStep;
5020 }else{
5021 pss->isNotEOF = 0;
5022 }
5023 }else{
5024 if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
5025 pss->uSeqIndexNow++;
5026 pss->iValueNow += pss->iStep;
5027 }else{
5028 pss->isNotEOF = 0;
5029 }
5030 }
5031 return pss->isNotEOF;
5032 }
5033
5034 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
5035 ** serve as the underlying representation of a cursor that scans
5036 ** over rows of the result
5037 */
5038 typedef struct series_cursor series_cursor;
5039 struct series_cursor {
5040 sqlite3_vtab_cursor base; /* Base class - must be first */
5041 SequenceSpec ss; /* (this) Derived class data */
5042 };
5043
5044 /*
5045 ** The seriesConnect() method is invoked to create a new
5046 ** series_vtab that describes the generate_series virtual table.
5047 **
5048 ** Think of this routine as the constructor for series_vtab objects.
5049 **
5050 ** All this routine needs to do is:
5051 **
5052 ** (1) Allocate the series_vtab object and initialize all fields.
5053 **
5054 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5055 ** result set of queries against generate_series will look like.
5056 */
5057 static int seriesConnect(
5058 sqlite3 *db,
5059 void *pUnused,
5060 int argcUnused, const char *const*argvUnused,
5061 sqlite3_vtab **ppVtab,
5062 char **pzErrUnused
5063 ){
5064 sqlite3_vtab *pNew;
5065 int rc;
5066
5067 /* Column numbers */
5068 #define SERIES_COLUMN_VALUE 0
5069 #define SERIES_COLUMN_START 1
5070 #define SERIES_COLUMN_STOP 2
5071 #define SERIES_COLUMN_STEP 3
5072
5073 (void)pUnused;
5074 (void)argcUnused;
5075 (void)argvUnused;
5076 (void)pzErrUnused;
5077 rc = sqlite3_declare_vtab(db,
5078 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
5079 if( rc==SQLITE_OK ){
5080 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
5081 if( pNew==0 ) return SQLITE_NOMEM;
5082 memset(pNew, 0, sizeof(*pNew));
5083 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5084 }
5085 return rc;
5086 }
5087
5088 /*
5089 ** This method is the destructor for series_cursor objects.
5090 */
5091 static int seriesDisconnect(sqlite3_vtab *pVtab){
5092 sqlite3_free(pVtab);
5093 return SQLITE_OK;
5094 }
5095
5096 /*
5097 ** Constructor for a new series_cursor object.
5098 */
5099 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
5100 series_cursor *pCur;
5101 (void)pUnused;
5102 pCur = sqlite3_malloc( sizeof(*pCur) );
5103 if( pCur==0 ) return SQLITE_NOMEM;
5104 memset(pCur, 0, sizeof(*pCur));
5105 *ppCursor = &pCur->base;
5106 return SQLITE_OK;
5107 }
5108
5109 /*
5110 ** Destructor for a series_cursor.
5111 */
5112 static int seriesClose(sqlite3_vtab_cursor *cur){
5113 sqlite3_free(cur);
5114 return SQLITE_OK;
5115 }
5116
5117
5118 /*
5119 ** Advance a series_cursor to its next row of output.
5120 */
5121 static int seriesNext(sqlite3_vtab_cursor *cur){
5122 series_cursor *pCur = (series_cursor*)cur;
5123 progressSequence( & pCur->ss );
5124 return SQLITE_OK;
5125 }
5126
5127 /*
5128 ** Return values of columns for the row at which the series_cursor
5129 ** is currently pointing.
5130 */
5131 static int seriesColumn(
5132 sqlite3_vtab_cursor *cur, /* The cursor */
5133 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
5134 int i /* Which column to return */
5135 ){
5136 series_cursor *pCur = (series_cursor*)cur;
5137 sqlite3_int64 x = 0;
5138 switch( i ){
5139 case SERIES_COLUMN_START: x = pCur->ss.iBase; break;
5140 case SERIES_COLUMN_STOP: x = pCur->ss.iTerm; break;
5141 case SERIES_COLUMN_STEP: x = pCur->ss.iStep; break;
5142 default: x = pCur->ss.iValueNow; break;
5143 }
5144 sqlite3_result_int64(ctx, x);
5145 return SQLITE_OK;
5146 }
5147
5148 #ifndef LARGEST_UINT64
5149 #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
5150 #endif
5151
5152 /*
5153 ** Return the rowid for the current row, logically equivalent to n+1 where
5154 ** "n" is the ascending integer in the aforesaid production definition.
5155 */
5156 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5157 series_cursor *pCur = (series_cursor*)cur;
5158 sqlite3_uint64 n = pCur->ss.uSeqIndexNow;
5159 *pRowid = (sqlite3_int64)((n<LARGEST_UINT64)? n+1 : 0);
5160 return SQLITE_OK;
5161 }
5162
5163 /*
5164 ** Return TRUE if the cursor has been moved off of the last
5165 ** row of output.
5166 */
5167 static int seriesEof(sqlite3_vtab_cursor *cur){
5168 series_cursor *pCur = (series_cursor*)cur;
5169 return !pCur->ss.isNotEOF;
5170 }
5171
5172 /* True to cause run-time checking of the start=, stop=, and/or step=
5173 ** parameters. The only reason to do this is for testing the
5174 ** constraint checking logic for virtual tables in the SQLite core.
5175 */
5176 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
5177 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
5178 #endif
5179
5180 /*
5181 ** This method is called to "rewind" the series_cursor object back
5182 ** to the first row of output. This method is always called at least
5183 ** once prior to any call to seriesColumn() or seriesRowid() or
5184 ** seriesEof().
5185 **
5186 ** The query plan selected by seriesBestIndex is passed in the idxNum
5187 ** parameter. (idxStr is not used in this implementation.) idxNum
5188 ** is a bitmask showing which constraints are available:
5189 **
5190 ** 1: start=VALUE
5191 ** 2: stop=VALUE
5192 ** 4: step=VALUE
5193 **
5194 ** Also, if bit 8 is set, that means that the series should be output
5195 ** in descending order rather than in ascending order. If bit 16 is
5196 ** set, then output must appear in ascending order.
5197 **
5198 ** This routine should initialize the cursor and position it so that it
5199 ** is pointing at the first row, or pointing off the end of the table
5200 ** (so that seriesEof() will return true) if the table is empty.
5201 */
5202 static int seriesFilter(
5203 sqlite3_vtab_cursor *pVtabCursor,
5204 int idxNum, const char *idxStrUnused,
5205 int argc, sqlite3_value **argv
5206 ){
5207 series_cursor *pCur = (series_cursor *)pVtabCursor;
5208 int i = 0;
5209 (void)idxStrUnused;
5210 if( idxNum & 1 ){
5211 pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
5212 }else{
5213 pCur->ss.iBase = 0;
5214 }
5215 if( idxNum & 2 ){
5216 pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
5217 }else{
5218 pCur->ss.iTerm = 0xffffffff;
5219 }
5220 if( idxNum & 4 ){
5221 pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
5222 if( pCur->ss.iStep==0 ){
5223 pCur->ss.iStep = 1;
5224 }else if( pCur->ss.iStep<0 ){
5225 if( (idxNum & 16)==0 ) idxNum |= 8;
5226 }
5227 }else{
5228 pCur->ss.iStep = 1;
5229 }
5230 for(i=0; i<argc; i++){
5231 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
5232 /* If any of the constraints have a NULL value, then return no rows.
5233 ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
5234 pCur->ss.iBase = 1;
5235 pCur->ss.iTerm = 0;
5236 pCur->ss.iStep = 1;
5237 break;
5238 }
5239 }
5240 if( idxNum & 8 ){
5241 pCur->ss.isReversing = pCur->ss.iStep > 0;
5242 }else{
5243 pCur->ss.isReversing = pCur->ss.iStep < 0;
5244 }
5245 setupSequence( &pCur->ss );
5246 return SQLITE_OK;
5247 }
5248
5249 /*
5250 ** SQLite will invoke this method one or more times while planning a query
5251 ** that uses the generate_series virtual table. This routine needs to create
5252 ** a query plan for each invocation and compute an estimated cost for that
5253 ** plan.
5254 **
5255 ** In this implementation idxNum is used to represent the
5256 ** query plan. idxStr is unused.
5257 **
5258 ** The query plan is represented by bits in idxNum:
5259 **
5260 ** (1) start = $value -- constraint exists
5261 ** (2) stop = $value -- constraint exists
5262 ** (4) step = $value -- constraint exists
5263 ** (8) output in descending order
5264 */
5265 static int seriesBestIndex(
5266 sqlite3_vtab *pVTab,
5267 sqlite3_index_info *pIdxInfo
5268 ){
5269 int i, j; /* Loop over constraints */
5270 int idxNum = 0; /* The query plan bitmask */
5271 int bStartSeen = 0; /* EQ constraint seen on the START column */
5272 int unusableMask = 0; /* Mask of unusable constraints */
5273 int nArg = 0; /* Number of arguments that seriesFilter() expects */
5274 int aIdx[3]; /* Constraints on start, stop, and step */
5275 const struct sqlite3_index_constraint *pConstraint;
5276
5277 /* This implementation assumes that the start, stop, and step columns
5278 ** are the last three columns in the virtual table. */
5279 assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
5280 assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
5281
5282 aIdx[0] = aIdx[1] = aIdx[2] = -1;
5283 pConstraint = pIdxInfo->aConstraint;
5284 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
5285 int iCol; /* 0 for start, 1 for stop, 2 for step */
5286 int iMask; /* bitmask for those column */
5287 if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
5288 iCol = pConstraint->iColumn - SERIES_COLUMN_START;
5289 assert( iCol>=0 && iCol<=2 );
5290 iMask = 1 << iCol;
5291 if( iCol==0 ) bStartSeen = 1;
5292 if( pConstraint->usable==0 ){
5293 unusableMask |= iMask;
5294 continue;
5295 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
5296 idxNum |= iMask;
5297 aIdx[iCol] = i;
5298 }
5299 }
5300 for(i=0; i<3; i++){
5301 if( (j = aIdx[i])>=0 ){
5302 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
5303 pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
5304 }
5305 }
5306 /* The current generate_column() implementation requires at least one
5307 ** argument (the START value). Legacy versions assumed START=0 if the
5308 ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES
5309 ** to obtain the legacy behavior */
5310 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
5311 if( !bStartSeen ){
5312 sqlite3_free(pVTab->zErrMsg);
5313 pVTab->zErrMsg = sqlite3_mprintf(
5314 "first argument to \"generate_series()\" missing or unusable");
5315 return SQLITE_ERROR;
5316 }
5317 #endif
5318 if( (unusableMask & ~idxNum)!=0 ){
5319 /* The start, stop, and step columns are inputs. Therefore if there
5320 ** are unusable constraints on any of start, stop, or step then
5321 ** this plan is unusable */
5322 return SQLITE_CONSTRAINT;
5323 }
5324 if( (idxNum & 3)==3 ){
5325 /* Both start= and stop= boundaries are available. This is the
5326 ** the preferred case */
5327 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
5328 pIdxInfo->estimatedRows = 1000;
5329 if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
5330 if( pIdxInfo->aOrderBy[0].desc ){
5331 idxNum |= 8;
5332 }else{
5333 idxNum |= 16;
5334 }
5335 pIdxInfo->orderByConsumed = 1;
5336 }
5337 }else{
5338 /* If either boundary is missing, we have to generate a huge span
5339 ** of numbers. Make this case very expensive so that the query
5340 ** planner will work hard to avoid it. */
5341 pIdxInfo->estimatedRows = 2147483647;
5342 }
5343 pIdxInfo->idxNum = idxNum;
5344 return SQLITE_OK;
5345 }
5346
5347 /*
5348 ** This following structure defines all the methods for the
5349 ** generate_series virtual table.
5350 */
5351 static sqlite3_module seriesModule = {
5352 0, /* iVersion */
5353 0, /* xCreate */
5354 seriesConnect, /* xConnect */
5355 seriesBestIndex, /* xBestIndex */
5356 seriesDisconnect, /* xDisconnect */
5357 0, /* xDestroy */
5358 seriesOpen, /* xOpen - open a cursor */
5359 seriesClose, /* xClose - close a cursor */
5360 seriesFilter, /* xFilter - configure scan constraints */
5361 seriesNext, /* xNext - advance a cursor */
5362 seriesEof, /* xEof - check for end of scan */
5363 seriesColumn, /* xColumn - read data */
5364 seriesRowid, /* xRowid - read data */
5365 0, /* xUpdate */
5366 0, /* xBegin */
5367 0, /* xSync */
5368 0, /* xCommit */
5369 0, /* xRollback */
5370 0, /* xFindMethod */
5371 0, /* xRename */
5372 0, /* xSavepoint */
5373 0, /* xRelease */
5374 0, /* xRollbackTo */
5375 0 /* xShadowName */
5376 };
5377
5378 #endif /* SQLITE_OMIT_VIRTUALTABLE */
5379
5380 #ifdef _WIN32
5381
5382 #endif
5383 int sqlite3_series_init(
5384 sqlite3 *db,
5385 char **pzErrMsg,
5386 const sqlite3_api_routines *pApi
5387 ){
5388 int rc = SQLITE_OK;
5389 SQLITE_EXTENSION_INIT2(pApi);
5390 #ifndef SQLITE_OMIT_VIRTUALTABLE
5391 if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
5392 *pzErrMsg = sqlite3_mprintf(
5393 "generate_series() requires SQLite 3.8.12 or later");
5394 return SQLITE_ERROR;
5395 }
5396 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
5397 #endif
5398 return rc;
5399 }
5400
5401 /************************* End ../ext/misc/series.c ********************/
5402 /************************* Begin ../ext/misc/regexp.c ******************/
5403 /*
5404 ** 2012-11-13
5405 **
5406 ** The author disclaims copyright to this source code. In place of
5407 ** a legal notice, here is a blessing:
5408 **
5409 ** May you do good and not evil.
5410 ** May you find forgiveness for yourself and forgive others.
5411 ** May you share freely, never taking more than you give.
5412 **
5413 ******************************************************************************
5414 **
5415 ** The code in this file implements a compact but reasonably
5416 ** efficient regular-expression matcher for posix extended regular
5417 ** expressions against UTF8 text.
5418 **
5419 ** This file is an SQLite extension. It registers a single function
5420 ** named "regexp(A,B)" where A is the regular expression and B is the
5421 ** string to be matched. By registering this function, SQLite will also
5422 ** then implement the "B regexp A" operator. Note that with the function
5423 ** the regular expression comes first, but with the operator it comes
5424 ** second.
5425 **
5426 ** The following regular expression syntax is supported:
5427 **
5428 ** X* zero or more occurrences of X
5429 ** X+ one or more occurrences of X
5430 ** X? zero or one occurrences of X
5431 ** X{p,q} between p and q occurrences of X
5432 ** (X) match X
5433 ** X|Y X or Y
5434 ** ^X X occurring at the beginning of the string
5435 ** X$ X occurring at the end of the string
5436 ** . Match any single character
5437 ** \c Character c where c is one of \{}()[]|*+?.
5438 ** \c C-language escapes for c in afnrtv. ex: \t or \n
5439 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
5440 ** \xXX Where XX is exactly 2 hex digits, unicode value XX
5441 ** [abc] Any single character from the set abc
5442 ** [^abc] Any single character not in the set abc
5443 ** [a-z] Any single character in the range a-z
5444 ** [^a-z] Any single character not in the range a-z
5445 ** \b Word boundary
5446 ** \w Word character. [A-Za-z0-9_]
5447 ** \W Non-word character
5448 ** \d Digit
5449 ** \D Non-digit
5450 ** \s Whitespace character
5451 ** \S Non-whitespace character
5452 **
5453 ** A nondeterministic finite automaton (NFA) is used for matching, so the
5454 ** performance is bounded by O(N*M) where N is the size of the regular
5455 ** expression and M is the size of the input string. The matcher never
5456 ** exhibits exponential behavior. Note that the X{p,q} operator expands
5457 ** to p copies of X following by q-p copies of X? and that the size of the
5458 ** regular expression in the O(N*M) performance bound is computed after
5459 ** this expansion.
5460 */
5461 #include <string.h>
5462 #include <stdlib.h>
5463 /* #include "sqlite3ext.h" */
5464 SQLITE_EXTENSION_INIT1
5465
5466 /*
5467 ** The following #defines change the names of some functions implemented in
5468 ** this file to prevent name collisions with C-library functions of the
5469 ** same name.
5470 */
5471 #define re_match sqlite3re_match
5472 #define re_compile sqlite3re_compile
5473 #define re_free sqlite3re_free
5474
5475 /* The end-of-input character */
5476 #define RE_EOF 0 /* End of input */
5477 #define RE_START 0xfffffff /* Start of input - larger than an UTF-8 */
5478
5479 /* The NFA is implemented as sequence of opcodes taken from the following
5480 ** set. Each opcode has a single integer argument.
5481 */
5482 #define RE_OP_MATCH 1 /* Match the one character in the argument */
5483 #define RE_OP_ANY 2 /* Match any one character. (Implements ".") */
5484 #define RE_OP_ANYSTAR 3 /* Special optimized version of .* */
5485 #define RE_OP_FORK 4 /* Continue to both next and opcode at iArg */
5486 #define RE_OP_GOTO 5 /* Jump to opcode at iArg */
5487 #define RE_OP_ACCEPT 6 /* Halt and indicate a successful match */
5488 #define RE_OP_CC_INC 7 /* Beginning of a [...] character class */
5489 #define RE_OP_CC_EXC 8 /* Beginning of a [^...] character class */
5490 #define RE_OP_CC_VALUE 9 /* Single value in a character class */
5491 #define RE_OP_CC_RANGE 10 /* Range of values in a character class */
5492 #define RE_OP_WORD 11 /* Perl word character [A-Za-z0-9_] */
5493 #define RE_OP_NOTWORD 12 /* Not a perl word character */
5494 #define RE_OP_DIGIT 13 /* digit: [0-9] */
5495 #define RE_OP_NOTDIGIT 14 /* Not a digit */
5496 #define RE_OP_SPACE 15 /* space: [ \t\n\r\v\f] */
5497 #define RE_OP_NOTSPACE 16 /* Not a digit */
5498 #define RE_OP_BOUNDARY 17 /* Boundary between word and non-word */
5499 #define RE_OP_ATSTART 18 /* Currently at the start of the string */
5500
5501 #if defined(SQLITE_DEBUG)
5502 /* Opcode names used for symbolic debugging */
5503 static const char *ReOpName[] = {
5504 "EOF",
5505 "MATCH",
5506 "ANY",
5507 "ANYSTAR",
5508 "FORK",
5509 "GOTO",
5510 "ACCEPT",
5511 "CC_INC",
5512 "CC_EXC",
5513 "CC_VALUE",
5514 "CC_RANGE",
5515 "WORD",
5516 "NOTWORD",
5517 "DIGIT",
5518 "NOTDIGIT",
5519 "SPACE",
5520 "NOTSPACE",
5521 "BOUNDARY",
5522 "ATSTART",
5523 };
5524 #endif /* SQLITE_DEBUG */
5525
5526
5527 /* Each opcode is a "state" in the NFA */
5528 typedef unsigned short ReStateNumber;
5529
5530 /* Because this is an NFA and not a DFA, multiple states can be active at
5531 ** once. An instance of the following object records all active states in
5532 ** the NFA. The implementation is optimized for the common case where the
5533 ** number of actives states is small.
5534 */
5535 typedef struct ReStateSet {
5536 unsigned nState; /* Number of current states */
5537 ReStateNumber *aState; /* Current states */
5538 } ReStateSet;
5539
5540 /* An input string read one character at a time.
5541 */
5542 typedef struct ReInput ReInput;
5543 struct ReInput {
5544 const unsigned char *z; /* All text */
5545 int i; /* Next byte to read */
5546 int mx; /* EOF when i>=mx */
5547 };
5548
5549 /* A compiled NFA (or an NFA that is in the process of being compiled) is
5550 ** an instance of the following object.
5551 */
5552 typedef struct ReCompiled ReCompiled;
5553 struct ReCompiled {
5554 ReInput sIn; /* Regular expression text */
5555 const char *zErr; /* Error message to return */
5556 char *aOp; /* Operators for the virtual machine */
5557 int *aArg; /* Arguments to each operator */
5558 unsigned (*xNextChar)(ReInput*); /* Next character function */
5559 unsigned char zInit[12]; /* Initial text to match */
5560 int nInit; /* Number of bytes in zInit */
5561 unsigned nState; /* Number of entries in aOp[] and aArg[] */
5562 unsigned nAlloc; /* Slots allocated for aOp[] and aArg[] */
5563 };
5564
5565 /* Add a state to the given state set if it is not already there */
5566 static void re_add_state(ReStateSet *pSet, int newState){
5567 unsigned i;
5568 for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
5569 pSet->aState[pSet->nState++] = (ReStateNumber)newState;
5570 }
5571
5572 /* Extract the next unicode character from *pzIn and return it. Advance
5573 ** *pzIn to the first byte past the end of the character returned. To
5574 ** be clear: this routine converts utf8 to unicode. This routine is
5575 ** optimized for the common case where the next character is a single byte.
5576 */
5577 static unsigned re_next_char(ReInput *p){
5578 unsigned c;
5579 if( p->i>=p->mx ) return 0;
5580 c = p->z[p->i++];
5581 if( c>=0x80 ){
5582 if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
5583 c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
5584 if( c<0x80 ) c = 0xfffd;
5585 }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
5586 && (p->z[p->i+1]&0xc0)==0x80 ){
5587 c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
5588 p->i += 2;
5589 if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
5590 }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
5591 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
5592 c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
5593 | (p->z[p->i+2]&0x3f);
5594 p->i += 3;
5595 if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
5596 }else{
5597 c = 0xfffd;
5598 }
5599 }
5600 return c;
5601 }
5602 static unsigned re_next_char_nocase(ReInput *p){
5603 unsigned c = re_next_char(p);
5604 if( c>='A' && c<='Z' ) c += 'a' - 'A';
5605 return c;
5606 }
5607
5608 /* Return true if c is a perl "word" character: [A-Za-z0-9_] */
5609 static int re_word_char(int c){
5610 return (c>='0' && c<='9') || (c>='a' && c<='z')
5611 || (c>='A' && c<='Z') || c=='_';
5612 }
5613
5614 /* Return true if c is a "digit" character: [0-9] */
5615 static int re_digit_char(int c){
5616 return (c>='0' && c<='9');
5617 }
5618
5619 /* Return true if c is a perl "space" character: [ \t\r\n\v\f] */
5620 static int re_space_char(int c){
5621 return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
5622 }
5623
5624 /* Run a compiled regular expression on the zero-terminated input
5625 ** string zIn[]. Return true on a match and false if there is no match.
5626 */
5627 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
5628 ReStateSet aStateSet[2], *pThis, *pNext;
5629 ReStateNumber aSpace[100];
5630 ReStateNumber *pToFree;
5631 unsigned int i = 0;
5632 unsigned int iSwap = 0;
5633 int c = RE_START;
5634 int cPrev = 0;
5635 int rc = 0;
5636 ReInput in;
5637
5638 in.z = zIn;
5639 in.i = 0;
5640 in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
5641
5642 /* Look for the initial prefix match, if there is one. */
5643 if( pRe->nInit ){
5644 unsigned char x = pRe->zInit[0];
5645 while( in.i+pRe->nInit<=in.mx
5646 && (zIn[in.i]!=x ||
5647 strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
5648 ){
5649 in.i++;
5650 }
5651 if( in.i+pRe->nInit>in.mx ) return 0;
5652 c = RE_START-1;
5653 }
5654
5655 if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
5656 pToFree = 0;
5657 aStateSet[0].aState = aSpace;
5658 }else{
5659 pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
5660 if( pToFree==0 ) return -1;
5661 aStateSet[0].aState = pToFree;
5662 }
5663 aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
5664 pNext = &aStateSet[1];
5665 pNext->nState = 0;
5666 re_add_state(pNext, 0);
5667 while( c!=RE_EOF && pNext->nState>0 ){
5668 cPrev = c;
5669 c = pRe->xNextChar(&in);
5670 pThis = pNext;
5671 pNext = &aStateSet[iSwap];
5672 iSwap = 1 - iSwap;
5673 pNext->nState = 0;
5674 for(i=0; i<pThis->nState; i++){
5675 int x = pThis->aState[i];
5676 switch( pRe->aOp[x] ){
5677 case RE_OP_MATCH: {
5678 if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
5679 break;
5680 }
5681 case RE_OP_ATSTART: {
5682 if( cPrev==RE_START ) re_add_state(pThis, x+1);
5683 break;
5684 }
5685 case RE_OP_ANY: {
5686 if( c!=0 ) re_add_state(pNext, x+1);
5687 break;
5688 }
5689 case RE_OP_WORD: {
5690 if( re_word_char(c) ) re_add_state(pNext, x+1);
5691 break;
5692 }
5693 case RE_OP_NOTWORD: {
5694 if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
5695 break;
5696 }
5697 case RE_OP_DIGIT: {
5698 if( re_digit_char(c) ) re_add_state(pNext, x+1);
5699 break;
5700 }
5701 case RE_OP_NOTDIGIT: {
5702 if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
5703 break;
5704 }
5705 case RE_OP_SPACE: {
5706 if( re_space_char(c) ) re_add_state(pNext, x+1);
5707 break;
5708 }
5709 case RE_OP_NOTSPACE: {
5710 if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
5711 break;
5712 }
5713 case RE_OP_BOUNDARY: {
5714 if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
5715 break;
5716 }
5717 case RE_OP_ANYSTAR: {
5718 re_add_state(pNext, x);
5719 re_add_state(pThis, x+1);
5720 break;
5721 }
5722 case RE_OP_FORK: {
5723 re_add_state(pThis, x+pRe->aArg[x]);
5724 re_add_state(pThis, x+1);
5725 break;
5726 }
5727 case RE_OP_GOTO: {
5728 re_add_state(pThis, x+pRe->aArg[x]);
5729 break;
5730 }
5731 case RE_OP_ACCEPT: {
5732 rc = 1;
5733 goto re_match_end;
5734 }
5735 case RE_OP_CC_EXC: {
5736 if( c==0 ) break;
5737 /* fall-through */ goto re_op_cc_inc;
5738 }
5739 case RE_OP_CC_INC: re_op_cc_inc: {
5740 int j = 1;
5741 int n = pRe->aArg[x];
5742 int hit = 0;
5743 for(j=1; j>0 && j<n; j++){
5744 if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
5745 if( pRe->aArg[x+j]==c ){
5746 hit = 1;
5747 j = -1;
5748 }
5749 }else{
5750 if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
5751 hit = 1;
5752 j = -1;
5753 }else{
5754 j++;
5755 }
5756 }
5757 }
5758 if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
5759 if( hit ) re_add_state(pNext, x+n);
5760 break;
5761 }
5762 }
5763 }
5764 }
5765 for(i=0; i<pNext->nState; i++){
5766 int x = pNext->aState[i];
5767 while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
5768 if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
5769 }
5770 re_match_end:
5771 sqlite3_free(pToFree);
5772 return rc;
5773 }
5774
5775 /* Resize the opcode and argument arrays for an RE under construction.
5776 */
5777 static int re_resize(ReCompiled *p, int N){
5778 char *aOp;
5779 int *aArg;
5780 aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
5781 if( aOp==0 ) return 1;
5782 p->aOp = aOp;
5783 aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
5784 if( aArg==0 ) return 1;
5785 p->aArg = aArg;
5786 p->nAlloc = N;
5787 return 0;
5788 }
5789
5790 /* Insert a new opcode and argument into an RE under construction. The
5791 ** insertion point is just prior to existing opcode iBefore.
5792 */
5793 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
5794 int i;
5795 if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
5796 for(i=p->nState; i>iBefore; i--){
5797 p->aOp[i] = p->aOp[i-1];
5798 p->aArg[i] = p->aArg[i-1];
5799 }
5800 p->nState++;
5801 p->aOp[iBefore] = (char)op;
5802 p->aArg[iBefore] = arg;
5803 return iBefore;
5804 }
5805
5806 /* Append a new opcode and argument to the end of the RE under construction.
5807 */
5808 static int re_append(ReCompiled *p, int op, int arg){
5809 return re_insert(p, p->nState, op, arg);
5810 }
5811
5812 /* Make a copy of N opcodes starting at iStart onto the end of the RE
5813 ** under construction.
5814 */
5815 static void re_copy(ReCompiled *p, int iStart, int N){
5816 if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
5817 memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
5818 memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
5819 p->nState += N;
5820 }
5821
5822 /* Return true if c is a hexadecimal digit character: [0-9a-fA-F]
5823 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c). If
5824 ** c is not a hex digit *pV is unchanged.
5825 */
5826 static int re_hex(int c, int *pV){
5827 if( c>='0' && c<='9' ){
5828 c -= '0';
5829 }else if( c>='a' && c<='f' ){
5830 c -= 'a' - 10;
5831 }else if( c>='A' && c<='F' ){
5832 c -= 'A' - 10;
5833 }else{
5834 return 0;
5835 }
5836 *pV = (*pV)*16 + (c & 0xff);
5837 return 1;
5838 }
5839
5840 /* A backslash character has been seen, read the next character and
5841 ** return its interpretation.
5842 */
5843 static unsigned re_esc_char(ReCompiled *p){
5844 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
5845 static const char zTrans[] = "\a\f\n\r\t\v";
5846 int i, v = 0;
5847 char c;
5848 if( p->sIn.i>=p->sIn.mx ) return 0;
5849 c = p->sIn.z[p->sIn.i];
5850 if( c=='u' && p->sIn.i+4<p->sIn.mx ){
5851 const unsigned char *zIn = p->sIn.z + p->sIn.i;
5852 if( re_hex(zIn[1],&v)
5853 && re_hex(zIn[2],&v)
5854 && re_hex(zIn[3],&v)
5855 && re_hex(zIn[4],&v)
5856 ){
5857 p->sIn.i += 5;
5858 return v;
5859 }
5860 }
5861 if( c=='x' && p->sIn.i+2<p->sIn.mx ){
5862 const unsigned char *zIn = p->sIn.z + p->sIn.i;
5863 if( re_hex(zIn[1],&v)
5864 && re_hex(zIn[2],&v)
5865 ){
5866 p->sIn.i += 3;
5867 return v;
5868 }
5869 }
5870 for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
5871 if( zEsc[i] ){
5872 if( i<6 ) c = zTrans[i];
5873 p->sIn.i++;
5874 }else{
5875 p->zErr = "unknown \\ escape";
5876 }
5877 return c;
5878 }
5879
5880 /* Forward declaration */
5881 static const char *re_subcompile_string(ReCompiled*);
5882
5883 /* Peek at the next byte of input */
5884 static unsigned char rePeek(ReCompiled *p){
5885 return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
5886 }
5887
5888 /* Compile RE text into a sequence of opcodes. Continue up to the
5889 ** first unmatched ")" character, then return. If an error is found,
5890 ** return a pointer to the error message string.
5891 */
5892 static const char *re_subcompile_re(ReCompiled *p){
5893 const char *zErr;
5894 int iStart, iEnd, iGoto;
5895 iStart = p->nState;
5896 zErr = re_subcompile_string(p);
5897 if( zErr ) return zErr;
5898 while( rePeek(p)=='|' ){
5899 iEnd = p->nState;
5900 re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
5901 iGoto = re_append(p, RE_OP_GOTO, 0);
5902 p->sIn.i++;
5903 zErr = re_subcompile_string(p);
5904 if( zErr ) return zErr;
5905 p->aArg[iGoto] = p->nState - iGoto;
5906 }
5907 return 0;
5908 }
5909
5910 /* Compile an element of regular expression text (anything that can be
5911 ** an operand to the "|" operator). Return NULL on success or a pointer
5912 ** to the error message if there is a problem.
5913 */
5914 static const char *re_subcompile_string(ReCompiled *p){
5915 int iPrev = -1;
5916 int iStart;
5917 unsigned c;
5918 const char *zErr;
5919 while( (c = p->xNextChar(&p->sIn))!=0 ){
5920 iStart = p->nState;
5921 switch( c ){
5922 case '|':
5923 case ')': {
5924 p->sIn.i--;
5925 return 0;
5926 }
5927 case '(': {
5928 zErr = re_subcompile_re(p);
5929 if( zErr ) return zErr;
5930 if( rePeek(p)!=')' ) return "unmatched '('";
5931 p->sIn.i++;
5932 break;
5933 }
5934 case '.': {
5935 if( rePeek(p)=='*' ){
5936 re_append(p, RE_OP_ANYSTAR, 0);
5937 p->sIn.i++;
5938 }else{
5939 re_append(p, RE_OP_ANY, 0);
5940 }
5941 break;
5942 }
5943 case '*': {
5944 if( iPrev<0 ) return "'*' without operand";
5945 re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
5946 re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
5947 break;
5948 }
5949 case '+': {
5950 if( iPrev<0 ) return "'+' without operand";
5951 re_append(p, RE_OP_FORK, iPrev - p->nState);
5952 break;
5953 }
5954 case '?': {
5955 if( iPrev<0 ) return "'?' without operand";
5956 re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
5957 break;
5958 }
5959 case '$': {
5960 re_append(p, RE_OP_MATCH, RE_EOF);
5961 break;
5962 }
5963 case '^': {
5964 re_append(p, RE_OP_ATSTART, 0);
5965 break;
5966 }
5967 case '{': {
5968 int m = 0, n = 0;
5969 int sz, j;
5970 if( iPrev<0 ) return "'{m,n}' without operand";
5971 while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
5972 n = m;
5973 if( c==',' ){
5974 p->sIn.i++;
5975 n = 0;
5976 while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
5977 }
5978 if( c!='}' ) return "unmatched '{'";
5979 if( n>0 && n<m ) return "n less than m in '{m,n}'";
5980 p->sIn.i++;
5981 sz = p->nState - iPrev;
5982 if( m==0 ){
5983 if( n==0 ) return "both m and n are zero in '{m,n}'";
5984 re_insert(p, iPrev, RE_OP_FORK, sz+1);
5985 iPrev++;
5986 n--;
5987 }else{
5988 for(j=1; j<m; j++) re_copy(p, iPrev, sz);
5989 }
5990 for(j=m; j<n; j++){
5991 re_append(p, RE_OP_FORK, sz+1);
5992 re_copy(p, iPrev, sz);
5993 }
5994 if( n==0 && m>0 ){
5995 re_append(p, RE_OP_FORK, -sz);
5996 }
5997 break;
5998 }
5999 case '[': {
6000 unsigned int iFirst = p->nState;
6001 if( rePeek(p)=='^' ){
6002 re_append(p, RE_OP_CC_EXC, 0);
6003 p->sIn.i++;
6004 }else{
6005 re_append(p, RE_OP_CC_INC, 0);
6006 }
6007 while( (c = p->xNextChar(&p->sIn))!=0 ){
6008 if( c=='[' && rePeek(p)==':' ){
6009 return "POSIX character classes not supported";
6010 }
6011 if( c=='\\' ) c = re_esc_char(p);
6012 if( rePeek(p)=='-' ){
6013 re_append(p, RE_OP_CC_RANGE, c);
6014 p->sIn.i++;
6015 c = p->xNextChar(&p->sIn);
6016 if( c=='\\' ) c = re_esc_char(p);
6017 re_append(p, RE_OP_CC_RANGE, c);
6018 }else{
6019 re_append(p, RE_OP_CC_VALUE, c);
6020 }
6021 if( rePeek(p)==']' ){ p->sIn.i++; break; }
6022 }
6023 if( c==0 ) return "unclosed '['";
6024 if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
6025 break;
6026 }
6027 case '\\': {
6028 int specialOp = 0;
6029 switch( rePeek(p) ){
6030 case 'b': specialOp = RE_OP_BOUNDARY; break;
6031 case 'd': specialOp = RE_OP_DIGIT; break;
6032 case 'D': specialOp = RE_OP_NOTDIGIT; break;
6033 case 's': specialOp = RE_OP_SPACE; break;
6034 case 'S': specialOp = RE_OP_NOTSPACE; break;
6035 case 'w': specialOp = RE_OP_WORD; break;
6036 case 'W': specialOp = RE_OP_NOTWORD; break;
6037 }
6038 if( specialOp ){
6039 p->sIn.i++;
6040 re_append(p, specialOp, 0);
6041 }else{
6042 c = re_esc_char(p);
6043 re_append(p, RE_OP_MATCH, c);
6044 }
6045 break;
6046 }
6047 default: {
6048 re_append(p, RE_OP_MATCH, c);
6049 break;
6050 }
6051 }
6052 iPrev = iStart;
6053 }
6054 return 0;
6055 }
6056
6057 /* Free and reclaim all the memory used by a previously compiled
6058 ** regular expression. Applications should invoke this routine once
6059 ** for every call to re_compile() to avoid memory leaks.
6060 */
6061 static void re_free(ReCompiled *pRe){
6062 if( pRe ){
6063 sqlite3_free(pRe->aOp);
6064 sqlite3_free(pRe->aArg);
6065 sqlite3_free(pRe);
6066 }
6067 }
6068
6069 /*
6070 ** Compile a textual regular expression in zIn[] into a compiled regular
6071 ** expression suitable for us by re_match() and return a pointer to the
6072 ** compiled regular expression in *ppRe. Return NULL on success or an
6073 ** error message if something goes wrong.
6074 */
6075 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
6076 ReCompiled *pRe;
6077 const char *zErr;
6078 int i, j;
6079
6080 *ppRe = 0;
6081 pRe = sqlite3_malloc( sizeof(*pRe) );
6082 if( pRe==0 ){
6083 return "out of memory";
6084 }
6085 memset(pRe, 0, sizeof(*pRe));
6086 pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
6087 if( re_resize(pRe, 30) ){
6088 re_free(pRe);
6089 return "out of memory";
6090 }
6091 if( zIn[0]=='^' ){
6092 zIn++;
6093 }else{
6094 re_append(pRe, RE_OP_ANYSTAR, 0);
6095 }
6096 pRe->sIn.z = (unsigned char*)zIn;
6097 pRe->sIn.i = 0;
6098 pRe->sIn.mx = (int)strlen(zIn);
6099 zErr = re_subcompile_re(pRe);
6100 if( zErr ){
6101 re_free(pRe);
6102 return zErr;
6103 }
6104 if( pRe->sIn.i>=pRe->sIn.mx ){
6105 re_append(pRe, RE_OP_ACCEPT, 0);
6106 *ppRe = pRe;
6107 }else{
6108 re_free(pRe);
6109 return "unrecognized character";
6110 }
6111
6112 /* The following is a performance optimization. If the regex begins with
6113 ** ".*" (if the input regex lacks an initial "^") and afterwards there are
6114 ** one or more matching characters, enter those matching characters into
6115 ** zInit[]. The re_match() routine can then search ahead in the input
6116 ** string looking for the initial match without having to run the whole
6117 ** regex engine over the string. Do not worry about trying to match
6118 ** unicode characters beyond plane 0 - those are very rare and this is
6119 ** just an optimization. */
6120 if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
6121 for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
6122 unsigned x = pRe->aArg[i];
6123 if( x<=0x7f ){
6124 pRe->zInit[j++] = (unsigned char)x;
6125 }else if( x<=0x7ff ){
6126 pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
6127 pRe->zInit[j++] = 0x80 | (x&0x3f);
6128 }else if( x<=0xffff ){
6129 pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
6130 pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
6131 pRe->zInit[j++] = 0x80 | (x&0x3f);
6132 }else{
6133 break;
6134 }
6135 }
6136 if( j>0 && pRe->zInit[j-1]==0 ) j--;
6137 pRe->nInit = j;
6138 }
6139 return pRe->zErr;
6140 }
6141
6142 /*
6143 ** Implementation of the regexp() SQL function. This function implements
6144 ** the build-in REGEXP operator. The first argument to the function is the
6145 ** pattern and the second argument is the string. So, the SQL statements:
6146 **
6147 ** A REGEXP B
6148 **
6149 ** is implemented as regexp(B,A).
6150 */
6151 static void re_sql_func(
6152 sqlite3_context *context,
6153 int argc,
6154 sqlite3_value **argv
6155 ){
6156 ReCompiled *pRe; /* Compiled regular expression */
6157 const char *zPattern; /* The regular expression */
6158 const unsigned char *zStr;/* String being searched */
6159 const char *zErr; /* Compile error message */
6160 int setAux = 0; /* True to invoke sqlite3_set_auxdata() */
6161
6162 (void)argc; /* Unused */
6163 pRe = sqlite3_get_auxdata(context, 0);
6164 if( pRe==0 ){
6165 zPattern = (const char*)sqlite3_value_text(argv[0]);
6166 if( zPattern==0 ) return;
6167 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
6168 if( zErr ){
6169 re_free(pRe);
6170 sqlite3_result_error(context, zErr, -1);
6171 return;
6172 }
6173 if( pRe==0 ){
6174 sqlite3_result_error_nomem(context);
6175 return;
6176 }
6177 setAux = 1;
6178 }
6179 zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
6180 if( zStr!=0 ){
6181 sqlite3_result_int(context, re_match(pRe, zStr, -1));
6182 }
6183 if( setAux ){
6184 sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
6185 }
6186 }
6187
6188 #if defined(SQLITE_DEBUG)
6189 /*
6190 ** This function is used for testing and debugging only. It is only available
6191 ** if the SQLITE_DEBUG compile-time option is used.
6192 **
6193 ** Compile a regular expression and then convert the compiled expression into
6194 ** text and return that text.
6195 */
6196 static void re_bytecode_func(
6197 sqlite3_context *context,
6198 int argc,
6199 sqlite3_value **argv
6200 ){
6201 const char *zPattern;
6202 const char *zErr;
6203 ReCompiled *pRe;
6204 sqlite3_str *pStr;
6205 int i;
6206 int n;
6207 char *z;
6208 (void)argc;
6209
6210 zPattern = (const char*)sqlite3_value_text(argv[0]);
6211 if( zPattern==0 ) return;
6212 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
6213 if( zErr ){
6214 re_free(pRe);
6215 sqlite3_result_error(context, zErr, -1);
6216 return;
6217 }
6218 if( pRe==0 ){
6219 sqlite3_result_error_nomem(context);
6220 return;
6221 }
6222 pStr = sqlite3_str_new(0);
6223 if( pStr==0 ) goto re_bytecode_func_err;
6224 if( pRe->nInit>0 ){
6225 sqlite3_str_appendf(pStr, "INIT ");
6226 for(i=0; i<pRe->nInit; i++){
6227 sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
6228 }
6229 sqlite3_str_appendf(pStr, "\n");
6230 }
6231 for(i=0; (unsigned)i<pRe->nState; i++){
6232 sqlite3_str_appendf(pStr, "%-8s %4d\n",
6233 ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
6234 }
6235 n = sqlite3_str_length(pStr);
6236 z = sqlite3_str_finish(pStr);
6237 if( n==0 ){
6238 sqlite3_free(z);
6239 }else{
6240 sqlite3_result_text(context, z, n-1, sqlite3_free);
6241 }
6242
6243 re_bytecode_func_err:
6244 re_free(pRe);
6245 }
6246
6247 #endif /* SQLITE_DEBUG */
6248
6249
6250 /*
6251 ** Invoke this routine to register the regexp() function with the
6252 ** SQLite database connection.
6253 */
6254 #ifdef _WIN32
6255
6256 #endif
6257 int sqlite3_regexp_init(
6258 sqlite3 *db,
6259 char **pzErrMsg,
6260 const sqlite3_api_routines *pApi
6261 ){
6262 int rc = SQLITE_OK;
6263 SQLITE_EXTENSION_INIT2(pApi);
6264 (void)pzErrMsg; /* Unused */
6265 rc = sqlite3_create_function(db, "regexp", 2,
6266 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
6267 0, re_sql_func, 0, 0);
6268 if( rc==SQLITE_OK ){
6269 /* The regexpi(PATTERN,STRING) function is a case-insensitive version
6270 ** of regexp(PATTERN,STRING). */
6271 rc = sqlite3_create_function(db, "regexpi", 2,
6272 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
6273 (void*)db, re_sql_func, 0, 0);
6274 #if defined(SQLITE_DEBUG)
6275 if( rc==SQLITE_OK ){
6276 rc = sqlite3_create_function(db, "regexp_bytecode", 1,
6277 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
6278 0, re_bytecode_func, 0, 0);
6279 }
6280 #endif /* SQLITE_DEBUG */
6281 }
6282 return rc;
6283 }
6284
6285 /************************* End ../ext/misc/regexp.c ********************/
6286 #ifndef SQLITE_SHELL_FIDDLE
6287 /************************* Begin ../ext/misc/fileio.c ******************/
6288 /*
6289 ** 2014-06-13
6290 **
6291 ** The author disclaims copyright to this source code. In place of
6292 ** a legal notice, here is a blessing:
6293 **
6294 ** May you do good and not evil.
6295 ** May you find forgiveness for yourself and forgive others.
6296 ** May you share freely, never taking more than you give.
6297 **
6298 ******************************************************************************
6299 **
6300 ** This SQLite extension implements SQL functions readfile() and
6301 ** writefile(), and eponymous virtual type "fsdir".
6302 **
6303 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
6304 **
6305 ** If neither of the optional arguments is present, then this UDF
6306 ** function writes blob DATA to file FILE. If successful, the number
6307 ** of bytes written is returned. If an error occurs, NULL is returned.
6308 **
6309 ** If the first option argument - MODE - is present, then it must
6310 ** be passed an integer value that corresponds to a POSIX mode
6311 ** value (file type + permissions, as returned in the stat.st_mode
6312 ** field by the stat() system call). Three types of files may
6313 ** be written/created:
6314 **
6315 ** regular files: (mode & 0170000)==0100000
6316 ** symbolic links: (mode & 0170000)==0120000
6317 ** directories: (mode & 0170000)==0040000
6318 **
6319 ** For a directory, the DATA is ignored. For a symbolic link, it is
6320 ** interpreted as text and used as the target of the link. For a
6321 ** regular file, it is interpreted as a blob and written into the
6322 ** named file. Regardless of the type of file, its permissions are
6323 ** set to (mode & 0777) before returning.
6324 **
6325 ** If the optional MTIME argument is present, then it is interpreted
6326 ** as an integer - the number of seconds since the unix epoch. The
6327 ** modification-time of the target file is set to this value before
6328 ** returning.
6329 **
6330 ** If three or more arguments are passed to this function and an
6331 ** error is encountered, an exception is raised.
6332 **
6333 ** READFILE(FILE):
6334 **
6335 ** Read and return the contents of file FILE (type blob) from disk.
6336 **
6337 ** FSDIR:
6338 **
6339 ** Used as follows:
6340 **
6341 ** SELECT * FROM fsdir($path [, $dir]);
6342 **
6343 ** Parameter $path is an absolute or relative pathname. If the file that it
6344 ** refers to does not exist, it is an error. If the path refers to a regular
6345 ** file or symbolic link, it returns a single row. Or, if the path refers
6346 ** to a directory, it returns one row for the directory, and one row for each
6347 ** file within the hierarchy rooted at $path.
6348 **
6349 ** Each row has the following columns:
6350 **
6351 ** name: Path to file or directory (text value).
6352 ** mode: Value of stat.st_mode for directory entry (an integer).
6353 ** mtime: Value of stat.st_mtime for directory entry (an integer).
6354 ** data: For a regular file, a blob containing the file data. For a
6355 ** symlink, a text value containing the text of the link. For a
6356 ** directory, NULL.
6357 **
6358 ** If a non-NULL value is specified for the optional $dir parameter and
6359 ** $path is a relative path, then $path is interpreted relative to $dir.
6360 ** And the paths returned in the "name" column of the table are also
6361 ** relative to directory $dir.
6362 **
6363 ** Notes on building this extension for Windows:
6364 ** Unless linked statically with the SQLite library, a preprocessor
6365 ** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
6366 ** DLL form of this extension for WIN32. See its use below for details.
6367 */
6368 /* #include "sqlite3ext.h" */
6369 SQLITE_EXTENSION_INIT1
6370 #include <stdio.h>
6371 #include <string.h>
6372 #include <assert.h>
6373
6374 #include <sys/types.h>
6375 #include <sys/stat.h>
6376 #include <fcntl.h>
6377 #if !defined(_WIN32) && !defined(WIN32)
6378 # include <unistd.h>
6379 # include <dirent.h>
6380 # include <utime.h>
6381 # include <sys/time.h>
6382 #else
6383 # include "windows.h"
6384 # include <io.h>
6385 # include <direct.h>
6386 /* # include "test_windirent.h" */
6387 # define dirent DIRENT
6388 # ifndef chmod
6389 # define chmod _chmod
6390 # endif
6391 # ifndef stat
6392 # define stat _stat
6393 # endif
6394 # define mkdir(path,mode) _mkdir(path)
6395 # define lstat(path,buf) stat(path,buf)
6396 #endif
6397 #include <time.h>
6398 #include <errno.h>
6399
6400
6401 /*
6402 ** Structure of the fsdir() table-valued function
6403 */
6404 /* 0 1 2 3 4 5 */
6405 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
6406 #define FSDIR_COLUMN_NAME 0 /* Name of the file */
6407 #define FSDIR_COLUMN_MODE 1 /* Access mode */
6408 #define FSDIR_COLUMN_MTIME 2 /* Last modification time */
6409 #define FSDIR_COLUMN_DATA 3 /* File content */
6410 #define FSDIR_COLUMN_PATH 4 /* Path to top of search */
6411 #define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */
6412
6413
6414 /*
6415 ** Set the result stored by context ctx to a blob containing the
6416 ** contents of file zName. Or, leave the result unchanged (NULL)
6417 ** if the file does not exist or is unreadable.
6418 **
6419 ** If the file exceeds the SQLite blob size limit, through an
6420 ** SQLITE_TOOBIG error.
6421 **
6422 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
6423 ** off of disk.
6424 */
6425 static void readFileContents(sqlite3_context *ctx, const char *zName){
6426 FILE *in;
6427 sqlite3_int64 nIn;
6428 void *pBuf;
6429 sqlite3 *db;
6430 int mxBlob;
6431
6432 in = fopen(zName, "rb");
6433 if( in==0 ){
6434 /* File does not exist or is unreadable. Leave the result set to NULL. */
6435 return;
6436 }
6437 fseek(in, 0, SEEK_END);
6438 nIn = ftell(in);
6439 rewind(in);
6440 db = sqlite3_context_db_handle(ctx);
6441 mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
6442 if( nIn>mxBlob ){
6443 sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
6444 fclose(in);
6445 return;
6446 }
6447 pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
6448 if( pBuf==0 ){
6449 sqlite3_result_error_nomem(ctx);
6450 fclose(in);
6451 return;
6452 }
6453 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
6454 sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
6455 }else{
6456 sqlite3_result_error_code(ctx, SQLITE_IOERR);
6457 sqlite3_free(pBuf);
6458 }
6459 fclose(in);
6460 }
6461
6462 /*
6463 ** Implementation of the "readfile(X)" SQL function. The entire content
6464 ** of the file named X is read and returned as a BLOB. NULL is returned
6465 ** if the file does not exist or is unreadable.
6466 */
6467 static void readfileFunc(
6468 sqlite3_context *context,
6469 int argc,
6470 sqlite3_value **argv
6471 ){
6472 const char *zName;
6473 (void)(argc); /* Unused parameter */
6474 zName = (const char*)sqlite3_value_text(argv[0]);
6475 if( zName==0 ) return;
6476 readFileContents(context, zName);
6477 }
6478
6479 /*
6480 ** Set the error message contained in context ctx to the results of
6481 ** vprintf(zFmt, ...).
6482 */
6483 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
6484 char *zMsg = 0;
6485 va_list ap;
6486 va_start(ap, zFmt);
6487 zMsg = sqlite3_vmprintf(zFmt, ap);
6488 sqlite3_result_error(ctx, zMsg, -1);
6489 sqlite3_free(zMsg);
6490 va_end(ap);
6491 }
6492
6493 #if defined(_WIN32)
6494 /*
6495 ** This function is designed to convert a Win32 FILETIME structure into the
6496 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
6497 */
6498 static sqlite3_uint64 fileTimeToUnixTime(
6499 LPFILETIME pFileTime
6500 ){
6501 SYSTEMTIME epochSystemTime;
6502 ULARGE_INTEGER epochIntervals;
6503 FILETIME epochFileTime;
6504 ULARGE_INTEGER fileIntervals;
6505
6506 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
6507 epochSystemTime.wYear = 1970;
6508 epochSystemTime.wMonth = 1;
6509 epochSystemTime.wDay = 1;
6510 SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
6511 epochIntervals.LowPart = epochFileTime.dwLowDateTime;
6512 epochIntervals.HighPart = epochFileTime.dwHighDateTime;
6513
6514 fileIntervals.LowPart = pFileTime->dwLowDateTime;
6515 fileIntervals.HighPart = pFileTime->dwHighDateTime;
6516
6517 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
6518 }
6519
6520
6521 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
6522 # /* To allow a standalone DLL, use this next replacement function: */
6523 # undef sqlite3_win32_utf8_to_unicode
6524 # define sqlite3_win32_utf8_to_unicode utf8_to_utf16
6525 #
6526 LPWSTR utf8_to_utf16(const char *z){
6527 int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
6528 LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
6529 if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
6530 return rv;
6531 sqlite3_free(rv);
6532 return 0;
6533 }
6534 #endif
6535
6536 /*
6537 ** This function attempts to normalize the time values found in the stat()
6538 ** buffer to UTC. This is necessary on Win32, where the runtime library
6539 ** appears to return these values as local times.
6540 */
6541 static void statTimesToUtc(
6542 const char *zPath,
6543 struct stat *pStatBuf
6544 ){
6545 HANDLE hFindFile;
6546 WIN32_FIND_DATAW fd;
6547 LPWSTR zUnicodeName;
6548 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
6549 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
6550 if( zUnicodeName ){
6551 memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
6552 hFindFile = FindFirstFileW(zUnicodeName, &fd);
6553 if( hFindFile!=NULL ){
6554 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
6555 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
6556 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
6557 FindClose(hFindFile);
6558 }
6559 sqlite3_free(zUnicodeName);
6560 }
6561 }
6562 #endif
6563
6564 /*
6565 ** This function is used in place of stat(). On Windows, special handling
6566 ** is required in order for the included time to be returned as UTC. On all
6567 ** other systems, this function simply calls stat().
6568 */
6569 static int fileStat(
6570 const char *zPath,
6571 struct stat *pStatBuf
6572 ){
6573 #if defined(_WIN32)
6574 int rc = stat(zPath, pStatBuf);
6575 if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
6576 return rc;
6577 #else
6578 return stat(zPath, pStatBuf);
6579 #endif
6580 }
6581
6582 /*
6583 ** This function is used in place of lstat(). On Windows, special handling
6584 ** is required in order for the included time to be returned as UTC. On all
6585 ** other systems, this function simply calls lstat().
6586 */
6587 static int fileLinkStat(
6588 const char *zPath,
6589 struct stat *pStatBuf
6590 ){
6591 #if defined(_WIN32)
6592 int rc = lstat(zPath, pStatBuf);
6593 if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
6594 return rc;
6595 #else
6596 return lstat(zPath, pStatBuf);
6597 #endif
6598 }
6599
6600 /*
6601 ** Argument zFile is the name of a file that will be created and/or written
6602 ** by SQL function writefile(). This function ensures that the directory
6603 ** zFile will be written to exists, creating it if required. The permissions
6604 ** for any path components created by this function are set in accordance
6605 ** with the current umask.
6606 **
6607 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
6608 ** SQLITE_OK is returned if the directory is successfully created, or
6609 ** SQLITE_ERROR otherwise.
6610 */
6611 static int makeDirectory(
6612 const char *zFile
6613 ){
6614 char *zCopy = sqlite3_mprintf("%s", zFile);
6615 int rc = SQLITE_OK;
6616
6617 if( zCopy==0 ){
6618 rc = SQLITE_NOMEM;
6619 }else{
6620 int nCopy = (int)strlen(zCopy);
6621 int i = 1;
6622
6623 while( rc==SQLITE_OK ){
6624 struct stat sStat;
6625 int rc2;
6626
6627 for(; zCopy[i]!='/' && i<nCopy; i++);
6628 if( i==nCopy ) break;
6629 zCopy[i] = '\0';
6630
6631 rc2 = fileStat(zCopy, &sStat);
6632 if( rc2!=0 ){
6633 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
6634 }else{
6635 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
6636 }
6637 zCopy[i] = '/';
6638 i++;
6639 }
6640
6641 sqlite3_free(zCopy);
6642 }
6643
6644 return rc;
6645 }
6646
6647 /*
6648 ** This function does the work for the writefile() UDF. Refer to
6649 ** header comments at the top of this file for details.
6650 */
6651 static int writeFile(
6652 sqlite3_context *pCtx, /* Context to return bytes written in */
6653 const char *zFile, /* File to write */
6654 sqlite3_value *pData, /* Data to write */
6655 mode_t mode, /* MODE parameter passed to writefile() */
6656 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */
6657 ){
6658 if( zFile==0 ) return 1;
6659 #if !defined(_WIN32) && !defined(WIN32)
6660 if( S_ISLNK(mode) ){
6661 const char *zTo = (const char*)sqlite3_value_text(pData);
6662 if( zTo==0 || symlink(zTo, zFile)<0 ) return 1;
6663 }else
6664 #endif
6665 {
6666 if( S_ISDIR(mode) ){
6667 if( mkdir(zFile, mode) ){
6668 /* The mkdir() call to create the directory failed. This might not
6669 ** be an error though - if there is already a directory at the same
6670 ** path and either the permissions already match or can be changed
6671 ** to do so using chmod(), it is not an error. */
6672 struct stat sStat;
6673 if( errno!=EEXIST
6674 || 0!=fileStat(zFile, &sStat)
6675 || !S_ISDIR(sStat.st_mode)
6676 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
6677 ){
6678 return 1;
6679 }
6680 }
6681 }else{
6682 sqlite3_int64 nWrite = 0;
6683 const char *z;
6684 int rc = 0;
6685 FILE *out = fopen(zFile, "wb");
6686 if( out==0 ) return 1;
6687 z = (const char*)sqlite3_value_blob(pData);
6688 if( z ){
6689 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
6690 nWrite = sqlite3_value_bytes(pData);
6691 if( nWrite!=n ){
6692 rc = 1;
6693 }
6694 }
6695 fclose(out);
6696 if( rc==0 && mode && chmod(zFile, mode & 0777) ){
6697 rc = 1;
6698 }
6699 if( rc ) return 2;
6700 sqlite3_result_int64(pCtx, nWrite);
6701 }
6702 }
6703
6704 if( mtime>=0 ){
6705 #if defined(_WIN32)
6706 #if !SQLITE_OS_WINRT
6707 /* Windows */
6708 FILETIME lastAccess;
6709 FILETIME lastWrite;
6710 SYSTEMTIME currentTime;
6711 LONGLONG intervals;
6712 HANDLE hFile;
6713 LPWSTR zUnicodeName;
6714 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
6715
6716 GetSystemTime(&currentTime);
6717 SystemTimeToFileTime(&currentTime, &lastAccess);
6718 intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
6719 lastWrite.dwLowDateTime = (DWORD)intervals;
6720 lastWrite.dwHighDateTime = intervals >> 32;
6721 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
6722 if( zUnicodeName==0 ){
6723 return 1;
6724 }
6725 hFile = CreateFileW(
6726 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
6727 FILE_FLAG_BACKUP_SEMANTICS, NULL
6728 );
6729 sqlite3_free(zUnicodeName);
6730 if( hFile!=INVALID_HANDLE_VALUE ){
6731 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
6732 CloseHandle(hFile);
6733 return !bResult;
6734 }else{
6735 return 1;
6736 }
6737 #endif
6738 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
6739 /* Recent unix */
6740 struct timespec times[2];
6741 times[0].tv_nsec = times[1].tv_nsec = 0;
6742 times[0].tv_sec = time(0);
6743 times[1].tv_sec = mtime;
6744 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
6745 return 1;
6746 }
6747 #else
6748 /* Legacy unix */
6749 struct timeval times[2];
6750 times[0].tv_usec = times[1].tv_usec = 0;
6751 times[0].tv_sec = time(0);
6752 times[1].tv_sec = mtime;
6753 if( utimes(zFile, times) ){
6754 return 1;
6755 }
6756 #endif
6757 }
6758
6759 return 0;
6760 }
6761
6762 /*
6763 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
6764 ** Refer to header comments at the top of this file for details.
6765 */
6766 static void writefileFunc(
6767 sqlite3_context *context,
6768 int argc,
6769 sqlite3_value **argv
6770 ){
6771 const char *zFile;
6772 mode_t mode = 0;
6773 int res;
6774 sqlite3_int64 mtime = -1;
6775
6776 if( argc<2 || argc>4 ){
6777 sqlite3_result_error(context,
6778 "wrong number of arguments to function writefile()", -1
6779 );
6780 return;
6781 }
6782
6783 zFile = (const char*)sqlite3_value_text(argv[0]);
6784 if( zFile==0 ) return;
6785 if( argc>=3 ){
6786 mode = (mode_t)sqlite3_value_int(argv[2]);
6787 }
6788 if( argc==4 ){
6789 mtime = sqlite3_value_int64(argv[3]);
6790 }
6791
6792 res = writeFile(context, zFile, argv[1], mode, mtime);
6793 if( res==1 && errno==ENOENT ){
6794 if( makeDirectory(zFile)==SQLITE_OK ){
6795 res = writeFile(context, zFile, argv[1], mode, mtime);
6796 }
6797 }
6798
6799 if( argc>2 && res!=0 ){
6800 if( S_ISLNK(mode) ){
6801 ctxErrorMsg(context, "failed to create symlink: %s", zFile);
6802 }else if( S_ISDIR(mode) ){
6803 ctxErrorMsg(context, "failed to create directory: %s", zFile);
6804 }else{
6805 ctxErrorMsg(context, "failed to write file: %s", zFile);
6806 }
6807 }
6808 }
6809
6810 /*
6811 ** SQL function: lsmode(MODE)
6812 **
6813 ** Given a numberic st_mode from stat(), convert it into a human-readable
6814 ** text string in the style of "ls -l".
6815 */
6816 static void lsModeFunc(
6817 sqlite3_context *context,
6818 int argc,
6819 sqlite3_value **argv
6820 ){
6821 int i;
6822 int iMode = sqlite3_value_int(argv[0]);
6823 char z[16];
6824 (void)argc;
6825 if( S_ISLNK(iMode) ){
6826 z[0] = 'l';
6827 }else if( S_ISREG(iMode) ){
6828 z[0] = '-';
6829 }else if( S_ISDIR(iMode) ){
6830 z[0] = 'd';
6831 }else{
6832 z[0] = '?';
6833 }
6834 for(i=0; i<3; i++){
6835 int m = (iMode >> ((2-i)*3));
6836 char *a = &z[1 + i*3];
6837 a[0] = (m & 0x4) ? 'r' : '-';
6838 a[1] = (m & 0x2) ? 'w' : '-';
6839 a[2] = (m & 0x1) ? 'x' : '-';
6840 }
6841 z[10] = '\0';
6842 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
6843 }
6844
6845 #ifndef SQLITE_OMIT_VIRTUALTABLE
6846
6847 /*
6848 ** Cursor type for recursively iterating through a directory structure.
6849 */
6850 typedef struct fsdir_cursor fsdir_cursor;
6851 typedef struct FsdirLevel FsdirLevel;
6852
6853 struct FsdirLevel {
6854 DIR *pDir; /* From opendir() */
6855 char *zDir; /* Name of directory (nul-terminated) */
6856 };
6857
6858 struct fsdir_cursor {
6859 sqlite3_vtab_cursor base; /* Base class - must be first */
6860
6861 int nLvl; /* Number of entries in aLvl[] array */
6862 int iLvl; /* Index of current entry */
6863 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */
6864
6865 const char *zBase;
6866 int nBase;
6867
6868 struct stat sStat; /* Current lstat() results */
6869 char *zPath; /* Path to current entry */
6870 sqlite3_int64 iRowid; /* Current rowid */
6871 };
6872
6873 typedef struct fsdir_tab fsdir_tab;
6874 struct fsdir_tab {
6875 sqlite3_vtab base; /* Base class - must be first */
6876 };
6877
6878 /*
6879 ** Construct a new fsdir virtual table object.
6880 */
6881 static int fsdirConnect(
6882 sqlite3 *db,
6883 void *pAux,
6884 int argc, const char *const*argv,
6885 sqlite3_vtab **ppVtab,
6886 char **pzErr
6887 ){
6888 fsdir_tab *pNew = 0;
6889 int rc;
6890 (void)pAux;
6891 (void)argc;
6892 (void)argv;
6893 (void)pzErr;
6894 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
6895 if( rc==SQLITE_OK ){
6896 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
6897 if( pNew==0 ) return SQLITE_NOMEM;
6898 memset(pNew, 0, sizeof(*pNew));
6899 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
6900 }
6901 *ppVtab = (sqlite3_vtab*)pNew;
6902 return rc;
6903 }
6904
6905 /*
6906 ** This method is the destructor for fsdir vtab objects.
6907 */
6908 static int fsdirDisconnect(sqlite3_vtab *pVtab){
6909 sqlite3_free(pVtab);
6910 return SQLITE_OK;
6911 }
6912
6913 /*
6914 ** Constructor for a new fsdir_cursor object.
6915 */
6916 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
6917 fsdir_cursor *pCur;
6918 (void)p;
6919 pCur = sqlite3_malloc( sizeof(*pCur) );
6920 if( pCur==0 ) return SQLITE_NOMEM;
6921 memset(pCur, 0, sizeof(*pCur));
6922 pCur->iLvl = -1;
6923 *ppCursor = &pCur->base;
6924 return SQLITE_OK;
6925 }
6926
6927 /*
6928 ** Reset a cursor back to the state it was in when first returned
6929 ** by fsdirOpen().
6930 */
6931 static void fsdirResetCursor(fsdir_cursor *pCur){
6932 int i;
6933 for(i=0; i<=pCur->iLvl; i++){
6934 FsdirLevel *pLvl = &pCur->aLvl[i];
6935 if( pLvl->pDir ) closedir(pLvl->pDir);
6936 sqlite3_free(pLvl->zDir);
6937 }
6938 sqlite3_free(pCur->zPath);
6939 sqlite3_free(pCur->aLvl);
6940 pCur->aLvl = 0;
6941 pCur->zPath = 0;
6942 pCur->zBase = 0;
6943 pCur->nBase = 0;
6944 pCur->nLvl = 0;
6945 pCur->iLvl = -1;
6946 pCur->iRowid = 1;
6947 }
6948
6949 /*
6950 ** Destructor for an fsdir_cursor.
6951 */
6952 static int fsdirClose(sqlite3_vtab_cursor *cur){
6953 fsdir_cursor *pCur = (fsdir_cursor*)cur;
6954
6955 fsdirResetCursor(pCur);
6956 sqlite3_free(pCur);
6957 return SQLITE_OK;
6958 }
6959
6960 /*
6961 ** Set the error message for the virtual table associated with cursor
6962 ** pCur to the results of vprintf(zFmt, ...).
6963 */
6964 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
6965 va_list ap;
6966 va_start(ap, zFmt);
6967 pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
6968 va_end(ap);
6969 }
6970
6971
6972 /*
6973 ** Advance an fsdir_cursor to its next row of output.
6974 */
6975 static int fsdirNext(sqlite3_vtab_cursor *cur){
6976 fsdir_cursor *pCur = (fsdir_cursor*)cur;
6977 mode_t m = pCur->sStat.st_mode;
6978
6979 pCur->iRowid++;
6980 if( S_ISDIR(m) ){
6981 /* Descend into this directory */
6982 int iNew = pCur->iLvl + 1;
6983 FsdirLevel *pLvl;
6984 if( iNew>=pCur->nLvl ){
6985 int nNew = iNew+1;
6986 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
6987 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
6988 if( aNew==0 ) return SQLITE_NOMEM;
6989 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
6990 pCur->aLvl = aNew;
6991 pCur->nLvl = nNew;
6992 }
6993 pCur->iLvl = iNew;
6994 pLvl = &pCur->aLvl[iNew];
6995
6996 pLvl->zDir = pCur->zPath;
6997 pCur->zPath = 0;
6998 pLvl->pDir = opendir(pLvl->zDir);
6999 if( pLvl->pDir==0 ){
7000 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
7001 return SQLITE_ERROR;
7002 }
7003 }
7004
7005 while( pCur->iLvl>=0 ){
7006 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
7007 struct dirent *pEntry = readdir(pLvl->pDir);
7008 if( pEntry ){
7009 if( pEntry->d_name[0]=='.' ){
7010 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
7011 if( pEntry->d_name[1]=='\0' ) continue;
7012 }
7013 sqlite3_free(pCur->zPath);
7014 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
7015 if( pCur->zPath==0 ) return SQLITE_NOMEM;
7016 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
7017 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
7018 return SQLITE_ERROR;
7019 }
7020 return SQLITE_OK;
7021 }
7022 closedir(pLvl->pDir);
7023 sqlite3_free(pLvl->zDir);
7024 pLvl->pDir = 0;
7025 pLvl->zDir = 0;
7026 pCur->iLvl--;
7027 }
7028
7029 /* EOF */
7030 sqlite3_free(pCur->zPath);
7031 pCur->zPath = 0;
7032 return SQLITE_OK;
7033 }
7034
7035 /*
7036 ** Return values of columns for the row at which the series_cursor
7037 ** is currently pointing.
7038 */
7039 static int fsdirColumn(
7040 sqlite3_vtab_cursor *cur, /* The cursor */
7041 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
7042 int i /* Which column to return */
7043 ){
7044 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7045 switch( i ){
7046 case FSDIR_COLUMN_NAME: {
7047 sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
7048 break;
7049 }
7050
7051 case FSDIR_COLUMN_MODE:
7052 sqlite3_result_int64(ctx, pCur->sStat.st_mode);
7053 break;
7054
7055 case FSDIR_COLUMN_MTIME:
7056 sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
7057 break;
7058
7059 case FSDIR_COLUMN_DATA: {
7060 mode_t m = pCur->sStat.st_mode;
7061 if( S_ISDIR(m) ){
7062 sqlite3_result_null(ctx);
7063 #if !defined(_WIN32) && !defined(WIN32)
7064 }else if( S_ISLNK(m) ){
7065 char aStatic[64];
7066 char *aBuf = aStatic;
7067 sqlite3_int64 nBuf = 64;
7068 int n;
7069
7070 while( 1 ){
7071 n = readlink(pCur->zPath, aBuf, nBuf);
7072 if( n<nBuf ) break;
7073 if( aBuf!=aStatic ) sqlite3_free(aBuf);
7074 nBuf = nBuf*2;
7075 aBuf = sqlite3_malloc64(nBuf);
7076 if( aBuf==0 ){
7077 sqlite3_result_error_nomem(ctx);
7078 return SQLITE_NOMEM;
7079 }
7080 }
7081
7082 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
7083 if( aBuf!=aStatic ) sqlite3_free(aBuf);
7084 #endif
7085 }else{
7086 readFileContents(ctx, pCur->zPath);
7087 }
7088 }
7089 case FSDIR_COLUMN_PATH:
7090 default: {
7091 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
7092 ** always return their values as NULL */
7093 break;
7094 }
7095 }
7096 return SQLITE_OK;
7097 }
7098
7099 /*
7100 ** Return the rowid for the current row. In this implementation, the
7101 ** first row returned is assigned rowid value 1, and each subsequent
7102 ** row a value 1 more than that of the previous.
7103 */
7104 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7105 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7106 *pRowid = pCur->iRowid;
7107 return SQLITE_OK;
7108 }
7109
7110 /*
7111 ** Return TRUE if the cursor has been moved off of the last
7112 ** row of output.
7113 */
7114 static int fsdirEof(sqlite3_vtab_cursor *cur){
7115 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7116 return (pCur->zPath==0);
7117 }
7118
7119 /*
7120 ** xFilter callback.
7121 **
7122 ** idxNum==1 PATH parameter only
7123 ** idxNum==2 Both PATH and DIR supplied
7124 */
7125 static int fsdirFilter(
7126 sqlite3_vtab_cursor *cur,
7127 int idxNum, const char *idxStr,
7128 int argc, sqlite3_value **argv
7129 ){
7130 const char *zDir = 0;
7131 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7132 (void)idxStr;
7133 fsdirResetCursor(pCur);
7134
7135 if( idxNum==0 ){
7136 fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
7137 return SQLITE_ERROR;
7138 }
7139
7140 assert( argc==idxNum && (argc==1 || argc==2) );
7141 zDir = (const char*)sqlite3_value_text(argv[0]);
7142 if( zDir==0 ){
7143 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
7144 return SQLITE_ERROR;
7145 }
7146 if( argc==2 ){
7147 pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
7148 }
7149 if( pCur->zBase ){
7150 pCur->nBase = (int)strlen(pCur->zBase)+1;
7151 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
7152 }else{
7153 pCur->zPath = sqlite3_mprintf("%s", zDir);
7154 }
7155
7156 if( pCur->zPath==0 ){
7157 return SQLITE_NOMEM;
7158 }
7159 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
7160 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
7161 return SQLITE_ERROR;
7162 }
7163
7164 return SQLITE_OK;
7165 }
7166
7167 /*
7168 ** SQLite will invoke this method one or more times while planning a query
7169 ** that uses the generate_series virtual table. This routine needs to create
7170 ** a query plan for each invocation and compute an estimated cost for that
7171 ** plan.
7172 **
7173 ** In this implementation idxNum is used to represent the
7174 ** query plan. idxStr is unused.
7175 **
7176 ** The query plan is represented by values of idxNum:
7177 **
7178 ** (1) The path value is supplied by argv[0]
7179 ** (2) Path is in argv[0] and dir is in argv[1]
7180 */
7181 static int fsdirBestIndex(
7182 sqlite3_vtab *tab,
7183 sqlite3_index_info *pIdxInfo
7184 ){
7185 int i; /* Loop over constraints */
7186 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */
7187 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */
7188 int seenPath = 0; /* True if an unusable PATH= constraint is seen */
7189 int seenDir = 0; /* True if an unusable DIR= constraint is seen */
7190 const struct sqlite3_index_constraint *pConstraint;
7191
7192 (void)tab;
7193 pConstraint = pIdxInfo->aConstraint;
7194 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
7195 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
7196 switch( pConstraint->iColumn ){
7197 case FSDIR_COLUMN_PATH: {
7198 if( pConstraint->usable ){
7199 idxPath = i;
7200 seenPath = 0;
7201 }else if( idxPath<0 ){
7202 seenPath = 1;
7203 }
7204 break;
7205 }
7206 case FSDIR_COLUMN_DIR: {
7207 if( pConstraint->usable ){
7208 idxDir = i;
7209 seenDir = 0;
7210 }else if( idxDir<0 ){
7211 seenDir = 1;
7212 }
7213 break;
7214 }
7215 }
7216 }
7217 if( seenPath || seenDir ){
7218 /* If input parameters are unusable, disallow this plan */
7219 return SQLITE_CONSTRAINT;
7220 }
7221
7222 if( idxPath<0 ){
7223 pIdxInfo->idxNum = 0;
7224 /* The pIdxInfo->estimatedCost should have been initialized to a huge
7225 ** number. Leave it unchanged. */
7226 pIdxInfo->estimatedRows = 0x7fffffff;
7227 }else{
7228 pIdxInfo->aConstraintUsage[idxPath].omit = 1;
7229 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
7230 if( idxDir>=0 ){
7231 pIdxInfo->aConstraintUsage[idxDir].omit = 1;
7232 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
7233 pIdxInfo->idxNum = 2;
7234 pIdxInfo->estimatedCost = 10.0;
7235 }else{
7236 pIdxInfo->idxNum = 1;
7237 pIdxInfo->estimatedCost = 100.0;
7238 }
7239 }
7240
7241 return SQLITE_OK;
7242 }
7243
7244 /*
7245 ** Register the "fsdir" virtual table.
7246 */
7247 static int fsdirRegister(sqlite3 *db){
7248 static sqlite3_module fsdirModule = {
7249 0, /* iVersion */
7250 0, /* xCreate */
7251 fsdirConnect, /* xConnect */
7252 fsdirBestIndex, /* xBestIndex */
7253 fsdirDisconnect, /* xDisconnect */
7254 0, /* xDestroy */
7255 fsdirOpen, /* xOpen - open a cursor */
7256 fsdirClose, /* xClose - close a cursor */
7257 fsdirFilter, /* xFilter - configure scan constraints */
7258 fsdirNext, /* xNext - advance a cursor */
7259 fsdirEof, /* xEof - check for end of scan */
7260 fsdirColumn, /* xColumn - read data */
7261 fsdirRowid, /* xRowid - read data */
7262 0, /* xUpdate */
7263 0, /* xBegin */
7264 0, /* xSync */
7265 0, /* xCommit */
7266 0, /* xRollback */
7267 0, /* xFindMethod */
7268 0, /* xRename */
7269 0, /* xSavepoint */
7270 0, /* xRelease */
7271 0, /* xRollbackTo */
7272 0, /* xShadowName */
7273 };
7274
7275 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
7276 return rc;
7277 }
7278 #else /* SQLITE_OMIT_VIRTUALTABLE */
7279 # define fsdirRegister(x) SQLITE_OK
7280 #endif
7281
7282 #ifdef _WIN32
7283
7284 #endif
7285 int sqlite3_fileio_init(
7286 sqlite3 *db,
7287 char **pzErrMsg,
7288 const sqlite3_api_routines *pApi
7289 ){
7290 int rc = SQLITE_OK;
7291 SQLITE_EXTENSION_INIT2(pApi);
7292 (void)pzErrMsg; /* Unused parameter */
7293 rc = sqlite3_create_function(db, "readfile", 1,
7294 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
7295 readfileFunc, 0, 0);
7296 if( rc==SQLITE_OK ){
7297 rc = sqlite3_create_function(db, "writefile", -1,
7298 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
7299 writefileFunc, 0, 0);
7300 }
7301 if( rc==SQLITE_OK ){
7302 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
7303 lsModeFunc, 0, 0);
7304 }
7305 if( rc==SQLITE_OK ){
7306 rc = fsdirRegister(db);
7307 }
7308 return rc;
7309 }
7310
7311 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
7312 /* To allow a standalone DLL, make test_windirent.c use the same
7313 * redefined SQLite API calls as the above extension code does.
7314 * Just pull in this .c to accomplish this. As a beneficial side
7315 * effect, this extension becomes a single translation unit. */
7316 # include "test_windirent.c"
7317 #endif
7318
7319 /************************* End ../ext/misc/fileio.c ********************/
7320 /************************* Begin ../ext/misc/completion.c ******************/
7321 /*
7322 ** 2017-07-10
7323 **
7324 ** The author disclaims copyright to this source code. In place of
7325 ** a legal notice, here is a blessing:
7326 **
7327 ** May you do good and not evil.
7328 ** May you find forgiveness for yourself and forgive others.
7329 ** May you share freely, never taking more than you give.
7330 **
7331 *************************************************************************
7332 **
7333 ** This file implements an eponymous virtual table that returns suggested
7334 ** completions for a partial SQL input.
7335 **
7336 ** Suggested usage:
7337 **
7338 ** SELECT DISTINCT candidate COLLATE nocase
7339 ** FROM completion($prefix,$wholeline)
7340 ** ORDER BY 1;
7341 **
7342 ** The two query parameters are optional. $prefix is the text of the
7343 ** current word being typed and that is to be completed. $wholeline is
7344 ** the complete input line, used for context.
7345 **
7346 ** The raw completion() table might return the same candidate multiple
7347 ** times, for example if the same column name is used to two or more
7348 ** tables. And the candidates are returned in an arbitrary order. Hence,
7349 ** the DISTINCT and ORDER BY are recommended.
7350 **
7351 ** This virtual table operates at the speed of human typing, and so there
7352 ** is no attempt to make it fast. Even a slow implementation will be much
7353 ** faster than any human can type.
7354 **
7355 */
7356 /* #include "sqlite3ext.h" */
7357 SQLITE_EXTENSION_INIT1
7358 #include <assert.h>
7359 #include <string.h>
7360 #include <ctype.h>
7361
7362 #ifndef SQLITE_OMIT_VIRTUALTABLE
7363
7364 /* completion_vtab is a subclass of sqlite3_vtab which will
7365 ** serve as the underlying representation of a completion virtual table
7366 */
7367 typedef struct completion_vtab completion_vtab;
7368 struct completion_vtab {
7369 sqlite3_vtab base; /* Base class - must be first */
7370 sqlite3 *db; /* Database connection for this completion vtab */
7371 };
7372
7373 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
7374 ** serve as the underlying representation of a cursor that scans
7375 ** over rows of the result
7376 */
7377 typedef struct completion_cursor completion_cursor;
7378 struct completion_cursor {
7379 sqlite3_vtab_cursor base; /* Base class - must be first */
7380 sqlite3 *db; /* Database connection for this cursor */
7381 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */
7382 char *zPrefix; /* The prefix for the word we want to complete */
7383 char *zLine; /* The whole that we want to complete */
7384 const char *zCurrentRow; /* Current output row */
7385 int szRow; /* Length of the zCurrentRow string */
7386 sqlite3_stmt *pStmt; /* Current statement */
7387 sqlite3_int64 iRowid; /* The rowid */
7388 int ePhase; /* Current phase */
7389 int j; /* inter-phase counter */
7390 };
7391
7392 /* Values for ePhase:
7393 */
7394 #define COMPLETION_FIRST_PHASE 1
7395 #define COMPLETION_KEYWORDS 1
7396 #define COMPLETION_PRAGMAS 2
7397 #define COMPLETION_FUNCTIONS 3
7398 #define COMPLETION_COLLATIONS 4
7399 #define COMPLETION_INDEXES 5
7400 #define COMPLETION_TRIGGERS 6
7401 #define COMPLETION_DATABASES 7
7402 #define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */
7403 #define COMPLETION_COLUMNS 9
7404 #define COMPLETION_MODULES 10
7405 #define COMPLETION_EOF 11
7406
7407 /*
7408 ** The completionConnect() method is invoked to create a new
7409 ** completion_vtab that describes the completion virtual table.
7410 **
7411 ** Think of this routine as the constructor for completion_vtab objects.
7412 **
7413 ** All this routine needs to do is:
7414 **
7415 ** (1) Allocate the completion_vtab object and initialize all fields.
7416 **
7417 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
7418 ** result set of queries against completion will look like.
7419 */
7420 static int completionConnect(
7421 sqlite3 *db,
7422 void *pAux,
7423 int argc, const char *const*argv,
7424 sqlite3_vtab **ppVtab,
7425 char **pzErr
7426 ){
7427 completion_vtab *pNew;
7428 int rc;
7429
7430 (void)(pAux); /* Unused parameter */
7431 (void)(argc); /* Unused parameter */
7432 (void)(argv); /* Unused parameter */
7433 (void)(pzErr); /* Unused parameter */
7434
7435 /* Column numbers */
7436 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */
7437 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */
7438 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
7439 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
7440
7441 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
7442 rc = sqlite3_declare_vtab(db,
7443 "CREATE TABLE x("
7444 " candidate TEXT,"
7445 " prefix TEXT HIDDEN,"
7446 " wholeline TEXT HIDDEN,"
7447 " phase INT HIDDEN" /* Used for debugging only */
7448 ")");
7449 if( rc==SQLITE_OK ){
7450 pNew = sqlite3_malloc( sizeof(*pNew) );
7451 *ppVtab = (sqlite3_vtab*)pNew;
7452 if( pNew==0 ) return SQLITE_NOMEM;
7453 memset(pNew, 0, sizeof(*pNew));
7454 pNew->db = db;
7455 }
7456 return rc;
7457 }
7458
7459 /*
7460 ** This method is the destructor for completion_cursor objects.
7461 */
7462 static int completionDisconnect(sqlite3_vtab *pVtab){
7463 sqlite3_free(pVtab);
7464 return SQLITE_OK;
7465 }
7466
7467 /*
7468 ** Constructor for a new completion_cursor object.
7469 */
7470 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
7471 completion_cursor *pCur;
7472 pCur = sqlite3_malloc( sizeof(*pCur) );
7473 if( pCur==0 ) return SQLITE_NOMEM;
7474 memset(pCur, 0, sizeof(*pCur));
7475 pCur->db = ((completion_vtab*)p)->db;
7476 *ppCursor = &pCur->base;
7477 return SQLITE_OK;
7478 }
7479
7480 /*
7481 ** Reset the completion_cursor.
7482 */
7483 static void completionCursorReset(completion_cursor *pCur){
7484 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0;
7485 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0;
7486 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
7487 pCur->j = 0;
7488 }
7489
7490 /*
7491 ** Destructor for a completion_cursor.
7492 */
7493 static int completionClose(sqlite3_vtab_cursor *cur){
7494 completionCursorReset((completion_cursor*)cur);
7495 sqlite3_free(cur);
7496 return SQLITE_OK;
7497 }
7498
7499 /*
7500 ** Advance a completion_cursor to its next row of output.
7501 **
7502 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
7503 ** record the current state of the scan. This routine sets ->zCurrentRow
7504 ** to the current row of output and then returns. If no more rows remain,
7505 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
7506 ** table that has reached the end of its scan.
7507 **
7508 ** The current implementation just lists potential identifiers and
7509 ** keywords and filters them by zPrefix. Future enhancements should
7510 ** take zLine into account to try to restrict the set of identifiers and
7511 ** keywords based on what would be legal at the current point of input.
7512 */
7513 static int completionNext(sqlite3_vtab_cursor *cur){
7514 completion_cursor *pCur = (completion_cursor*)cur;
7515 int eNextPhase = 0; /* Next phase to try if current phase reaches end */
7516 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */
7517 pCur->iRowid++;
7518 while( pCur->ePhase!=COMPLETION_EOF ){
7519 switch( pCur->ePhase ){
7520 case COMPLETION_KEYWORDS: {
7521 if( pCur->j >= sqlite3_keyword_count() ){
7522 pCur->zCurrentRow = 0;
7523 pCur->ePhase = COMPLETION_DATABASES;
7524 }else{
7525 sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
7526 }
7527 iCol = -1;
7528 break;
7529 }
7530 case COMPLETION_DATABASES: {
7531 if( pCur->pStmt==0 ){
7532 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
7533 &pCur->pStmt, 0);
7534 }
7535 iCol = 1;
7536 eNextPhase = COMPLETION_TABLES;
7537 break;
7538 }
7539 case COMPLETION_TABLES: {
7540 if( pCur->pStmt==0 ){
7541 sqlite3_stmt *pS2;
7542 char *zSql = 0;
7543 const char *zSep = "";
7544 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
7545 while( sqlite3_step(pS2)==SQLITE_ROW ){
7546 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
7547 zSql = sqlite3_mprintf(
7548 "%z%s"
7549 "SELECT name FROM \"%w\".sqlite_schema",
7550 zSql, zSep, zDb
7551 );
7552 if( zSql==0 ) return SQLITE_NOMEM;
7553 zSep = " UNION ";
7554 }
7555 sqlite3_finalize(pS2);
7556 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
7557 sqlite3_free(zSql);
7558 }
7559 iCol = 0;
7560 eNextPhase = COMPLETION_COLUMNS;
7561 break;
7562 }
7563 case COMPLETION_COLUMNS: {
7564 if( pCur->pStmt==0 ){
7565 sqlite3_stmt *pS2;
7566 char *zSql = 0;
7567 const char *zSep = "";
7568 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
7569 while( sqlite3_step(pS2)==SQLITE_ROW ){
7570 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
7571 zSql = sqlite3_mprintf(
7572 "%z%s"
7573 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
7574 " JOIN pragma_table_info(sm.name,%Q) AS pti"
7575 " WHERE sm.type='table'",
7576 zSql, zSep, zDb, zDb
7577 );
7578 if( zSql==0 ) return SQLITE_NOMEM;
7579 zSep = " UNION ";
7580 }
7581 sqlite3_finalize(pS2);
7582 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
7583 sqlite3_free(zSql);
7584 }
7585 iCol = 0;
7586 eNextPhase = COMPLETION_EOF;
7587 break;
7588 }
7589 }
7590 if( iCol<0 ){
7591 /* This case is when the phase presets zCurrentRow */
7592 if( pCur->zCurrentRow==0 ) continue;
7593 }else{
7594 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
7595 /* Extract the next row of content */
7596 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
7597 pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
7598 }else{
7599 /* When all rows are finished, advance to the next phase */
7600 sqlite3_finalize(pCur->pStmt);
7601 pCur->pStmt = 0;
7602 pCur->ePhase = eNextPhase;
7603 continue;
7604 }
7605 }
7606 if( pCur->nPrefix==0 ) break;
7607 if( pCur->nPrefix<=pCur->szRow
7608 && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
7609 ){
7610 break;
7611 }
7612 }
7613
7614 return SQLITE_OK;
7615 }
7616
7617 /*
7618 ** Return values of columns for the row at which the completion_cursor
7619 ** is currently pointing.
7620 */
7621 static int completionColumn(
7622 sqlite3_vtab_cursor *cur, /* The cursor */
7623 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
7624 int i /* Which column to return */
7625 ){
7626 completion_cursor *pCur = (completion_cursor*)cur;
7627 switch( i ){
7628 case COMPLETION_COLUMN_CANDIDATE: {
7629 sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
7630 break;
7631 }
7632 case COMPLETION_COLUMN_PREFIX: {
7633 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
7634 break;
7635 }
7636 case COMPLETION_COLUMN_WHOLELINE: {
7637 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
7638 break;
7639 }
7640 case COMPLETION_COLUMN_PHASE: {
7641 sqlite3_result_int(ctx, pCur->ePhase);
7642 break;
7643 }
7644 }
7645 return SQLITE_OK;
7646 }
7647
7648 /*
7649 ** Return the rowid for the current row. In this implementation, the
7650 ** rowid is the same as the output value.
7651 */
7652 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7653 completion_cursor *pCur = (completion_cursor*)cur;
7654 *pRowid = pCur->iRowid;
7655 return SQLITE_OK;
7656 }
7657
7658 /*
7659 ** Return TRUE if the cursor has been moved off of the last
7660 ** row of output.
7661 */
7662 static int completionEof(sqlite3_vtab_cursor *cur){
7663 completion_cursor *pCur = (completion_cursor*)cur;
7664 return pCur->ePhase >= COMPLETION_EOF;
7665 }
7666
7667 /*
7668 ** This method is called to "rewind" the completion_cursor object back
7669 ** to the first row of output. This method is always called at least
7670 ** once prior to any call to completionColumn() or completionRowid() or
7671 ** completionEof().
7672 */
7673 static int completionFilter(
7674 sqlite3_vtab_cursor *pVtabCursor,
7675 int idxNum, const char *idxStr,
7676 int argc, sqlite3_value **argv
7677 ){
7678 completion_cursor *pCur = (completion_cursor *)pVtabCursor;
7679 int iArg = 0;
7680 (void)(idxStr); /* Unused parameter */
7681 (void)(argc); /* Unused parameter */
7682 completionCursorReset(pCur);
7683 if( idxNum & 1 ){
7684 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
7685 if( pCur->nPrefix>0 ){
7686 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
7687 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
7688 }
7689 iArg = 1;
7690 }
7691 if( idxNum & 2 ){
7692 pCur->nLine = sqlite3_value_bytes(argv[iArg]);
7693 if( pCur->nLine>0 ){
7694 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
7695 if( pCur->zLine==0 ) return SQLITE_NOMEM;
7696 }
7697 }
7698 if( pCur->zLine!=0 && pCur->zPrefix==0 ){
7699 int i = pCur->nLine;
7700 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
7701 i--;
7702 }
7703 pCur->nPrefix = pCur->nLine - i;
7704 if( pCur->nPrefix>0 ){
7705 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
7706 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
7707 }
7708 }
7709 pCur->iRowid = 0;
7710 pCur->ePhase = COMPLETION_FIRST_PHASE;
7711 return completionNext(pVtabCursor);
7712 }
7713
7714 /*
7715 ** SQLite will invoke this method one or more times while planning a query
7716 ** that uses the completion virtual table. This routine needs to create
7717 ** a query plan for each invocation and compute an estimated cost for that
7718 ** plan.
7719 **
7720 ** There are two hidden parameters that act as arguments to the table-valued
7721 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix"
7722 ** is available and bit 1 is set if "wholeline" is available.
7723 */
7724 static int completionBestIndex(
7725 sqlite3_vtab *tab,
7726 sqlite3_index_info *pIdxInfo
7727 ){
7728 int i; /* Loop over constraints */
7729 int idxNum = 0; /* The query plan bitmask */
7730 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */
7731 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
7732 int nArg = 0; /* Number of arguments that completeFilter() expects */
7733 const struct sqlite3_index_constraint *pConstraint;
7734
7735 (void)(tab); /* Unused parameter */
7736 pConstraint = pIdxInfo->aConstraint;
7737 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
7738 if( pConstraint->usable==0 ) continue;
7739 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
7740 switch( pConstraint->iColumn ){
7741 case COMPLETION_COLUMN_PREFIX:
7742 prefixIdx = i;
7743 idxNum |= 1;
7744 break;
7745 case COMPLETION_COLUMN_WHOLELINE:
7746 wholelineIdx = i;
7747 idxNum |= 2;
7748 break;
7749 }
7750 }
7751 if( prefixIdx>=0 ){
7752 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
7753 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
7754 }
7755 if( wholelineIdx>=0 ){
7756 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
7757 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
7758 }
7759 pIdxInfo->idxNum = idxNum;
7760 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
7761 pIdxInfo->estimatedRows = 500 - 100*nArg;
7762 return SQLITE_OK;
7763 }
7764
7765 /*
7766 ** This following structure defines all the methods for the
7767 ** completion virtual table.
7768 */
7769 static sqlite3_module completionModule = {
7770 0, /* iVersion */
7771 0, /* xCreate */
7772 completionConnect, /* xConnect */
7773 completionBestIndex, /* xBestIndex */
7774 completionDisconnect, /* xDisconnect */
7775 0, /* xDestroy */
7776 completionOpen, /* xOpen - open a cursor */
7777 completionClose, /* xClose - close a cursor */
7778 completionFilter, /* xFilter - configure scan constraints */
7779 completionNext, /* xNext - advance a cursor */
7780 completionEof, /* xEof - check for end of scan */
7781 completionColumn, /* xColumn - read data */
7782 completionRowid, /* xRowid - read data */
7783 0, /* xUpdate */
7784 0, /* xBegin */
7785 0, /* xSync */
7786 0, /* xCommit */
7787 0, /* xRollback */
7788 0, /* xFindMethod */
7789 0, /* xRename */
7790 0, /* xSavepoint */
7791 0, /* xRelease */
7792 0, /* xRollbackTo */
7793 0 /* xShadowName */
7794 };
7795
7796 #endif /* SQLITE_OMIT_VIRTUALTABLE */
7797
7798 int sqlite3CompletionVtabInit(sqlite3 *db){
7799 int rc = SQLITE_OK;
7800 #ifndef SQLITE_OMIT_VIRTUALTABLE
7801 rc = sqlite3_create_module(db, "completion", &completionModule, 0);
7802 #endif
7803 return rc;
7804 }
7805
7806 #ifdef _WIN32
7807
7808 #endif
7809 int sqlite3_completion_init(
7810 sqlite3 *db,
7811 char **pzErrMsg,
7812 const sqlite3_api_routines *pApi
7813 ){
7814 int rc = SQLITE_OK;
7815 SQLITE_EXTENSION_INIT2(pApi);
7816 (void)(pzErrMsg); /* Unused parameter */
7817 #ifndef SQLITE_OMIT_VIRTUALTABLE
7818 rc = sqlite3CompletionVtabInit(db);
7819 #endif
7820 return rc;
7821 }
7822
7823 /************************* End ../ext/misc/completion.c ********************/
7824 /************************* Begin ../ext/misc/appendvfs.c ******************/
7825 /*
7826 ** 2017-10-20
7827 **
7828 ** The author disclaims copyright to this source code. In place of
7829 ** a legal notice, here is a blessing:
7830 **
7831 ** May you do good and not evil.
7832 ** May you find forgiveness for yourself and forgive others.
7833 ** May you share freely, never taking more than you give.
7834 **
7835 ******************************************************************************
7836 **
7837 ** This file implements a VFS shim that allows an SQLite database to be
7838 ** appended onto the end of some other file, such as an executable.
7839 **
7840 ** A special record must appear at the end of the file that identifies the
7841 ** file as an appended database and provides the offset to the first page
7842 ** of the exposed content. (Or, it is the length of the content prefix.)
7843 ** For best performance page 1 should be located at a disk page boundary,
7844 ** though that is not required.
7845 **
7846 ** When opening a database using this VFS, the connection might treat
7847 ** the file as an ordinary SQLite database, or it might treat it as a
7848 ** database appended onto some other file. The decision is made by
7849 ** applying the following rules in order:
7850 **
7851 ** (1) An empty file is an ordinary database.
7852 **
7853 ** (2) If the file ends with the appendvfs trailer string
7854 ** "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
7855 **
7856 ** (3) If the file begins with the standard SQLite prefix string
7857 ** "SQLite format 3", that file is an ordinary database.
7858 **
7859 ** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is
7860 ** set, then a new database is appended to the already existing file.
7861 **
7862 ** (5) Otherwise, SQLITE_CANTOPEN is returned.
7863 **
7864 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
7865 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
7866 ** This VFS will not read or write past the 1GiB mark. This restriction
7867 ** might be lifted in future versions. For now, if you need a larger
7868 ** database, then keep it in a separate file.
7869 **
7870 ** If the file being opened is a plain database (not an appended one), then
7871 ** this shim is a pass-through into the default underlying VFS. (rule 3)
7872 **/
7873 /* #include "sqlite3ext.h" */
7874 SQLITE_EXTENSION_INIT1
7875 #include <string.h>
7876 #include <assert.h>
7877
7878 /* The append mark at the end of the database is:
7879 **
7880 ** Start-Of-SQLite3-NNNNNNNN
7881 ** 123456789 123456789 12345
7882 **
7883 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
7884 ** the offset to page 1, and also the length of the prefix content.
7885 */
7886 #define APND_MARK_PREFIX "Start-Of-SQLite3-"
7887 #define APND_MARK_PREFIX_SZ 17
7888 #define APND_MARK_FOS_SZ 8
7889 #define APND_MARK_SIZE (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
7890
7891 /*
7892 ** Maximum size of the combined prefix + database + append-mark. This
7893 ** must be less than 0x40000000 to avoid locking issues on Windows.
7894 */
7895 #define APND_MAX_SIZE (0x40000000)
7896
7897 /*
7898 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
7899 */
7900 #ifndef APND_ROUNDUP
7901 #define APND_ROUNDUP 4096
7902 #endif
7903 #define APND_ALIGN_MASK ((sqlite3_int64)(APND_ROUNDUP-1))
7904 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
7905
7906 /*
7907 ** Forward declaration of objects used by this utility
7908 */
7909 typedef struct sqlite3_vfs ApndVfs;
7910 typedef struct ApndFile ApndFile;
7911
7912 /* Access to a lower-level VFS that (might) implement dynamic loading,
7913 ** access to randomness, etc.
7914 */
7915 #define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData))
7916 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
7917
7918 /* An open appendvfs file
7919 **
7920 ** An instance of this structure describes the appended database file.
7921 ** A separate sqlite3_file object is always appended. The appended
7922 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
7923 ** the entire file, including the prefix, the database, and the
7924 ** append-mark.
7925 **
7926 ** The structure of an AppendVFS database is like this:
7927 **
7928 ** +-------------+---------+----------+-------------+
7929 ** | prefix-file | padding | database | append-mark |
7930 ** +-------------+---------+----------+-------------+
7931 ** ^ ^
7932 ** | |
7933 ** iPgOne iMark
7934 **
7935 **
7936 ** "prefix file" - file onto which the database has been appended.
7937 ** "padding" - zero or more bytes inserted so that "database"
7938 ** starts on an APND_ROUNDUP boundary
7939 ** "database" - The SQLite database file
7940 ** "append-mark" - The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
7941 ** the offset from the start of prefix-file to the start
7942 ** of "database".
7943 **
7944 ** The size of the database is iMark - iPgOne.
7945 **
7946 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
7947 ** of iPgOne stored as a big-ending 64-bit integer.
7948 **
7949 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
7950 ** Or, iMark is -1 to indicate that it has not yet been written.
7951 */
7952 struct ApndFile {
7953 sqlite3_file base; /* Subclass. MUST BE FIRST! */
7954 sqlite3_int64 iPgOne; /* Offset to the start of the database */
7955 sqlite3_int64 iMark; /* Offset of the append mark. -1 if unwritten */
7956 /* Always followed by another sqlite3_file that describes the whole file */
7957 };
7958
7959 /*
7960 ** Methods for ApndFile
7961 */
7962 static int apndClose(sqlite3_file*);
7963 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
7964 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
7965 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
7966 static int apndSync(sqlite3_file*, int flags);
7967 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
7968 static int apndLock(sqlite3_file*, int);
7969 static int apndUnlock(sqlite3_file*, int);
7970 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
7971 static int apndFileControl(sqlite3_file*, int op, void *pArg);
7972 static int apndSectorSize(sqlite3_file*);
7973 static int apndDeviceCharacteristics(sqlite3_file*);
7974 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
7975 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
7976 static void apndShmBarrier(sqlite3_file*);
7977 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
7978 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
7979 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
7980
7981 /*
7982 ** Methods for ApndVfs
7983 */
7984 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
7985 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
7986 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
7987 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
7988 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
7989 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
7990 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
7991 static void apndDlClose(sqlite3_vfs*, void*);
7992 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
7993 static int apndSleep(sqlite3_vfs*, int microseconds);
7994 static int apndCurrentTime(sqlite3_vfs*, double*);
7995 static int apndGetLastError(sqlite3_vfs*, int, char *);
7996 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
7997 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
7998 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
7999 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
8000
8001 static sqlite3_vfs apnd_vfs = {
8002 3, /* iVersion (set when registered) */
8003 0, /* szOsFile (set when registered) */
8004 1024, /* mxPathname */
8005 0, /* pNext */
8006 "apndvfs", /* zName */
8007 0, /* pAppData (set when registered) */
8008 apndOpen, /* xOpen */
8009 apndDelete, /* xDelete */
8010 apndAccess, /* xAccess */
8011 apndFullPathname, /* xFullPathname */
8012 apndDlOpen, /* xDlOpen */
8013 apndDlError, /* xDlError */
8014 apndDlSym, /* xDlSym */
8015 apndDlClose, /* xDlClose */
8016 apndRandomness, /* xRandomness */
8017 apndSleep, /* xSleep */
8018 apndCurrentTime, /* xCurrentTime */
8019 apndGetLastError, /* xGetLastError */
8020 apndCurrentTimeInt64, /* xCurrentTimeInt64 */
8021 apndSetSystemCall, /* xSetSystemCall */
8022 apndGetSystemCall, /* xGetSystemCall */
8023 apndNextSystemCall /* xNextSystemCall */
8024 };
8025
8026 static const sqlite3_io_methods apnd_io_methods = {
8027 3, /* iVersion */
8028 apndClose, /* xClose */
8029 apndRead, /* xRead */
8030 apndWrite, /* xWrite */
8031 apndTruncate, /* xTruncate */
8032 apndSync, /* xSync */
8033 apndFileSize, /* xFileSize */
8034 apndLock, /* xLock */
8035 apndUnlock, /* xUnlock */
8036 apndCheckReservedLock, /* xCheckReservedLock */
8037 apndFileControl, /* xFileControl */
8038 apndSectorSize, /* xSectorSize */
8039 apndDeviceCharacteristics, /* xDeviceCharacteristics */
8040 apndShmMap, /* xShmMap */
8041 apndShmLock, /* xShmLock */
8042 apndShmBarrier, /* xShmBarrier */
8043 apndShmUnmap, /* xShmUnmap */
8044 apndFetch, /* xFetch */
8045 apndUnfetch /* xUnfetch */
8046 };
8047
8048 /*
8049 ** Close an apnd-file.
8050 */
8051 static int apndClose(sqlite3_file *pFile){
8052 pFile = ORIGFILE(pFile);
8053 return pFile->pMethods->xClose(pFile);
8054 }
8055
8056 /*
8057 ** Read data from an apnd-file.
8058 */
8059 static int apndRead(
8060 sqlite3_file *pFile,
8061 void *zBuf,
8062 int iAmt,
8063 sqlite_int64 iOfst
8064 ){
8065 ApndFile *paf = (ApndFile *)pFile;
8066 pFile = ORIGFILE(pFile);
8067 return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8068 }
8069
8070 /*
8071 ** Add the append-mark onto what should become the end of the file.
8072 * If and only if this succeeds, internal ApndFile.iMark is updated.
8073 * Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
8074 */
8075 static int apndWriteMark(
8076 ApndFile *paf,
8077 sqlite3_file *pFile,
8078 sqlite_int64 iWriteEnd
8079 ){
8080 sqlite_int64 iPgOne = paf->iPgOne;
8081 unsigned char a[APND_MARK_SIZE];
8082 int i = APND_MARK_FOS_SZ;
8083 int rc;
8084 assert(pFile == ORIGFILE(paf));
8085 memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
8086 while( --i >= 0 ){
8087 a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
8088 iPgOne >>= 8;
8089 }
8090 iWriteEnd += paf->iPgOne;
8091 if( SQLITE_OK==(rc = pFile->pMethods->xWrite
8092 (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
8093 paf->iMark = iWriteEnd;
8094 }
8095 return rc;
8096 }
8097
8098 /*
8099 ** Write data to an apnd-file.
8100 */
8101 static int apndWrite(
8102 sqlite3_file *pFile,
8103 const void *zBuf,
8104 int iAmt,
8105 sqlite_int64 iOfst
8106 ){
8107 ApndFile *paf = (ApndFile *)pFile;
8108 sqlite_int64 iWriteEnd = iOfst + iAmt;
8109 if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
8110 pFile = ORIGFILE(pFile);
8111 /* If append-mark is absent or will be overwritten, write it. */
8112 if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
8113 int rc = apndWriteMark(paf, pFile, iWriteEnd);
8114 if( SQLITE_OK!=rc ) return rc;
8115 }
8116 return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8117 }
8118
8119 /*
8120 ** Truncate an apnd-file.
8121 */
8122 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
8123 ApndFile *paf = (ApndFile *)pFile;
8124 pFile = ORIGFILE(pFile);
8125 /* The append mark goes out first so truncate failure does not lose it. */
8126 if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
8127 /* Truncate underlying file just past append mark */
8128 return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
8129 }
8130
8131 /*
8132 ** Sync an apnd-file.
8133 */
8134 static int apndSync(sqlite3_file *pFile, int flags){
8135 pFile = ORIGFILE(pFile);
8136 return pFile->pMethods->xSync(pFile, flags);
8137 }
8138
8139 /*
8140 ** Return the current file-size of an apnd-file.
8141 ** If the append mark is not yet there, the file-size is 0.
8142 */
8143 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
8144 ApndFile *paf = (ApndFile *)pFile;
8145 *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
8146 return SQLITE_OK;
8147 }
8148
8149 /*
8150 ** Lock an apnd-file.
8151 */
8152 static int apndLock(sqlite3_file *pFile, int eLock){
8153 pFile = ORIGFILE(pFile);
8154 return pFile->pMethods->xLock(pFile, eLock);
8155 }
8156
8157 /*
8158 ** Unlock an apnd-file.
8159 */
8160 static int apndUnlock(sqlite3_file *pFile, int eLock){
8161 pFile = ORIGFILE(pFile);
8162 return pFile->pMethods->xUnlock(pFile, eLock);
8163 }
8164
8165 /*
8166 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
8167 */
8168 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
8169 pFile = ORIGFILE(pFile);
8170 return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
8171 }
8172
8173 /*
8174 ** File control method. For custom operations on an apnd-file.
8175 */
8176 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
8177 ApndFile *paf = (ApndFile *)pFile;
8178 int rc;
8179 pFile = ORIGFILE(pFile);
8180 if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
8181 rc = pFile->pMethods->xFileControl(pFile, op, pArg);
8182 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
8183 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
8184 }
8185 return rc;
8186 }
8187
8188 /*
8189 ** Return the sector-size in bytes for an apnd-file.
8190 */
8191 static int apndSectorSize(sqlite3_file *pFile){
8192 pFile = ORIGFILE(pFile);
8193 return pFile->pMethods->xSectorSize(pFile);
8194 }
8195
8196 /*
8197 ** Return the device characteristic flags supported by an apnd-file.
8198 */
8199 static int apndDeviceCharacteristics(sqlite3_file *pFile){
8200 pFile = ORIGFILE(pFile);
8201 return pFile->pMethods->xDeviceCharacteristics(pFile);
8202 }
8203
8204 /* Create a shared memory file mapping */
8205 static int apndShmMap(
8206 sqlite3_file *pFile,
8207 int iPg,
8208 int pgsz,
8209 int bExtend,
8210 void volatile **pp
8211 ){
8212 pFile = ORIGFILE(pFile);
8213 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
8214 }
8215
8216 /* Perform locking on a shared-memory segment */
8217 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
8218 pFile = ORIGFILE(pFile);
8219 return pFile->pMethods->xShmLock(pFile,offset,n,flags);
8220 }
8221
8222 /* Memory barrier operation on shared memory */
8223 static void apndShmBarrier(sqlite3_file *pFile){
8224 pFile = ORIGFILE(pFile);
8225 pFile->pMethods->xShmBarrier(pFile);
8226 }
8227
8228 /* Unmap a shared memory segment */
8229 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
8230 pFile = ORIGFILE(pFile);
8231 return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
8232 }
8233
8234 /* Fetch a page of a memory-mapped file */
8235 static int apndFetch(
8236 sqlite3_file *pFile,
8237 sqlite3_int64 iOfst,
8238 int iAmt,
8239 void **pp
8240 ){
8241 ApndFile *p = (ApndFile *)pFile;
8242 if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
8243 return SQLITE_IOERR; /* Cannot read what is not yet there. */
8244 }
8245 pFile = ORIGFILE(pFile);
8246 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
8247 }
8248
8249 /* Release a memory-mapped page */
8250 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
8251 ApndFile *p = (ApndFile *)pFile;
8252 pFile = ORIGFILE(pFile);
8253 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
8254 }
8255
8256 /*
8257 ** Try to read the append-mark off the end of a file. Return the
8258 ** start of the appended database if the append-mark is present.
8259 ** If there is no valid append-mark, return -1;
8260 **
8261 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
8262 ** indicates that the appended database contains at least one page. The
8263 ** start-of-database value must be a multiple of 512.
8264 */
8265 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
8266 int rc, i;
8267 sqlite3_int64 iMark;
8268 int msbs = 8 * (APND_MARK_FOS_SZ-1);
8269 unsigned char a[APND_MARK_SIZE];
8270
8271 if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
8272 rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
8273 if( rc ) return -1;
8274 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
8275 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
8276 for(i=1; i<8; i++){
8277 msbs -= 8;
8278 iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
8279 }
8280 if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
8281 if( iMark & 0x1ff ) return -1;
8282 return iMark;
8283 }
8284
8285 static const char apvfsSqliteHdr[] = "SQLite format 3";
8286 /*
8287 ** Check to see if the file is an appendvfs SQLite database file.
8288 ** Return true iff it is such. Parameter sz is the file's size.
8289 */
8290 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
8291 int rc;
8292 char zHdr[16];
8293 sqlite3_int64 iMark = apndReadMark(sz, pFile);
8294 if( iMark>=0 ){
8295 /* If file has the correct end-marker, the expected odd size, and the
8296 ** SQLite DB type marker where the end-marker puts it, then it
8297 ** is an appendvfs database.
8298 */
8299 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
8300 if( SQLITE_OK==rc
8301 && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
8302 && (sz & 0x1ff) == APND_MARK_SIZE
8303 && sz>=512+APND_MARK_SIZE
8304 ){
8305 return 1; /* It's an appendvfs database */
8306 }
8307 }
8308 return 0;
8309 }
8310
8311 /*
8312 ** Check to see if the file is an ordinary SQLite database file.
8313 ** Return true iff so. Parameter sz is the file's size.
8314 */
8315 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
8316 char zHdr[16];
8317 if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
8318 || (sz & 0x1ff) != 0
8319 || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
8320 || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
8321 ){
8322 return 0;
8323 }else{
8324 return 1;
8325 }
8326 }
8327
8328 /*
8329 ** Open an apnd file handle.
8330 */
8331 static int apndOpen(
8332 sqlite3_vfs *pApndVfs,
8333 const char *zName,
8334 sqlite3_file *pFile,
8335 int flags,
8336 int *pOutFlags
8337 ){
8338 ApndFile *pApndFile = (ApndFile*)pFile;
8339 sqlite3_file *pBaseFile = ORIGFILE(pFile);
8340 sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
8341 int rc;
8342 sqlite3_int64 sz = 0;
8343 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
8344 /* The appendvfs is not to be used for transient or temporary databases.
8345 ** Just use the base VFS open to initialize the given file object and
8346 ** open the underlying file. (Appendvfs is then unused for this file.)
8347 */
8348 return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
8349 }
8350 memset(pApndFile, 0, sizeof(ApndFile));
8351 pFile->pMethods = &apnd_io_methods;
8352 pApndFile->iMark = -1; /* Append mark not yet written */
8353
8354 rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
8355 if( rc==SQLITE_OK ){
8356 rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
8357 if( rc ){
8358 pBaseFile->pMethods->xClose(pBaseFile);
8359 }
8360 }
8361 if( rc ){
8362 pFile->pMethods = 0;
8363 return rc;
8364 }
8365 if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
8366 /* The file being opened appears to be just an ordinary DB. Copy
8367 ** the base dispatch-table so this instance mimics the base VFS.
8368 */
8369 memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
8370 return SQLITE_OK;
8371 }
8372 pApndFile->iPgOne = apndReadMark(sz, pFile);
8373 if( pApndFile->iPgOne>=0 ){
8374 pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
8375 return SQLITE_OK;
8376 }
8377 if( (flags & SQLITE_OPEN_CREATE)==0 ){
8378 pBaseFile->pMethods->xClose(pBaseFile);
8379 rc = SQLITE_CANTOPEN;
8380 pFile->pMethods = 0;
8381 }else{
8382 /* Round newly added appendvfs location to #define'd page boundary.
8383 ** Note that nothing has yet been written to the underlying file.
8384 ** The append mark will be written along with first content write.
8385 ** Until then, paf->iMark value indicates it is not yet written.
8386 */
8387 pApndFile->iPgOne = APND_START_ROUNDUP(sz);
8388 }
8389 return rc;
8390 }
8391
8392 /*
8393 ** Delete an apnd file.
8394 ** For an appendvfs, this could mean delete the appendvfs portion,
8395 ** leaving the appendee as it was before it gained an appendvfs.
8396 ** For now, this code deletes the underlying file too.
8397 */
8398 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
8399 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
8400 }
8401
8402 /*
8403 ** All other VFS methods are pass-thrus.
8404 */
8405 static int apndAccess(
8406 sqlite3_vfs *pVfs,
8407 const char *zPath,
8408 int flags,
8409 int *pResOut
8410 ){
8411 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
8412 }
8413 static int apndFullPathname(
8414 sqlite3_vfs *pVfs,
8415 const char *zPath,
8416 int nOut,
8417 char *zOut
8418 ){
8419 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
8420 }
8421 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
8422 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
8423 }
8424 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
8425 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
8426 }
8427 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
8428 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
8429 }
8430 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
8431 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
8432 }
8433 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
8434 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
8435 }
8436 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
8437 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
8438 }
8439 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
8440 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
8441 }
8442 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
8443 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
8444 }
8445 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
8446 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
8447 }
8448 static int apndSetSystemCall(
8449 sqlite3_vfs *pVfs,
8450 const char *zName,
8451 sqlite3_syscall_ptr pCall
8452 ){
8453 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
8454 }
8455 static sqlite3_syscall_ptr apndGetSystemCall(
8456 sqlite3_vfs *pVfs,
8457 const char *zName
8458 ){
8459 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
8460 }
8461 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
8462 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
8463 }
8464
8465
8466 #ifdef _WIN32
8467
8468 #endif
8469 /*
8470 ** This routine is called when the extension is loaded.
8471 ** Register the new VFS.
8472 */
8473 int sqlite3_appendvfs_init(
8474 sqlite3 *db,
8475 char **pzErrMsg,
8476 const sqlite3_api_routines *pApi
8477 ){
8478 int rc = SQLITE_OK;
8479 sqlite3_vfs *pOrig;
8480 SQLITE_EXTENSION_INIT2(pApi);
8481 (void)pzErrMsg;
8482 (void)db;
8483 pOrig = sqlite3_vfs_find(0);
8484 if( pOrig==0 ) return SQLITE_ERROR;
8485 apnd_vfs.iVersion = pOrig->iVersion;
8486 apnd_vfs.pAppData = pOrig;
8487 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
8488 rc = sqlite3_vfs_register(&apnd_vfs, 0);
8489 #ifdef APPENDVFS_TEST
8490 if( rc==SQLITE_OK ){
8491 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
8492 }
8493 #endif
8494 if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
8495 return rc;
8496 }
8497
8498 /************************* End ../ext/misc/appendvfs.c ********************/
8499 #endif
8500 #ifdef SQLITE_HAVE_ZLIB
8501 /************************* Begin ../ext/misc/zipfile.c ******************/
8502 /*
8503 ** 2017-12-26
8504 **
8505 ** The author disclaims copyright to this source code. In place of
8506 ** a legal notice, here is a blessing:
8507 **
8508 ** May you do good and not evil.
8509 ** May you find forgiveness for yourself and forgive others.
8510 ** May you share freely, never taking more than you give.
8511 **
8512 ******************************************************************************
8513 **
8514 ** This file implements a virtual table for reading and writing ZIP archive
8515 ** files.
8516 **
8517 ** Usage example:
8518 **
8519 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
8520 **
8521 ** Current limitations:
8522 **
8523 ** * No support for encryption
8524 ** * No support for ZIP archives spanning multiple files
8525 ** * No support for zip64 extensions
8526 ** * Only the "inflate/deflate" (zlib) compression method is supported
8527 */
8528 /* #include "sqlite3ext.h" */
8529 SQLITE_EXTENSION_INIT1
8530 #include <stdio.h>
8531 #include <string.h>
8532 #include <assert.h>
8533
8534 #include <zlib.h>
8535
8536 #ifndef SQLITE_OMIT_VIRTUALTABLE
8537
8538 #ifndef SQLITE_AMALGAMATION
8539
8540 #ifndef UINT32_TYPE
8541 # ifdef HAVE_UINT32_T
8542 # define UINT32_TYPE uint32_t
8543 # else
8544 # define UINT32_TYPE unsigned int
8545 # endif
8546 #endif
8547 #ifndef UINT16_TYPE
8548 # ifdef HAVE_UINT16_T
8549 # define UINT16_TYPE uint16_t
8550 # else
8551 # define UINT16_TYPE unsigned short int
8552 # endif
8553 #endif
8554 /* typedef sqlite3_int64 i64; */
8555 /* typedef unsigned char u8; */
8556 /* typedef UINT32_TYPE u32; // 4-byte unsigned integer // */
8557 /* typedef UINT16_TYPE u16; // 2-byte unsigned integer // */
8558 #define MIN(a,b) ((a)<(b) ? (a) : (b))
8559
8560 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
8561 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
8562 #endif
8563 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
8564 # define ALWAYS(X) (1)
8565 # define NEVER(X) (0)
8566 #elif !defined(NDEBUG)
8567 # define ALWAYS(X) ((X)?1:(assert(0),0))
8568 # define NEVER(X) ((X)?(assert(0),1):0)
8569 #else
8570 # define ALWAYS(X) (X)
8571 # define NEVER(X) (X)
8572 #endif
8573
8574 #endif /* SQLITE_AMALGAMATION */
8575
8576 /*
8577 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
8578 **
8579 ** In some ways it would be better to obtain these values from system
8580 ** header files. But, the dependency is undesirable and (a) these
8581 ** have been stable for decades, (b) the values are part of POSIX and
8582 ** are also made explicit in [man stat], and (c) are part of the
8583 ** file format for zip archives.
8584 */
8585 #ifndef S_IFDIR
8586 # define S_IFDIR 0040000
8587 #endif
8588 #ifndef S_IFREG
8589 # define S_IFREG 0100000
8590 #endif
8591 #ifndef S_IFLNK
8592 # define S_IFLNK 0120000
8593 #endif
8594
8595 static const char ZIPFILE_SCHEMA[] =
8596 "CREATE TABLE y("
8597 "name PRIMARY KEY," /* 0: Name of file in zip archive */
8598 "mode," /* 1: POSIX mode for file */
8599 "mtime," /* 2: Last modification time (secs since 1970)*/
8600 "sz," /* 3: Size of object */
8601 "rawdata," /* 4: Raw data */
8602 "data," /* 5: Uncompressed data */
8603 "method," /* 6: Compression method (integer) */
8604 "z HIDDEN" /* 7: Name of zip file */
8605 ") WITHOUT ROWID;";
8606
8607 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */
8608 #define ZIPFILE_BUFFER_SIZE (64*1024)
8609
8610
8611 /*
8612 ** Magic numbers used to read and write zip files.
8613 **
8614 ** ZIPFILE_NEWENTRY_MADEBY:
8615 ** Use this value for the "version-made-by" field in new zip file
8616 ** entries. The upper byte indicates "unix", and the lower byte
8617 ** indicates that the zip file matches pkzip specification 3.0.
8618 ** This is what info-zip seems to do.
8619 **
8620 ** ZIPFILE_NEWENTRY_REQUIRED:
8621 ** Value for "version-required-to-extract" field of new entries.
8622 ** Version 2.0 is required to support folders and deflate compression.
8623 **
8624 ** ZIPFILE_NEWENTRY_FLAGS:
8625 ** Value for "general-purpose-bit-flags" field of new entries. Bit
8626 ** 11 means "utf-8 filename and comment".
8627 **
8628 ** ZIPFILE_SIGNATURE_CDS:
8629 ** First 4 bytes of a valid CDS record.
8630 **
8631 ** ZIPFILE_SIGNATURE_LFH:
8632 ** First 4 bytes of a valid LFH record.
8633 **
8634 ** ZIPFILE_SIGNATURE_EOCD
8635 ** First 4 bytes of a valid EOCD record.
8636 */
8637 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455
8638 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30)
8639 #define ZIPFILE_NEWENTRY_REQUIRED 20
8640 #define ZIPFILE_NEWENTRY_FLAGS 0x800
8641 #define ZIPFILE_SIGNATURE_CDS 0x02014b50
8642 #define ZIPFILE_SIGNATURE_LFH 0x04034b50
8643 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50
8644
8645 /*
8646 ** The sizes of the fixed-size part of each of the three main data
8647 ** structures in a zip archive.
8648 */
8649 #define ZIPFILE_LFH_FIXED_SZ 30
8650 #define ZIPFILE_EOCD_FIXED_SZ 22
8651 #define ZIPFILE_CDS_FIXED_SZ 46
8652
8653 /*
8654 *** 4.3.16 End of central directory record:
8655 ***
8656 *** end of central dir signature 4 bytes (0x06054b50)
8657 *** number of this disk 2 bytes
8658 *** number of the disk with the
8659 *** start of the central directory 2 bytes
8660 *** total number of entries in the
8661 *** central directory on this disk 2 bytes
8662 *** total number of entries in
8663 *** the central directory 2 bytes
8664 *** size of the central directory 4 bytes
8665 *** offset of start of central
8666 *** directory with respect to
8667 *** the starting disk number 4 bytes
8668 *** .ZIP file comment length 2 bytes
8669 *** .ZIP file comment (variable size)
8670 */
8671 typedef struct ZipfileEOCD ZipfileEOCD;
8672 struct ZipfileEOCD {
8673 u16 iDisk;
8674 u16 iFirstDisk;
8675 u16 nEntry;
8676 u16 nEntryTotal;
8677 u32 nSize;
8678 u32 iOffset;
8679 };
8680
8681 /*
8682 *** 4.3.12 Central directory structure:
8683 ***
8684 *** ...
8685 ***
8686 *** central file header signature 4 bytes (0x02014b50)
8687 *** version made by 2 bytes
8688 *** version needed to extract 2 bytes
8689 *** general purpose bit flag 2 bytes
8690 *** compression method 2 bytes
8691 *** last mod file time 2 bytes
8692 *** last mod file date 2 bytes
8693 *** crc-32 4 bytes
8694 *** compressed size 4 bytes
8695 *** uncompressed size 4 bytes
8696 *** file name length 2 bytes
8697 *** extra field length 2 bytes
8698 *** file comment length 2 bytes
8699 *** disk number start 2 bytes
8700 *** internal file attributes 2 bytes
8701 *** external file attributes 4 bytes
8702 *** relative offset of local header 4 bytes
8703 */
8704 typedef struct ZipfileCDS ZipfileCDS;
8705 struct ZipfileCDS {
8706 u16 iVersionMadeBy;
8707 u16 iVersionExtract;
8708 u16 flags;
8709 u16 iCompression;
8710 u16 mTime;
8711 u16 mDate;
8712 u32 crc32;
8713 u32 szCompressed;
8714 u32 szUncompressed;
8715 u16 nFile;
8716 u16 nExtra;
8717 u16 nComment;
8718 u16 iDiskStart;
8719 u16 iInternalAttr;
8720 u32 iExternalAttr;
8721 u32 iOffset;
8722 char *zFile; /* Filename (sqlite3_malloc()) */
8723 };
8724
8725 /*
8726 *** 4.3.7 Local file header:
8727 ***
8728 *** local file header signature 4 bytes (0x04034b50)
8729 *** version needed to extract 2 bytes
8730 *** general purpose bit flag 2 bytes
8731 *** compression method 2 bytes
8732 *** last mod file time 2 bytes
8733 *** last mod file date 2 bytes
8734 *** crc-32 4 bytes
8735 *** compressed size 4 bytes
8736 *** uncompressed size 4 bytes
8737 *** file name length 2 bytes
8738 *** extra field length 2 bytes
8739 ***
8740 */
8741 typedef struct ZipfileLFH ZipfileLFH;
8742 struct ZipfileLFH {
8743 u16 iVersionExtract;
8744 u16 flags;
8745 u16 iCompression;
8746 u16 mTime;
8747 u16 mDate;
8748 u32 crc32;
8749 u32 szCompressed;
8750 u32 szUncompressed;
8751 u16 nFile;
8752 u16 nExtra;
8753 };
8754
8755 typedef struct ZipfileEntry ZipfileEntry;
8756 struct ZipfileEntry {
8757 ZipfileCDS cds; /* Parsed CDS record */
8758 u32 mUnixTime; /* Modification time, in UNIX format */
8759 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */
8760 i64 iDataOff; /* Offset to data in file (if aData==0) */
8761 u8 *aData; /* cds.szCompressed bytes of compressed data */
8762 ZipfileEntry *pNext; /* Next element in in-memory CDS */
8763 };
8764
8765 /*
8766 ** Cursor type for zipfile tables.
8767 */
8768 typedef struct ZipfileCsr ZipfileCsr;
8769 struct ZipfileCsr {
8770 sqlite3_vtab_cursor base; /* Base class - must be first */
8771 i64 iId; /* Cursor ID */
8772 u8 bEof; /* True when at EOF */
8773 u8 bNoop; /* If next xNext() call is no-op */
8774
8775 /* Used outside of write transactions */
8776 FILE *pFile; /* Zip file */
8777 i64 iNextOff; /* Offset of next record in central directory */
8778 ZipfileEOCD eocd; /* Parse of central directory record */
8779
8780 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */
8781 ZipfileEntry *pCurrent; /* Current entry */
8782 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */
8783 };
8784
8785 typedef struct ZipfileTab ZipfileTab;
8786 struct ZipfileTab {
8787 sqlite3_vtab base; /* Base class - must be first */
8788 char *zFile; /* Zip file this table accesses (may be NULL) */
8789 sqlite3 *db; /* Host database connection */
8790 u8 *aBuffer; /* Temporary buffer used for various tasks */
8791
8792 ZipfileCsr *pCsrList; /* List of cursors */
8793 i64 iNextCsrid;
8794
8795 /* The following are used by write transactions only */
8796 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
8797 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */
8798 FILE *pWriteFd; /* File handle open on zip archive */
8799 i64 szCurrent; /* Current size of zip archive */
8800 i64 szOrig; /* Size of archive at start of transaction */
8801 };
8802
8803 /*
8804 ** Set the error message contained in context ctx to the results of
8805 ** vprintf(zFmt, ...).
8806 */
8807 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
8808 char *zMsg = 0;
8809 va_list ap;
8810 va_start(ap, zFmt);
8811 zMsg = sqlite3_vmprintf(zFmt, ap);
8812 sqlite3_result_error(ctx, zMsg, -1);
8813 sqlite3_free(zMsg);
8814 va_end(ap);
8815 }
8816
8817 /*
8818 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
8819 ** is not quoted, do nothing.
8820 */
8821 static void zipfileDequote(char *zIn){
8822 char q = zIn[0];
8823 if( q=='"' || q=='\'' || q=='`' || q=='[' ){
8824 int iIn = 1;
8825 int iOut = 0;
8826 if( q=='[' ) q = ']';
8827 while( ALWAYS(zIn[iIn]) ){
8828 char c = zIn[iIn++];
8829 if( c==q && zIn[iIn++]!=q ) break;
8830 zIn[iOut++] = c;
8831 }
8832 zIn[iOut] = '\0';
8833 }
8834 }
8835
8836 /*
8837 ** Construct a new ZipfileTab virtual table object.
8838 **
8839 ** argv[0] -> module name ("zipfile")
8840 ** argv[1] -> database name
8841 ** argv[2] -> table name
8842 ** argv[...] -> "column name" and other module argument fields.
8843 */
8844 static int zipfileConnect(
8845 sqlite3 *db,
8846 void *pAux,
8847 int argc, const char *const*argv,
8848 sqlite3_vtab **ppVtab,
8849 char **pzErr
8850 ){
8851 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
8852 int nFile = 0;
8853 const char *zFile = 0;
8854 ZipfileTab *pNew = 0;
8855 int rc;
8856 (void)pAux;
8857
8858 /* If the table name is not "zipfile", require that the argument be
8859 ** specified. This stops zipfile tables from being created as:
8860 **
8861 ** CREATE VIRTUAL TABLE zzz USING zipfile();
8862 **
8863 ** It does not prevent:
8864 **
8865 ** CREATE VIRTUAL TABLE zipfile USING zipfile();
8866 */
8867 assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
8868 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
8869 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
8870 return SQLITE_ERROR;
8871 }
8872
8873 if( argc>3 ){
8874 zFile = argv[3];
8875 nFile = (int)strlen(zFile)+1;
8876 }
8877
8878 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
8879 if( rc==SQLITE_OK ){
8880 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
8881 if( pNew==0 ) return SQLITE_NOMEM;
8882 memset(pNew, 0, nByte+nFile);
8883 pNew->db = db;
8884 pNew->aBuffer = (u8*)&pNew[1];
8885 if( zFile ){
8886 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
8887 memcpy(pNew->zFile, zFile, nFile);
8888 zipfileDequote(pNew->zFile);
8889 }
8890 }
8891 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
8892 *ppVtab = (sqlite3_vtab*)pNew;
8893 return rc;
8894 }
8895
8896 /*
8897 ** Free the ZipfileEntry structure indicated by the only argument.
8898 */
8899 static void zipfileEntryFree(ZipfileEntry *p){
8900 if( p ){
8901 sqlite3_free(p->cds.zFile);
8902 sqlite3_free(p);
8903 }
8904 }
8905
8906 /*
8907 ** Release resources that should be freed at the end of a write
8908 ** transaction.
8909 */
8910 static void zipfileCleanupTransaction(ZipfileTab *pTab){
8911 ZipfileEntry *pEntry;
8912 ZipfileEntry *pNext;
8913
8914 if( pTab->pWriteFd ){
8915 fclose(pTab->pWriteFd);
8916 pTab->pWriteFd = 0;
8917 }
8918 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
8919 pNext = pEntry->pNext;
8920 zipfileEntryFree(pEntry);
8921 }
8922 pTab->pFirstEntry = 0;
8923 pTab->pLastEntry = 0;
8924 pTab->szCurrent = 0;
8925 pTab->szOrig = 0;
8926 }
8927
8928 /*
8929 ** This method is the destructor for zipfile vtab objects.
8930 */
8931 static int zipfileDisconnect(sqlite3_vtab *pVtab){
8932 zipfileCleanupTransaction((ZipfileTab*)pVtab);
8933 sqlite3_free(pVtab);
8934 return SQLITE_OK;
8935 }
8936
8937 /*
8938 ** Constructor for a new ZipfileCsr object.
8939 */
8940 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
8941 ZipfileTab *pTab = (ZipfileTab*)p;
8942 ZipfileCsr *pCsr;
8943 pCsr = sqlite3_malloc(sizeof(*pCsr));
8944 *ppCsr = (sqlite3_vtab_cursor*)pCsr;
8945 if( pCsr==0 ){
8946 return SQLITE_NOMEM;
8947 }
8948 memset(pCsr, 0, sizeof(*pCsr));
8949 pCsr->iId = ++pTab->iNextCsrid;
8950 pCsr->pCsrNext = pTab->pCsrList;
8951 pTab->pCsrList = pCsr;
8952 return SQLITE_OK;
8953 }
8954
8955 /*
8956 ** Reset a cursor back to the state it was in when first returned
8957 ** by zipfileOpen().
8958 */
8959 static void zipfileResetCursor(ZipfileCsr *pCsr){
8960 ZipfileEntry *p;
8961 ZipfileEntry *pNext;
8962
8963 pCsr->bEof = 0;
8964 if( pCsr->pFile ){
8965 fclose(pCsr->pFile);
8966 pCsr->pFile = 0;
8967 zipfileEntryFree(pCsr->pCurrent);
8968 pCsr->pCurrent = 0;
8969 }
8970
8971 for(p=pCsr->pFreeEntry; p; p=pNext){
8972 pNext = p->pNext;
8973 zipfileEntryFree(p);
8974 }
8975 }
8976
8977 /*
8978 ** Destructor for an ZipfileCsr.
8979 */
8980 static int zipfileClose(sqlite3_vtab_cursor *cur){
8981 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
8982 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
8983 ZipfileCsr **pp;
8984 zipfileResetCursor(pCsr);
8985
8986 /* Remove this cursor from the ZipfileTab.pCsrList list. */
8987 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
8988 *pp = pCsr->pCsrNext;
8989
8990 sqlite3_free(pCsr);
8991 return SQLITE_OK;
8992 }
8993
8994 /*
8995 ** Set the error message for the virtual table associated with cursor
8996 ** pCsr to the results of vprintf(zFmt, ...).
8997 */
8998 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
8999 va_list ap;
9000 va_start(ap, zFmt);
9001 sqlite3_free(pTab->base.zErrMsg);
9002 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
9003 va_end(ap);
9004 }
9005 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
9006 va_list ap;
9007 va_start(ap, zFmt);
9008 sqlite3_free(pCsr->base.pVtab->zErrMsg);
9009 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
9010 va_end(ap);
9011 }
9012
9013 /*
9014 ** Read nRead bytes of data from offset iOff of file pFile into buffer
9015 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
9016 ** otherwise.
9017 **
9018 ** If an error does occur, output variable (*pzErrmsg) may be set to point
9019 ** to an English language error message. It is the responsibility of the
9020 ** caller to eventually free this buffer using
9021 ** sqlite3_free().
9022 */
9023 static int zipfileReadData(
9024 FILE *pFile, /* Read from this file */
9025 u8 *aRead, /* Read into this buffer */
9026 int nRead, /* Number of bytes to read */
9027 i64 iOff, /* Offset to read from */
9028 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */
9029 ){
9030 size_t n;
9031 fseek(pFile, (long)iOff, SEEK_SET);
9032 n = fread(aRead, 1, nRead, pFile);
9033 if( (int)n!=nRead ){
9034 *pzErrmsg = sqlite3_mprintf("error in fread()");
9035 return SQLITE_ERROR;
9036 }
9037 return SQLITE_OK;
9038 }
9039
9040 static int zipfileAppendData(
9041 ZipfileTab *pTab,
9042 const u8 *aWrite,
9043 int nWrite
9044 ){
9045 if( nWrite>0 ){
9046 size_t n = nWrite;
9047 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
9048 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
9049 if( (int)n!=nWrite ){
9050 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
9051 return SQLITE_ERROR;
9052 }
9053 pTab->szCurrent += nWrite;
9054 }
9055 return SQLITE_OK;
9056 }
9057
9058 /*
9059 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
9060 */
9061 static u16 zipfileGetU16(const u8 *aBuf){
9062 return (aBuf[1] << 8) + aBuf[0];
9063 }
9064
9065 /*
9066 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
9067 */
9068 static u32 zipfileGetU32(const u8 *aBuf){
9069 if( aBuf==0 ) return 0;
9070 return ((u32)(aBuf[3]) << 24)
9071 + ((u32)(aBuf[2]) << 16)
9072 + ((u32)(aBuf[1]) << 8)
9073 + ((u32)(aBuf[0]) << 0);
9074 }
9075
9076 /*
9077 ** Write a 16-bit little endiate integer into buffer aBuf.
9078 */
9079 static void zipfilePutU16(u8 *aBuf, u16 val){
9080 aBuf[0] = val & 0xFF;
9081 aBuf[1] = (val>>8) & 0xFF;
9082 }
9083
9084 /*
9085 ** Write a 32-bit little endiate integer into buffer aBuf.
9086 */
9087 static void zipfilePutU32(u8 *aBuf, u32 val){
9088 aBuf[0] = val & 0xFF;
9089 aBuf[1] = (val>>8) & 0xFF;
9090 aBuf[2] = (val>>16) & 0xFF;
9091 aBuf[3] = (val>>24) & 0xFF;
9092 }
9093
9094 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
9095 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
9096
9097 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
9098 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
9099
9100 /*
9101 ** Magic numbers used to read CDS records.
9102 */
9103 #define ZIPFILE_CDS_NFILE_OFF 28
9104 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
9105
9106 /*
9107 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
9108 ** if the record is not well-formed, or SQLITE_OK otherwise.
9109 */
9110 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
9111 u8 *aRead = aBuf;
9112 u32 sig = zipfileRead32(aRead);
9113 int rc = SQLITE_OK;
9114 if( sig!=ZIPFILE_SIGNATURE_CDS ){
9115 rc = SQLITE_ERROR;
9116 }else{
9117 pCDS->iVersionMadeBy = zipfileRead16(aRead);
9118 pCDS->iVersionExtract = zipfileRead16(aRead);
9119 pCDS->flags = zipfileRead16(aRead);
9120 pCDS->iCompression = zipfileRead16(aRead);
9121 pCDS->mTime = zipfileRead16(aRead);
9122 pCDS->mDate = zipfileRead16(aRead);
9123 pCDS->crc32 = zipfileRead32(aRead);
9124 pCDS->szCompressed = zipfileRead32(aRead);
9125 pCDS->szUncompressed = zipfileRead32(aRead);
9126 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
9127 pCDS->nFile = zipfileRead16(aRead);
9128 pCDS->nExtra = zipfileRead16(aRead);
9129 pCDS->nComment = zipfileRead16(aRead);
9130 pCDS->iDiskStart = zipfileRead16(aRead);
9131 pCDS->iInternalAttr = zipfileRead16(aRead);
9132 pCDS->iExternalAttr = zipfileRead32(aRead);
9133 pCDS->iOffset = zipfileRead32(aRead);
9134 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
9135 }
9136
9137 return rc;
9138 }
9139
9140 /*
9141 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
9142 ** if the record is not well-formed, or SQLITE_OK otherwise.
9143 */
9144 static int zipfileReadLFH(
9145 u8 *aBuffer,
9146 ZipfileLFH *pLFH
9147 ){
9148 u8 *aRead = aBuffer;
9149 int rc = SQLITE_OK;
9150
9151 u32 sig = zipfileRead32(aRead);
9152 if( sig!=ZIPFILE_SIGNATURE_LFH ){
9153 rc = SQLITE_ERROR;
9154 }else{
9155 pLFH->iVersionExtract = zipfileRead16(aRead);
9156 pLFH->flags = zipfileRead16(aRead);
9157 pLFH->iCompression = zipfileRead16(aRead);
9158 pLFH->mTime = zipfileRead16(aRead);
9159 pLFH->mDate = zipfileRead16(aRead);
9160 pLFH->crc32 = zipfileRead32(aRead);
9161 pLFH->szCompressed = zipfileRead32(aRead);
9162 pLFH->szUncompressed = zipfileRead32(aRead);
9163 pLFH->nFile = zipfileRead16(aRead);
9164 pLFH->nExtra = zipfileRead16(aRead);
9165 }
9166 return rc;
9167 }
9168
9169
9170 /*
9171 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
9172 ** Scan through this buffer to find an "extra-timestamp" field. If one
9173 ** exists, extract the 32-bit modification-timestamp from it and store
9174 ** the value in output parameter *pmTime.
9175 **
9176 ** Zero is returned if no extra-timestamp record could be found (and so
9177 ** *pmTime is left unchanged), or non-zero otherwise.
9178 **
9179 ** The general format of an extra field is:
9180 **
9181 ** Header ID 2 bytes
9182 ** Data Size 2 bytes
9183 ** Data N bytes
9184 */
9185 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
9186 int ret = 0;
9187 u8 *p = aExtra;
9188 u8 *pEnd = &aExtra[nExtra];
9189
9190 while( p<pEnd ){
9191 u16 id = zipfileRead16(p);
9192 u16 nByte = zipfileRead16(p);
9193
9194 switch( id ){
9195 case ZIPFILE_EXTRA_TIMESTAMP: {
9196 u8 b = p[0];
9197 if( b & 0x01 ){ /* 0x01 -> modtime is present */
9198 *pmTime = zipfileGetU32(&p[1]);
9199 ret = 1;
9200 }
9201 break;
9202 }
9203 }
9204
9205 p += nByte;
9206 }
9207 return ret;
9208 }
9209
9210 /*
9211 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
9212 ** fields of the CDS structure passed as the only argument to a 32-bit
9213 ** UNIX seconds-since-the-epoch timestamp. Return the result.
9214 **
9215 ** "Standard" MS-DOS time format:
9216 **
9217 ** File modification time:
9218 ** Bits 00-04: seconds divided by 2
9219 ** Bits 05-10: minute
9220 ** Bits 11-15: hour
9221 ** File modification date:
9222 ** Bits 00-04: day
9223 ** Bits 05-08: month (1-12)
9224 ** Bits 09-15: years from 1980
9225 **
9226 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
9227 */
9228 static u32 zipfileMtime(ZipfileCDS *pCDS){
9229 int Y,M,D,X1,X2,A,B,sec,min,hr;
9230 i64 JDsec;
9231 Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
9232 M = ((pCDS->mDate >> 5) & 0x0F);
9233 D = (pCDS->mDate & 0x1F);
9234 sec = (pCDS->mTime & 0x1F)*2;
9235 min = (pCDS->mTime >> 5) & 0x3F;
9236 hr = (pCDS->mTime >> 11) & 0x1F;
9237 if( M<=2 ){
9238 Y--;
9239 M += 12;
9240 }
9241 X1 = 36525*(Y+4716)/100;
9242 X2 = 306001*(M+1)/10000;
9243 A = Y/100;
9244 B = 2 - A + (A/4);
9245 JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
9246 return (u32)(JDsec - (i64)24405875*(i64)8640);
9247 }
9248
9249 /*
9250 ** The opposite of zipfileMtime(). This function populates the mTime and
9251 ** mDate fields of the CDS structure passed as the first argument according
9252 ** to the UNIX timestamp value passed as the second.
9253 */
9254 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
9255 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
9256 i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
9257
9258 int A, B, C, D, E;
9259 int yr, mon, day;
9260 int hr, min, sec;
9261
9262 A = (int)((JD - 1867216.25)/36524.25);
9263 A = (int)(JD + 1 + A - (A/4));
9264 B = A + 1524;
9265 C = (int)((B - 122.1)/365.25);
9266 D = (36525*(C&32767))/100;
9267 E = (int)((B-D)/30.6001);
9268
9269 day = B - D - (int)(30.6001*E);
9270 mon = (E<14 ? E-1 : E-13);
9271 yr = mon>2 ? C-4716 : C-4715;
9272
9273 hr = (mUnixTime % (24*60*60)) / (60*60);
9274 min = (mUnixTime % (60*60)) / 60;
9275 sec = (mUnixTime % 60);
9276
9277 if( yr>=1980 ){
9278 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
9279 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
9280 }else{
9281 pCds->mDate = pCds->mTime = 0;
9282 }
9283
9284 assert( mUnixTime<315507600
9285 || mUnixTime==zipfileMtime(pCds)
9286 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
9287 /* || (mUnixTime % 2) */
9288 );
9289 }
9290
9291 /*
9292 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
9293 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
9294 ** then pFile is a file-handle open on a zip file. In either case, this
9295 ** function creates a ZipfileEntry object based on the zip archive entry
9296 ** for which the CDS record is at offset iOff.
9297 **
9298 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
9299 ** the new object. Otherwise, an SQLite error code is returned and the
9300 ** final value of (*ppEntry) undefined.
9301 */
9302 static int zipfileGetEntry(
9303 ZipfileTab *pTab, /* Store any error message here */
9304 const u8 *aBlob, /* Pointer to in-memory file image */
9305 int nBlob, /* Size of aBlob[] in bytes */
9306 FILE *pFile, /* If aBlob==0, read from this file */
9307 i64 iOff, /* Offset of CDS record */
9308 ZipfileEntry **ppEntry /* OUT: Pointer to new object */
9309 ){
9310 u8 *aRead;
9311 char **pzErr = &pTab->base.zErrMsg;
9312 int rc = SQLITE_OK;
9313 (void)nBlob;
9314
9315 if( aBlob==0 ){
9316 aRead = pTab->aBuffer;
9317 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
9318 }else{
9319 aRead = (u8*)&aBlob[iOff];
9320 }
9321
9322 if( rc==SQLITE_OK ){
9323 sqlite3_int64 nAlloc;
9324 ZipfileEntry *pNew;
9325
9326 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
9327 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
9328 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
9329
9330 nAlloc = sizeof(ZipfileEntry) + nExtra;
9331 if( aBlob ){
9332 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
9333 }
9334
9335 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
9336 if( pNew==0 ){
9337 rc = SQLITE_NOMEM;
9338 }else{
9339 memset(pNew, 0, sizeof(ZipfileEntry));
9340 rc = zipfileReadCDS(aRead, &pNew->cds);
9341 if( rc!=SQLITE_OK ){
9342 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
9343 }else if( aBlob==0 ){
9344 rc = zipfileReadData(
9345 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
9346 );
9347 }else{
9348 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
9349 }
9350 }
9351
9352 if( rc==SQLITE_OK ){
9353 u32 *pt = &pNew->mUnixTime;
9354 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
9355 pNew->aExtra = (u8*)&pNew[1];
9356 memcpy(pNew->aExtra, &aRead[nFile], nExtra);
9357 if( pNew->cds.zFile==0 ){
9358 rc = SQLITE_NOMEM;
9359 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
9360 pNew->mUnixTime = zipfileMtime(&pNew->cds);
9361 }
9362 }
9363
9364 if( rc==SQLITE_OK ){
9365 static const int szFix = ZIPFILE_LFH_FIXED_SZ;
9366 ZipfileLFH lfh;
9367 if( pFile ){
9368 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
9369 }else{
9370 aRead = (u8*)&aBlob[pNew->cds.iOffset];
9371 }
9372
9373 if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
9374 if( rc==SQLITE_OK ){
9375 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
9376 pNew->iDataOff += lfh.nFile + lfh.nExtra;
9377 if( aBlob && pNew->cds.szCompressed ){
9378 pNew->aData = &pNew->aExtra[nExtra];
9379 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
9380 }
9381 }else{
9382 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
9383 (int)pNew->cds.iOffset
9384 );
9385 }
9386 }
9387
9388 if( rc!=SQLITE_OK ){
9389 zipfileEntryFree(pNew);
9390 }else{
9391 *ppEntry = pNew;
9392 }
9393 }
9394
9395 return rc;
9396 }
9397
9398 /*
9399 ** Advance an ZipfileCsr to its next row of output.
9400 */
9401 static int zipfileNext(sqlite3_vtab_cursor *cur){
9402 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9403 int rc = SQLITE_OK;
9404
9405 if( pCsr->pFile ){
9406 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
9407 zipfileEntryFree(pCsr->pCurrent);
9408 pCsr->pCurrent = 0;
9409 if( pCsr->iNextOff>=iEof ){
9410 pCsr->bEof = 1;
9411 }else{
9412 ZipfileEntry *p = 0;
9413 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
9414 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
9415 if( rc==SQLITE_OK ){
9416 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
9417 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
9418 }
9419 pCsr->pCurrent = p;
9420 }
9421 }else{
9422 if( !pCsr->bNoop ){
9423 pCsr->pCurrent = pCsr->pCurrent->pNext;
9424 }
9425 if( pCsr->pCurrent==0 ){
9426 pCsr->bEof = 1;
9427 }
9428 }
9429
9430 pCsr->bNoop = 0;
9431 return rc;
9432 }
9433
9434 static void zipfileFree(void *p) {
9435 sqlite3_free(p);
9436 }
9437
9438 /*
9439 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
9440 ** size is nOut bytes. This function uncompresses the data and sets the
9441 ** return value in context pCtx to the result (a blob).
9442 **
9443 ** If an error occurs, an error code is left in pCtx instead.
9444 */
9445 static void zipfileInflate(
9446 sqlite3_context *pCtx, /* Store result here */
9447 const u8 *aIn, /* Compressed data */
9448 int nIn, /* Size of buffer aIn[] in bytes */
9449 int nOut /* Expected output size */
9450 ){
9451 u8 *aRes = sqlite3_malloc(nOut);
9452 if( aRes==0 ){
9453 sqlite3_result_error_nomem(pCtx);
9454 }else{
9455 int err;
9456 z_stream str;
9457 memset(&str, 0, sizeof(str));
9458
9459 str.next_in = (Byte*)aIn;
9460 str.avail_in = nIn;
9461 str.next_out = (Byte*)aRes;
9462 str.avail_out = nOut;
9463
9464 err = inflateInit2(&str, -15);
9465 if( err!=Z_OK ){
9466 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
9467 }else{
9468 err = inflate(&str, Z_NO_FLUSH);
9469 if( err!=Z_STREAM_END ){
9470 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
9471 }else{
9472 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
9473 aRes = 0;
9474 }
9475 }
9476 sqlite3_free(aRes);
9477 inflateEnd(&str);
9478 }
9479 }
9480
9481 /*
9482 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
9483 ** compresses it and sets (*ppOut) to point to a buffer containing the
9484 ** compressed data. The caller is responsible for eventually calling
9485 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
9486 ** is set to the size of buffer (*ppOut) in bytes.
9487 **
9488 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
9489 ** code is returned and an error message left in virtual-table handle
9490 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
9491 ** case.
9492 */
9493 static int zipfileDeflate(
9494 const u8 *aIn, int nIn, /* Input */
9495 u8 **ppOut, int *pnOut, /* Output */
9496 char **pzErr /* OUT: Error message */
9497 ){
9498 int rc = SQLITE_OK;
9499 sqlite3_int64 nAlloc;
9500 z_stream str;
9501 u8 *aOut;
9502
9503 memset(&str, 0, sizeof(str));
9504 str.next_in = (Bytef*)aIn;
9505 str.avail_in = nIn;
9506 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
9507
9508 nAlloc = deflateBound(&str, nIn);
9509 aOut = (u8*)sqlite3_malloc64(nAlloc);
9510 if( aOut==0 ){
9511 rc = SQLITE_NOMEM;
9512 }else{
9513 int res;
9514 str.next_out = aOut;
9515 str.avail_out = nAlloc;
9516 res = deflate(&str, Z_FINISH);
9517 if( res==Z_STREAM_END ){
9518 *ppOut = aOut;
9519 *pnOut = (int)str.total_out;
9520 }else{
9521 sqlite3_free(aOut);
9522 *pzErr = sqlite3_mprintf("zipfile: deflate() error");
9523 rc = SQLITE_ERROR;
9524 }
9525 deflateEnd(&str);
9526 }
9527
9528 return rc;
9529 }
9530
9531
9532 /*
9533 ** Return values of columns for the row at which the series_cursor
9534 ** is currently pointing.
9535 */
9536 static int zipfileColumn(
9537 sqlite3_vtab_cursor *cur, /* The cursor */
9538 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
9539 int i /* Which column to return */
9540 ){
9541 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9542 ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
9543 int rc = SQLITE_OK;
9544 switch( i ){
9545 case 0: /* name */
9546 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
9547 break;
9548 case 1: /* mode */
9549 /* TODO: Whether or not the following is correct surely depends on
9550 ** the platform on which the archive was created. */
9551 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
9552 break;
9553 case 2: { /* mtime */
9554 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
9555 break;
9556 }
9557 case 3: { /* sz */
9558 if( sqlite3_vtab_nochange(ctx)==0 ){
9559 sqlite3_result_int64(ctx, pCDS->szUncompressed);
9560 }
9561 break;
9562 }
9563 case 4: /* rawdata */
9564 if( sqlite3_vtab_nochange(ctx) ) break;
9565 case 5: { /* data */
9566 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
9567 int sz = pCDS->szCompressed;
9568 int szFinal = pCDS->szUncompressed;
9569 if( szFinal>0 ){
9570 u8 *aBuf;
9571 u8 *aFree = 0;
9572 if( pCsr->pCurrent->aData ){
9573 aBuf = pCsr->pCurrent->aData;
9574 }else{
9575 aBuf = aFree = sqlite3_malloc64(sz);
9576 if( aBuf==0 ){
9577 rc = SQLITE_NOMEM;
9578 }else{
9579 FILE *pFile = pCsr->pFile;
9580 if( pFile==0 ){
9581 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
9582 }
9583 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
9584 &pCsr->base.pVtab->zErrMsg
9585 );
9586 }
9587 }
9588 if( rc==SQLITE_OK ){
9589 if( i==5 && pCDS->iCompression ){
9590 zipfileInflate(ctx, aBuf, sz, szFinal);
9591 }else{
9592 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
9593 }
9594 }
9595 sqlite3_free(aFree);
9596 }else{
9597 /* Figure out if this is a directory or a zero-sized file. Consider
9598 ** it to be a directory either if the mode suggests so, or if
9599 ** the final character in the name is '/'. */
9600 u32 mode = pCDS->iExternalAttr >> 16;
9601 if( !(mode & S_IFDIR)
9602 && pCDS->nFile>=1
9603 && pCDS->zFile[pCDS->nFile-1]!='/'
9604 ){
9605 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
9606 }
9607 }
9608 }
9609 break;
9610 }
9611 case 6: /* method */
9612 sqlite3_result_int(ctx, pCDS->iCompression);
9613 break;
9614 default: /* z */
9615 assert( i==7 );
9616 sqlite3_result_int64(ctx, pCsr->iId);
9617 break;
9618 }
9619
9620 return rc;
9621 }
9622
9623 /*
9624 ** Return TRUE if the cursor is at EOF.
9625 */
9626 static int zipfileEof(sqlite3_vtab_cursor *cur){
9627 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9628 return pCsr->bEof;
9629 }
9630
9631 /*
9632 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
9633 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
9634 ** is guaranteed to be a file-handle open on a zip file.
9635 **
9636 ** This function attempts to locate the EOCD record within the zip archive
9637 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
9638 ** returned if successful. Otherwise, an SQLite error code is returned and
9639 ** an English language error message may be left in virtual-table pTab.
9640 */
9641 static int zipfileReadEOCD(
9642 ZipfileTab *pTab, /* Return errors here */
9643 const u8 *aBlob, /* Pointer to in-memory file image */
9644 int nBlob, /* Size of aBlob[] in bytes */
9645 FILE *pFile, /* Read from this file if aBlob==0 */
9646 ZipfileEOCD *pEOCD /* Object to populate */
9647 ){
9648 u8 *aRead = pTab->aBuffer; /* Temporary buffer */
9649 int nRead; /* Bytes to read from file */
9650 int rc = SQLITE_OK;
9651
9652 memset(pEOCD, 0, sizeof(ZipfileEOCD));
9653 if( aBlob==0 ){
9654 i64 iOff; /* Offset to read from */
9655 i64 szFile; /* Total size of file in bytes */
9656 fseek(pFile, 0, SEEK_END);
9657 szFile = (i64)ftell(pFile);
9658 if( szFile==0 ){
9659 return SQLITE_OK;
9660 }
9661 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
9662 iOff = szFile - nRead;
9663 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
9664 }else{
9665 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
9666 aRead = (u8*)&aBlob[nBlob-nRead];
9667 }
9668
9669 if( rc==SQLITE_OK ){
9670 int i;
9671
9672 /* Scan backwards looking for the signature bytes */
9673 for(i=nRead-20; i>=0; i--){
9674 if( aRead[i]==0x50 && aRead[i+1]==0x4b
9675 && aRead[i+2]==0x05 && aRead[i+3]==0x06
9676 ){
9677 break;
9678 }
9679 }
9680 if( i<0 ){
9681 pTab->base.zErrMsg = sqlite3_mprintf(
9682 "cannot find end of central directory record"
9683 );
9684 return SQLITE_ERROR;
9685 }
9686
9687 aRead += i+4;
9688 pEOCD->iDisk = zipfileRead16(aRead);
9689 pEOCD->iFirstDisk = zipfileRead16(aRead);
9690 pEOCD->nEntry = zipfileRead16(aRead);
9691 pEOCD->nEntryTotal = zipfileRead16(aRead);
9692 pEOCD->nSize = zipfileRead32(aRead);
9693 pEOCD->iOffset = zipfileRead32(aRead);
9694 }
9695
9696 return rc;
9697 }
9698
9699 /*
9700 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
9701 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
9702 ** to the end of the list. Otherwise, it is added to the list immediately
9703 ** before pBefore (which is guaranteed to be a part of said list).
9704 */
9705 static void zipfileAddEntry(
9706 ZipfileTab *pTab,
9707 ZipfileEntry *pBefore,
9708 ZipfileEntry *pNew
9709 ){
9710 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
9711 assert( pNew->pNext==0 );
9712 if( pBefore==0 ){
9713 if( pTab->pFirstEntry==0 ){
9714 pTab->pFirstEntry = pTab->pLastEntry = pNew;
9715 }else{
9716 assert( pTab->pLastEntry->pNext==0 );
9717 pTab->pLastEntry->pNext = pNew;
9718 pTab->pLastEntry = pNew;
9719 }
9720 }else{
9721 ZipfileEntry **pp;
9722 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
9723 pNew->pNext = pBefore;
9724 *pp = pNew;
9725 }
9726 }
9727
9728 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
9729 ZipfileEOCD eocd;
9730 int rc;
9731 int i;
9732 i64 iOff;
9733
9734 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
9735 iOff = eocd.iOffset;
9736 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
9737 ZipfileEntry *pNew = 0;
9738 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
9739
9740 if( rc==SQLITE_OK ){
9741 zipfileAddEntry(pTab, 0, pNew);
9742 iOff += ZIPFILE_CDS_FIXED_SZ;
9743 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
9744 }
9745 }
9746 return rc;
9747 }
9748
9749 /*
9750 ** xFilter callback.
9751 */
9752 static int zipfileFilter(
9753 sqlite3_vtab_cursor *cur,
9754 int idxNum, const char *idxStr,
9755 int argc, sqlite3_value **argv
9756 ){
9757 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
9758 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9759 const char *zFile = 0; /* Zip file to scan */
9760 int rc = SQLITE_OK; /* Return Code */
9761 int bInMemory = 0; /* True for an in-memory zipfile */
9762
9763 (void)idxStr;
9764 (void)argc;
9765
9766 zipfileResetCursor(pCsr);
9767
9768 if( pTab->zFile ){
9769 zFile = pTab->zFile;
9770 }else if( idxNum==0 ){
9771 zipfileCursorErr(pCsr, "zipfile() function requires an argument");
9772 return SQLITE_ERROR;
9773 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
9774 static const u8 aEmptyBlob = 0;
9775 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
9776 int nBlob = sqlite3_value_bytes(argv[0]);
9777 assert( pTab->pFirstEntry==0 );
9778 if( aBlob==0 ){
9779 aBlob = &aEmptyBlob;
9780 nBlob = 0;
9781 }
9782 rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
9783 pCsr->pFreeEntry = pTab->pFirstEntry;
9784 pTab->pFirstEntry = pTab->pLastEntry = 0;
9785 if( rc!=SQLITE_OK ) return rc;
9786 bInMemory = 1;
9787 }else{
9788 zFile = (const char*)sqlite3_value_text(argv[0]);
9789 }
9790
9791 if( 0==pTab->pWriteFd && 0==bInMemory ){
9792 pCsr->pFile = zFile ? fopen(zFile, "rb") : 0;
9793 if( pCsr->pFile==0 ){
9794 zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
9795 rc = SQLITE_ERROR;
9796 }else{
9797 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
9798 if( rc==SQLITE_OK ){
9799 if( pCsr->eocd.nEntry==0 ){
9800 pCsr->bEof = 1;
9801 }else{
9802 pCsr->iNextOff = pCsr->eocd.iOffset;
9803 rc = zipfileNext(cur);
9804 }
9805 }
9806 }
9807 }else{
9808 pCsr->bNoop = 1;
9809 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
9810 rc = zipfileNext(cur);
9811 }
9812
9813 return rc;
9814 }
9815
9816 /*
9817 ** xBestIndex callback.
9818 */
9819 static int zipfileBestIndex(
9820 sqlite3_vtab *tab,
9821 sqlite3_index_info *pIdxInfo
9822 ){
9823 int i;
9824 int idx = -1;
9825 int unusable = 0;
9826 (void)tab;
9827
9828 for(i=0; i<pIdxInfo->nConstraint; i++){
9829 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
9830 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
9831 if( pCons->usable==0 ){
9832 unusable = 1;
9833 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
9834 idx = i;
9835 }
9836 }
9837 pIdxInfo->estimatedCost = 1000.0;
9838 if( idx>=0 ){
9839 pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
9840 pIdxInfo->aConstraintUsage[idx].omit = 1;
9841 pIdxInfo->idxNum = 1;
9842 }else if( unusable ){
9843 return SQLITE_CONSTRAINT;
9844 }
9845 return SQLITE_OK;
9846 }
9847
9848 static ZipfileEntry *zipfileNewEntry(const char *zPath){
9849 ZipfileEntry *pNew;
9850 pNew = sqlite3_malloc(sizeof(ZipfileEntry));
9851 if( pNew ){
9852 memset(pNew, 0, sizeof(ZipfileEntry));
9853 pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
9854 if( pNew->cds.zFile==0 ){
9855 sqlite3_free(pNew);
9856 pNew = 0;
9857 }
9858 }
9859 return pNew;
9860 }
9861
9862 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
9863 ZipfileCDS *pCds = &pEntry->cds;
9864 u8 *a = aBuf;
9865
9866 pCds->nExtra = 9;
9867
9868 /* Write the LFH itself */
9869 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
9870 zipfileWrite16(a, pCds->iVersionExtract);
9871 zipfileWrite16(a, pCds->flags);
9872 zipfileWrite16(a, pCds->iCompression);
9873 zipfileWrite16(a, pCds->mTime);
9874 zipfileWrite16(a, pCds->mDate);
9875 zipfileWrite32(a, pCds->crc32);
9876 zipfileWrite32(a, pCds->szCompressed);
9877 zipfileWrite32(a, pCds->szUncompressed);
9878 zipfileWrite16(a, (u16)pCds->nFile);
9879 zipfileWrite16(a, pCds->nExtra);
9880 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
9881
9882 /* Add the file name */
9883 memcpy(a, pCds->zFile, (int)pCds->nFile);
9884 a += (int)pCds->nFile;
9885
9886 /* The "extra" data */
9887 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
9888 zipfileWrite16(a, 5);
9889 *a++ = 0x01;
9890 zipfileWrite32(a, pEntry->mUnixTime);
9891
9892 return a-aBuf;
9893 }
9894
9895 static int zipfileAppendEntry(
9896 ZipfileTab *pTab,
9897 ZipfileEntry *pEntry,
9898 const u8 *pData,
9899 int nData
9900 ){
9901 u8 *aBuf = pTab->aBuffer;
9902 int nBuf;
9903 int rc;
9904
9905 nBuf = zipfileSerializeLFH(pEntry, aBuf);
9906 rc = zipfileAppendData(pTab, aBuf, nBuf);
9907 if( rc==SQLITE_OK ){
9908 pEntry->iDataOff = pTab->szCurrent;
9909 rc = zipfileAppendData(pTab, pData, nData);
9910 }
9911
9912 return rc;
9913 }
9914
9915 static int zipfileGetMode(
9916 sqlite3_value *pVal,
9917 int bIsDir, /* If true, default to directory */
9918 u32 *pMode, /* OUT: Mode value */
9919 char **pzErr /* OUT: Error message */
9920 ){
9921 const char *z = (const char*)sqlite3_value_text(pVal);
9922 u32 mode = 0;
9923 if( z==0 ){
9924 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
9925 }else if( z[0]>='0' && z[0]<='9' ){
9926 mode = (unsigned int)sqlite3_value_int(pVal);
9927 }else{
9928 const char zTemplate[11] = "-rwxrwxrwx";
9929 int i;
9930 if( strlen(z)!=10 ) goto parse_error;
9931 switch( z[0] ){
9932 case '-': mode |= S_IFREG; break;
9933 case 'd': mode |= S_IFDIR; break;
9934 case 'l': mode |= S_IFLNK; break;
9935 default: goto parse_error;
9936 }
9937 for(i=1; i<10; i++){
9938 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
9939 else if( z[i]!='-' ) goto parse_error;
9940 }
9941 }
9942 if( ((mode & S_IFDIR)==0)==bIsDir ){
9943 /* The "mode" attribute is a directory, but data has been specified.
9944 ** Or vice-versa - no data but "mode" is a file or symlink. */
9945 *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
9946 return SQLITE_CONSTRAINT;
9947 }
9948 *pMode = mode;
9949 return SQLITE_OK;
9950
9951 parse_error:
9952 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
9953 return SQLITE_ERROR;
9954 }
9955
9956 /*
9957 ** Both (const char*) arguments point to nul-terminated strings. Argument
9958 ** nB is the value of strlen(zB). This function returns 0 if the strings are
9959 ** identical, ignoring any trailing '/' character in either path. */
9960 static int zipfileComparePath(const char *zA, const char *zB, int nB){
9961 int nA = (int)strlen(zA);
9962 if( nA>0 && zA[nA-1]=='/' ) nA--;
9963 if( nB>0 && zB[nB-1]=='/' ) nB--;
9964 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
9965 return 1;
9966 }
9967
9968 static int zipfileBegin(sqlite3_vtab *pVtab){
9969 ZipfileTab *pTab = (ZipfileTab*)pVtab;
9970 int rc = SQLITE_OK;
9971
9972 assert( pTab->pWriteFd==0 );
9973 if( pTab->zFile==0 || pTab->zFile[0]==0 ){
9974 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
9975 return SQLITE_ERROR;
9976 }
9977
9978 /* Open a write fd on the file. Also load the entire central directory
9979 ** structure into memory. During the transaction any new file data is
9980 ** appended to the archive file, but the central directory is accumulated
9981 ** in main-memory until the transaction is committed. */
9982 pTab->pWriteFd = fopen(pTab->zFile, "ab+");
9983 if( pTab->pWriteFd==0 ){
9984 pTab->base.zErrMsg = sqlite3_mprintf(
9985 "zipfile: failed to open file %s for writing", pTab->zFile
9986 );
9987 rc = SQLITE_ERROR;
9988 }else{
9989 fseek(pTab->pWriteFd, 0, SEEK_END);
9990 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
9991 rc = zipfileLoadDirectory(pTab, 0, 0);
9992 }
9993
9994 if( rc!=SQLITE_OK ){
9995 zipfileCleanupTransaction(pTab);
9996 }
9997
9998 return rc;
9999 }
10000
10001 /*
10002 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
10003 ** time(2)).
10004 */
10005 static u32 zipfileTime(void){
10006 sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
10007 u32 ret;
10008 if( pVfs==0 ) return 0;
10009 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
10010 i64 ms;
10011 pVfs->xCurrentTimeInt64(pVfs, &ms);
10012 ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
10013 }else{
10014 double day;
10015 pVfs->xCurrentTime(pVfs, &day);
10016 ret = (u32)((day - 2440587.5) * 86400);
10017 }
10018 return ret;
10019 }
10020
10021 /*
10022 ** Return a 32-bit timestamp in UNIX epoch format.
10023 **
10024 ** If the value passed as the only argument is either NULL or an SQL NULL,
10025 ** return the current time. Otherwise, return the value stored in (*pVal)
10026 ** cast to a 32-bit unsigned integer.
10027 */
10028 static u32 zipfileGetTime(sqlite3_value *pVal){
10029 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
10030 return zipfileTime();
10031 }
10032 return (u32)sqlite3_value_int64(pVal);
10033 }
10034
10035 /*
10036 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
10037 ** linked list. Remove it from the list and free the object.
10038 */
10039 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
10040 if( pOld ){
10041 if( pTab->pFirstEntry==pOld ){
10042 pTab->pFirstEntry = pOld->pNext;
10043 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
10044 }else{
10045 ZipfileEntry *p;
10046 for(p=pTab->pFirstEntry; p; p=p->pNext){
10047 if( p->pNext==pOld ){
10048 p->pNext = pOld->pNext;
10049 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
10050 break;
10051 }
10052 }
10053 }
10054 zipfileEntryFree(pOld);
10055 }
10056 }
10057
10058 /*
10059 ** xUpdate method.
10060 */
10061 static int zipfileUpdate(
10062 sqlite3_vtab *pVtab,
10063 int nVal,
10064 sqlite3_value **apVal,
10065 sqlite_int64 *pRowid
10066 ){
10067 ZipfileTab *pTab = (ZipfileTab*)pVtab;
10068 int rc = SQLITE_OK; /* Return Code */
10069 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */
10070
10071 u32 mode = 0; /* Mode for new entry */
10072 u32 mTime = 0; /* Modification time for new entry */
10073 i64 sz = 0; /* Uncompressed size */
10074 const char *zPath = 0; /* Path for new entry */
10075 int nPath = 0; /* strlen(zPath) */
10076 const u8 *pData = 0; /* Pointer to buffer containing content */
10077 int nData = 0; /* Size of pData buffer in bytes */
10078 int iMethod = 0; /* Compression method for new entry */
10079 u8 *pFree = 0; /* Free this */
10080 char *zFree = 0; /* Also free this */
10081 ZipfileEntry *pOld = 0;
10082 ZipfileEntry *pOld2 = 0;
10083 int bUpdate = 0; /* True for an update that modifies "name" */
10084 int bIsDir = 0;
10085 u32 iCrc32 = 0;
10086
10087 (void)pRowid;
10088
10089 if( pTab->pWriteFd==0 ){
10090 rc = zipfileBegin(pVtab);
10091 if( rc!=SQLITE_OK ) return rc;
10092 }
10093
10094 /* If this is a DELETE or UPDATE, find the archive entry to delete. */
10095 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
10096 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
10097 int nDelete = (int)strlen(zDelete);
10098 if( nVal>1 ){
10099 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
10100 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
10101 bUpdate = 1;
10102 }
10103 }
10104 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
10105 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
10106 break;
10107 }
10108 assert( pOld->pNext );
10109 }
10110 }
10111
10112 if( nVal>1 ){
10113 /* Check that "sz" and "rawdata" are both NULL: */
10114 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
10115 zipfileTableErr(pTab, "sz must be NULL");
10116 rc = SQLITE_CONSTRAINT;
10117 }
10118 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
10119 zipfileTableErr(pTab, "rawdata must be NULL");
10120 rc = SQLITE_CONSTRAINT;
10121 }
10122
10123 if( rc==SQLITE_OK ){
10124 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
10125 /* data=NULL. A directory */
10126 bIsDir = 1;
10127 }else{
10128 /* Value specified for "data", and possibly "method". This must be
10129 ** a regular file or a symlink. */
10130 const u8 *aIn = sqlite3_value_blob(apVal[7]);
10131 int nIn = sqlite3_value_bytes(apVal[7]);
10132 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
10133
10134 iMethod = sqlite3_value_int(apVal[8]);
10135 sz = nIn;
10136 pData = aIn;
10137 nData = nIn;
10138 if( iMethod!=0 && iMethod!=8 ){
10139 zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
10140 rc = SQLITE_CONSTRAINT;
10141 }else{
10142 if( bAuto || iMethod ){
10143 int nCmp;
10144 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
10145 if( rc==SQLITE_OK ){
10146 if( iMethod || nCmp<nIn ){
10147 iMethod = 8;
10148 pData = pFree;
10149 nData = nCmp;
10150 }
10151 }
10152 }
10153 iCrc32 = crc32(0, aIn, nIn);
10154 }
10155 }
10156 }
10157
10158 if( rc==SQLITE_OK ){
10159 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
10160 }
10161
10162 if( rc==SQLITE_OK ){
10163 zPath = (const char*)sqlite3_value_text(apVal[2]);
10164 if( zPath==0 ) zPath = "";
10165 nPath = (int)strlen(zPath);
10166 mTime = zipfileGetTime(apVal[4]);
10167 }
10168
10169 if( rc==SQLITE_OK && bIsDir ){
10170 /* For a directory, check that the last character in the path is a
10171 ** '/'. This appears to be required for compatibility with info-zip
10172 ** (the unzip command on unix). It does not create directories
10173 ** otherwise. */
10174 if( nPath<=0 || zPath[nPath-1]!='/' ){
10175 zFree = sqlite3_mprintf("%s/", zPath);
10176 zPath = (const char*)zFree;
10177 if( zFree==0 ){
10178 rc = SQLITE_NOMEM;
10179 nPath = 0;
10180 }else{
10181 nPath = (int)strlen(zPath);
10182 }
10183 }
10184 }
10185
10186 /* Check that we're not inserting a duplicate entry -OR- updating an
10187 ** entry with a path, thereby making it into a duplicate. */
10188 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
10189 ZipfileEntry *p;
10190 for(p=pTab->pFirstEntry; p; p=p->pNext){
10191 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
10192 switch( sqlite3_vtab_on_conflict(pTab->db) ){
10193 case SQLITE_IGNORE: {
10194 goto zipfile_update_done;
10195 }
10196 case SQLITE_REPLACE: {
10197 pOld2 = p;
10198 break;
10199 }
10200 default: {
10201 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
10202 rc = SQLITE_CONSTRAINT;
10203 break;
10204 }
10205 }
10206 break;
10207 }
10208 }
10209 }
10210
10211 if( rc==SQLITE_OK ){
10212 /* Create the new CDS record. */
10213 pNew = zipfileNewEntry(zPath);
10214 if( pNew==0 ){
10215 rc = SQLITE_NOMEM;
10216 }else{
10217 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
10218 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
10219 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
10220 pNew->cds.iCompression = (u16)iMethod;
10221 zipfileMtimeToDos(&pNew->cds, mTime);
10222 pNew->cds.crc32 = iCrc32;
10223 pNew->cds.szCompressed = nData;
10224 pNew->cds.szUncompressed = (u32)sz;
10225 pNew->cds.iExternalAttr = (mode<<16);
10226 pNew->cds.iOffset = (u32)pTab->szCurrent;
10227 pNew->cds.nFile = (u16)nPath;
10228 pNew->mUnixTime = (u32)mTime;
10229 rc = zipfileAppendEntry(pTab, pNew, pData, nData);
10230 zipfileAddEntry(pTab, pOld, pNew);
10231 }
10232 }
10233 }
10234
10235 if( rc==SQLITE_OK && (pOld || pOld2) ){
10236 ZipfileCsr *pCsr;
10237 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
10238 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
10239 pCsr->pCurrent = pCsr->pCurrent->pNext;
10240 pCsr->bNoop = 1;
10241 }
10242 }
10243
10244 zipfileRemoveEntryFromList(pTab, pOld);
10245 zipfileRemoveEntryFromList(pTab, pOld2);
10246 }
10247
10248 zipfile_update_done:
10249 sqlite3_free(pFree);
10250 sqlite3_free(zFree);
10251 return rc;
10252 }
10253
10254 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
10255 u8 *a = aBuf;
10256 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
10257 zipfileWrite16(a, p->iDisk);
10258 zipfileWrite16(a, p->iFirstDisk);
10259 zipfileWrite16(a, p->nEntry);
10260 zipfileWrite16(a, p->nEntryTotal);
10261 zipfileWrite32(a, p->nSize);
10262 zipfileWrite32(a, p->iOffset);
10263 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/
10264
10265 return a-aBuf;
10266 }
10267
10268 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
10269 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
10270 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
10271 return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
10272 }
10273
10274 /*
10275 ** Serialize the CDS structure into buffer aBuf[]. Return the number
10276 ** of bytes written.
10277 */
10278 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
10279 u8 *a = aBuf;
10280 ZipfileCDS *pCDS = &pEntry->cds;
10281
10282 if( pEntry->aExtra==0 ){
10283 pCDS->nExtra = 9;
10284 }
10285
10286 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
10287 zipfileWrite16(a, pCDS->iVersionMadeBy);
10288 zipfileWrite16(a, pCDS->iVersionExtract);
10289 zipfileWrite16(a, pCDS->flags);
10290 zipfileWrite16(a, pCDS->iCompression);
10291 zipfileWrite16(a, pCDS->mTime);
10292 zipfileWrite16(a, pCDS->mDate);
10293 zipfileWrite32(a, pCDS->crc32);
10294 zipfileWrite32(a, pCDS->szCompressed);
10295 zipfileWrite32(a, pCDS->szUncompressed);
10296 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
10297 zipfileWrite16(a, pCDS->nFile);
10298 zipfileWrite16(a, pCDS->nExtra);
10299 zipfileWrite16(a, pCDS->nComment);
10300 zipfileWrite16(a, pCDS->iDiskStart);
10301 zipfileWrite16(a, pCDS->iInternalAttr);
10302 zipfileWrite32(a, pCDS->iExternalAttr);
10303 zipfileWrite32(a, pCDS->iOffset);
10304
10305 memcpy(a, pCDS->zFile, pCDS->nFile);
10306 a += pCDS->nFile;
10307
10308 if( pEntry->aExtra ){
10309 int n = (int)pCDS->nExtra + (int)pCDS->nComment;
10310 memcpy(a, pEntry->aExtra, n);
10311 a += n;
10312 }else{
10313 assert( pCDS->nExtra==9 );
10314 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
10315 zipfileWrite16(a, 5);
10316 *a++ = 0x01;
10317 zipfileWrite32(a, pEntry->mUnixTime);
10318 }
10319
10320 return a-aBuf;
10321 }
10322
10323 static int zipfileCommit(sqlite3_vtab *pVtab){
10324 ZipfileTab *pTab = (ZipfileTab*)pVtab;
10325 int rc = SQLITE_OK;
10326 if( pTab->pWriteFd ){
10327 i64 iOffset = pTab->szCurrent;
10328 ZipfileEntry *p;
10329 ZipfileEOCD eocd;
10330 int nEntry = 0;
10331
10332 /* Write out all entries */
10333 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
10334 int n = zipfileSerializeCDS(p, pTab->aBuffer);
10335 rc = zipfileAppendData(pTab, pTab->aBuffer, n);
10336 nEntry++;
10337 }
10338
10339 /* Write out the EOCD record */
10340 eocd.iDisk = 0;
10341 eocd.iFirstDisk = 0;
10342 eocd.nEntry = (u16)nEntry;
10343 eocd.nEntryTotal = (u16)nEntry;
10344 eocd.nSize = (u32)(pTab->szCurrent - iOffset);
10345 eocd.iOffset = (u32)iOffset;
10346 rc = zipfileAppendEOCD(pTab, &eocd);
10347
10348 zipfileCleanupTransaction(pTab);
10349 }
10350 return rc;
10351 }
10352
10353 static int zipfileRollback(sqlite3_vtab *pVtab){
10354 return zipfileCommit(pVtab);
10355 }
10356
10357 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
10358 ZipfileCsr *pCsr;
10359 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
10360 if( iId==pCsr->iId ) break;
10361 }
10362 return pCsr;
10363 }
10364
10365 static void zipfileFunctionCds(
10366 sqlite3_context *context,
10367 int argc,
10368 sqlite3_value **argv
10369 ){
10370 ZipfileCsr *pCsr;
10371 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
10372 assert( argc>0 );
10373
10374 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
10375 if( pCsr ){
10376 ZipfileCDS *p = &pCsr->pCurrent->cds;
10377 char *zRes = sqlite3_mprintf("{"
10378 "\"version-made-by\" : %u, "
10379 "\"version-to-extract\" : %u, "
10380 "\"flags\" : %u, "
10381 "\"compression\" : %u, "
10382 "\"time\" : %u, "
10383 "\"date\" : %u, "
10384 "\"crc32\" : %u, "
10385 "\"compressed-size\" : %u, "
10386 "\"uncompressed-size\" : %u, "
10387 "\"file-name-length\" : %u, "
10388 "\"extra-field-length\" : %u, "
10389 "\"file-comment-length\" : %u, "
10390 "\"disk-number-start\" : %u, "
10391 "\"internal-attr\" : %u, "
10392 "\"external-attr\" : %u, "
10393 "\"offset\" : %u }",
10394 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
10395 (u32)p->flags, (u32)p->iCompression,
10396 (u32)p->mTime, (u32)p->mDate,
10397 (u32)p->crc32, (u32)p->szCompressed,
10398 (u32)p->szUncompressed, (u32)p->nFile,
10399 (u32)p->nExtra, (u32)p->nComment,
10400 (u32)p->iDiskStart, (u32)p->iInternalAttr,
10401 (u32)p->iExternalAttr, (u32)p->iOffset
10402 );
10403
10404 if( zRes==0 ){
10405 sqlite3_result_error_nomem(context);
10406 }else{
10407 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
10408 sqlite3_free(zRes);
10409 }
10410 }
10411 }
10412
10413 /*
10414 ** xFindFunction method.
10415 */
10416 static int zipfileFindFunction(
10417 sqlite3_vtab *pVtab, /* Virtual table handle */
10418 int nArg, /* Number of SQL function arguments */
10419 const char *zName, /* Name of SQL function */
10420 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
10421 void **ppArg /* OUT: User data for *pxFunc */
10422 ){
10423 (void)nArg;
10424 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
10425 *pxFunc = zipfileFunctionCds;
10426 *ppArg = (void*)pVtab;
10427 return 1;
10428 }
10429 return 0;
10430 }
10431
10432 typedef struct ZipfileBuffer ZipfileBuffer;
10433 struct ZipfileBuffer {
10434 u8 *a; /* Pointer to buffer */
10435 int n; /* Size of buffer in bytes */
10436 int nAlloc; /* Byte allocated at a[] */
10437 };
10438
10439 typedef struct ZipfileCtx ZipfileCtx;
10440 struct ZipfileCtx {
10441 int nEntry;
10442 ZipfileBuffer body;
10443 ZipfileBuffer cds;
10444 };
10445
10446 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
10447 if( pBuf->n+nByte>pBuf->nAlloc ){
10448 u8 *aNew;
10449 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
10450 int nReq = pBuf->n + nByte;
10451
10452 while( nNew<nReq ) nNew = nNew*2;
10453 aNew = sqlite3_realloc64(pBuf->a, nNew);
10454 if( aNew==0 ) return SQLITE_NOMEM;
10455 pBuf->a = aNew;
10456 pBuf->nAlloc = (int)nNew;
10457 }
10458 return SQLITE_OK;
10459 }
10460
10461 /*
10462 ** xStep() callback for the zipfile() aggregate. This can be called in
10463 ** any of the following ways:
10464 **
10465 ** SELECT zipfile(name,data) ...
10466 ** SELECT zipfile(name,mode,mtime,data) ...
10467 ** SELECT zipfile(name,mode,mtime,data,method) ...
10468 */
10469 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
10470 ZipfileCtx *p; /* Aggregate function context */
10471 ZipfileEntry e; /* New entry to add to zip archive */
10472
10473 sqlite3_value *pName = 0;
10474 sqlite3_value *pMode = 0;
10475 sqlite3_value *pMtime = 0;
10476 sqlite3_value *pData = 0;
10477 sqlite3_value *pMethod = 0;
10478
10479 int bIsDir = 0;
10480 u32 mode;
10481 int rc = SQLITE_OK;
10482 char *zErr = 0;
10483
10484 int iMethod = -1; /* Compression method to use (0 or 8) */
10485
10486 const u8 *aData = 0; /* Possibly compressed data for new entry */
10487 int nData = 0; /* Size of aData[] in bytes */
10488 int szUncompressed = 0; /* Size of data before compression */
10489 u8 *aFree = 0; /* Free this before returning */
10490 u32 iCrc32 = 0; /* crc32 of uncompressed data */
10491
10492 char *zName = 0; /* Path (name) of new entry */
10493 int nName = 0; /* Size of zName in bytes */
10494 char *zFree = 0; /* Free this before returning */
10495 int nByte;
10496
10497 memset(&e, 0, sizeof(e));
10498 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
10499 if( p==0 ) return;
10500
10501 /* Martial the arguments into stack variables */
10502 if( nVal!=2 && nVal!=4 && nVal!=5 ){
10503 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
10504 rc = SQLITE_ERROR;
10505 goto zipfile_step_out;
10506 }
10507 pName = apVal[0];
10508 if( nVal==2 ){
10509 pData = apVal[1];
10510 }else{
10511 pMode = apVal[1];
10512 pMtime = apVal[2];
10513 pData = apVal[3];
10514 if( nVal==5 ){
10515 pMethod = apVal[4];
10516 }
10517 }
10518
10519 /* Check that the 'name' parameter looks ok. */
10520 zName = (char*)sqlite3_value_text(pName);
10521 nName = sqlite3_value_bytes(pName);
10522 if( zName==0 ){
10523 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
10524 rc = SQLITE_ERROR;
10525 goto zipfile_step_out;
10526 }
10527
10528 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
10529 ** deflate compression) or NULL (choose automatically). */
10530 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
10531 iMethod = (int)sqlite3_value_int64(pMethod);
10532 if( iMethod!=0 && iMethod!=8 ){
10533 zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
10534 rc = SQLITE_ERROR;
10535 goto zipfile_step_out;
10536 }
10537 }
10538
10539 /* Now inspect the data. If this is NULL, then the new entry must be a
10540 ** directory. Otherwise, figure out whether or not the data should
10541 ** be deflated or simply stored in the zip archive. */
10542 if( sqlite3_value_type(pData)==SQLITE_NULL ){
10543 bIsDir = 1;
10544 iMethod = 0;
10545 }else{
10546 aData = sqlite3_value_blob(pData);
10547 szUncompressed = nData = sqlite3_value_bytes(pData);
10548 iCrc32 = crc32(0, aData, nData);
10549 if( iMethod<0 || iMethod==8 ){
10550 int nOut = 0;
10551 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
10552 if( rc!=SQLITE_OK ){
10553 goto zipfile_step_out;
10554 }
10555 if( iMethod==8 || nOut<nData ){
10556 aData = aFree;
10557 nData = nOut;
10558 iMethod = 8;
10559 }else{
10560 iMethod = 0;
10561 }
10562 }
10563 }
10564
10565 /* Decode the "mode" argument. */
10566 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
10567 if( rc ) goto zipfile_step_out;
10568
10569 /* Decode the "mtime" argument. */
10570 e.mUnixTime = zipfileGetTime(pMtime);
10571
10572 /* If this is a directory entry, ensure that there is exactly one '/'
10573 ** at the end of the path. Or, if this is not a directory and the path
10574 ** ends in '/' it is an error. */
10575 if( bIsDir==0 ){
10576 if( nName>0 && zName[nName-1]=='/' ){
10577 zErr = sqlite3_mprintf("non-directory name must not end with /");
10578 rc = SQLITE_ERROR;
10579 goto zipfile_step_out;
10580 }
10581 }else{
10582 if( nName==0 || zName[nName-1]!='/' ){
10583 zName = zFree = sqlite3_mprintf("%s/", zName);
10584 if( zName==0 ){
10585 rc = SQLITE_NOMEM;
10586 goto zipfile_step_out;
10587 }
10588 nName = (int)strlen(zName);
10589 }else{
10590 while( nName>1 && zName[nName-2]=='/' ) nName--;
10591 }
10592 }
10593
10594 /* Assemble the ZipfileEntry object for the new zip archive entry */
10595 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
10596 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
10597 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
10598 e.cds.iCompression = (u16)iMethod;
10599 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
10600 e.cds.crc32 = iCrc32;
10601 e.cds.szCompressed = nData;
10602 e.cds.szUncompressed = szUncompressed;
10603 e.cds.iExternalAttr = (mode<<16);
10604 e.cds.iOffset = p->body.n;
10605 e.cds.nFile = (u16)nName;
10606 e.cds.zFile = zName;
10607
10608 /* Append the LFH to the body of the new archive */
10609 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
10610 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
10611 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
10612
10613 /* Append the data to the body of the new archive */
10614 if( nData>0 ){
10615 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
10616 memcpy(&p->body.a[p->body.n], aData, nData);
10617 p->body.n += nData;
10618 }
10619
10620 /* Append the CDS record to the directory of the new archive */
10621 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
10622 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
10623 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
10624
10625 /* Increment the count of entries in the archive */
10626 p->nEntry++;
10627
10628 zipfile_step_out:
10629 sqlite3_free(aFree);
10630 sqlite3_free(zFree);
10631 if( rc ){
10632 if( zErr ){
10633 sqlite3_result_error(pCtx, zErr, -1);
10634 }else{
10635 sqlite3_result_error_code(pCtx, rc);
10636 }
10637 }
10638 sqlite3_free(zErr);
10639 }
10640
10641 /*
10642 ** xFinalize() callback for zipfile aggregate function.
10643 */
10644 static void zipfileFinal(sqlite3_context *pCtx){
10645 ZipfileCtx *p;
10646 ZipfileEOCD eocd;
10647 sqlite3_int64 nZip;
10648 u8 *aZip;
10649
10650 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
10651 if( p==0 ) return;
10652 if( p->nEntry>0 ){
10653 memset(&eocd, 0, sizeof(eocd));
10654 eocd.nEntry = (u16)p->nEntry;
10655 eocd.nEntryTotal = (u16)p->nEntry;
10656 eocd.nSize = p->cds.n;
10657 eocd.iOffset = p->body.n;
10658
10659 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
10660 aZip = (u8*)sqlite3_malloc64(nZip);
10661 if( aZip==0 ){
10662 sqlite3_result_error_nomem(pCtx);
10663 }else{
10664 memcpy(aZip, p->body.a, p->body.n);
10665 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
10666 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
10667 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
10668 }
10669 }
10670
10671 sqlite3_free(p->body.a);
10672 sqlite3_free(p->cds.a);
10673 }
10674
10675
10676 /*
10677 ** Register the "zipfile" virtual table.
10678 */
10679 static int zipfileRegister(sqlite3 *db){
10680 static sqlite3_module zipfileModule = {
10681 1, /* iVersion */
10682 zipfileConnect, /* xCreate */
10683 zipfileConnect, /* xConnect */
10684 zipfileBestIndex, /* xBestIndex */
10685 zipfileDisconnect, /* xDisconnect */
10686 zipfileDisconnect, /* xDestroy */
10687 zipfileOpen, /* xOpen - open a cursor */
10688 zipfileClose, /* xClose - close a cursor */
10689 zipfileFilter, /* xFilter - configure scan constraints */
10690 zipfileNext, /* xNext - advance a cursor */
10691 zipfileEof, /* xEof - check for end of scan */
10692 zipfileColumn, /* xColumn - read data */
10693 0, /* xRowid - read data */
10694 zipfileUpdate, /* xUpdate */
10695 zipfileBegin, /* xBegin */
10696 0, /* xSync */
10697 zipfileCommit, /* xCommit */
10698 zipfileRollback, /* xRollback */
10699 zipfileFindFunction, /* xFindMethod */
10700 0, /* xRename */
10701 0, /* xSavepoint */
10702 0, /* xRelease */
10703 0, /* xRollback */
10704 0 /* xShadowName */
10705 };
10706
10707 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0);
10708 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
10709 if( rc==SQLITE_OK ){
10710 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
10711 zipfileStep, zipfileFinal
10712 );
10713 }
10714 assert( sizeof(i64)==8 );
10715 assert( sizeof(u32)==4 );
10716 assert( sizeof(u16)==2 );
10717 assert( sizeof(u8)==1 );
10718 return rc;
10719 }
10720 #else /* SQLITE_OMIT_VIRTUALTABLE */
10721 # define zipfileRegister(x) SQLITE_OK
10722 #endif
10723
10724 #ifdef _WIN32
10725
10726 #endif
10727 int sqlite3_zipfile_init(
10728 sqlite3 *db,
10729 char **pzErrMsg,
10730 const sqlite3_api_routines *pApi
10731 ){
10732 SQLITE_EXTENSION_INIT2(pApi);
10733 (void)pzErrMsg; /* Unused parameter */
10734 return zipfileRegister(db);
10735 }
10736
10737 /************************* End ../ext/misc/zipfile.c ********************/
10738 /************************* Begin ../ext/misc/sqlar.c ******************/
10739 /*
10740 ** 2017-12-17
10741 **
10742 ** The author disclaims copyright to this source code. In place of
10743 ** a legal notice, here is a blessing:
10744 **
10745 ** May you do good and not evil.
10746 ** May you find forgiveness for yourself and forgive others.
10747 ** May you share freely, never taking more than you give.
10748 **
10749 ******************************************************************************
10750 **
10751 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
10752 ** for working with sqlar archives and used by the shell tool's built-in
10753 ** sqlar support.
10754 */
10755 /* #include "sqlite3ext.h" */
10756 SQLITE_EXTENSION_INIT1
10757 #include <zlib.h>
10758 #include <assert.h>
10759
10760 /*
10761 ** Implementation of the "sqlar_compress(X)" SQL function.
10762 **
10763 ** If the type of X is SQLITE_BLOB, and compressing that blob using
10764 ** zlib utility function compress() yields a smaller blob, return the
10765 ** compressed blob. Otherwise, return a copy of X.
10766 **
10767 ** SQLar uses the "zlib format" for compressed content. The zlib format
10768 ** contains a two-byte identification header and a four-byte checksum at
10769 ** the end. This is different from ZIP which uses the raw deflate format.
10770 **
10771 ** Future enhancements to SQLar might add support for new compression formats.
10772 ** If so, those new formats will be identified by alternative headers in the
10773 ** compressed data.
10774 */
10775 static void sqlarCompressFunc(
10776 sqlite3_context *context,
10777 int argc,
10778 sqlite3_value **argv
10779 ){
10780 assert( argc==1 );
10781 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
10782 const Bytef *pData = sqlite3_value_blob(argv[0]);
10783 uLong nData = sqlite3_value_bytes(argv[0]);
10784 uLongf nOut = compressBound(nData);
10785 Bytef *pOut;
10786
10787 pOut = (Bytef*)sqlite3_malloc(nOut);
10788 if( pOut==0 ){
10789 sqlite3_result_error_nomem(context);
10790 return;
10791 }else{
10792 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
10793 sqlite3_result_error(context, "error in compress()", -1);
10794 }else if( nOut<nData ){
10795 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
10796 }else{
10797 sqlite3_result_value(context, argv[0]);
10798 }
10799 sqlite3_free(pOut);
10800 }
10801 }else{
10802 sqlite3_result_value(context, argv[0]);
10803 }
10804 }
10805
10806 /*
10807 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
10808 **
10809 ** Parameter SZ is interpreted as an integer. If it is less than or
10810 ** equal to zero, then this function returns a copy of X. Or, if
10811 ** SZ is equal to the size of X when interpreted as a blob, also
10812 ** return a copy of X. Otherwise, decompress blob X using zlib
10813 ** utility function uncompress() and return the results (another
10814 ** blob).
10815 */
10816 static void sqlarUncompressFunc(
10817 sqlite3_context *context,
10818 int argc,
10819 sqlite3_value **argv
10820 ){
10821 uLong nData;
10822 uLongf sz;
10823
10824 assert( argc==2 );
10825 sz = sqlite3_value_int(argv[1]);
10826
10827 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
10828 sqlite3_result_value(context, argv[0]);
10829 }else{
10830 const Bytef *pData= sqlite3_value_blob(argv[0]);
10831 Bytef *pOut = sqlite3_malloc(sz);
10832 if( pOut==0 ){
10833 sqlite3_result_error_nomem(context);
10834 }else if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
10835 sqlite3_result_error(context, "error in uncompress()", -1);
10836 }else{
10837 sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
10838 }
10839 sqlite3_free(pOut);
10840 }
10841 }
10842
10843 #ifdef _WIN32
10844
10845 #endif
10846 int sqlite3_sqlar_init(
10847 sqlite3 *db,
10848 char **pzErrMsg,
10849 const sqlite3_api_routines *pApi
10850 ){
10851 int rc = SQLITE_OK;
10852 SQLITE_EXTENSION_INIT2(pApi);
10853 (void)pzErrMsg; /* Unused parameter */
10854 rc = sqlite3_create_function(db, "sqlar_compress", 1,
10855 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
10856 sqlarCompressFunc, 0, 0);
10857 if( rc==SQLITE_OK ){
10858 rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
10859 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
10860 sqlarUncompressFunc, 0, 0);
10861 }
10862 return rc;
10863 }
10864
10865 /************************* End ../ext/misc/sqlar.c ********************/
10866 #endif
10867 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
10868 /*
10869 ** 2017 April 07
10870 **
10871 ** The author disclaims copyright to this source code. In place of
10872 ** a legal notice, here is a blessing:
10873 **
10874 ** May you do good and not evil.
10875 ** May you find forgiveness for yourself and forgive others.
10876 ** May you share freely, never taking more than you give.
10877 **
10878 *************************************************************************
10879 */
10880 #if !defined(SQLITEEXPERT_H)
10881 #define SQLITEEXPERT_H 1
10882 /* #include "sqlite3.h" */
10883
10884 typedef struct sqlite3expert sqlite3expert;
10885
10886 /*
10887 ** Create a new sqlite3expert object.
10888 **
10889 ** If successful, a pointer to the new object is returned and (*pzErr) set
10890 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
10891 ** an English-language error message. In this case it is the responsibility
10892 ** of the caller to eventually free the error message buffer using
10893 ** sqlite3_free().
10894 */
10895 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
10896
10897 /*
10898 ** Configure an sqlite3expert object.
10899 **
10900 ** EXPERT_CONFIG_SAMPLE:
10901 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
10902 ** each candidate index. This involves scanning and sorting the entire
10903 ** contents of each user database table once for each candidate index
10904 ** associated with the table. For large databases, this can be
10905 ** prohibitively slow. This option allows the sqlite3expert object to
10906 ** be configured so that sqlite_stat1 data is instead generated based on a
10907 ** subset of each table, or so that no sqlite_stat1 data is used at all.
10908 **
10909 ** A single integer argument is passed to this option. If the value is less
10910 ** than or equal to zero, then no sqlite_stat1 data is generated or used by
10911 ** the analysis - indexes are recommended based on the database schema only.
10912 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is
10913 ** generated for each candidate index (this is the default). Finally, if the
10914 ** value falls between 0 and 100, then it represents the percentage of user
10915 ** table rows that should be considered when generating sqlite_stat1 data.
10916 **
10917 ** Examples:
10918 **
10919 ** // Do not generate any sqlite_stat1 data
10920 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
10921 **
10922 ** // Generate sqlite_stat1 data based on 10% of the rows in each table.
10923 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
10924 */
10925 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
10926
10927 #define EXPERT_CONFIG_SAMPLE 1 /* int */
10928
10929 /*
10930 ** Specify zero or more SQL statements to be included in the analysis.
10931 **
10932 ** Buffer zSql must contain zero or more complete SQL statements. This
10933 ** function parses all statements contained in the buffer and adds them
10934 ** to the internal list of statements to analyze. If successful, SQLITE_OK
10935 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
10936 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
10937 ** may be set to point to an English language error message. In this case
10938 ** the caller is responsible for eventually freeing the error message buffer
10939 ** using sqlite3_free().
10940 **
10941 ** If an error does occur while processing one of the statements in the
10942 ** buffer passed as the second argument, none of the statements in the
10943 ** buffer are added to the analysis.
10944 **
10945 ** This function must be called before sqlite3_expert_analyze(). If a call
10946 ** to this function is made on an sqlite3expert object that has already
10947 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
10948 ** immediately and no statements are added to the analysis.
10949 */
10950 int sqlite3_expert_sql(
10951 sqlite3expert *p, /* From a successful sqlite3_expert_new() */
10952 const char *zSql, /* SQL statement(s) to add */
10953 char **pzErr /* OUT: Error message (if any) */
10954 );
10955
10956
10957 /*
10958 ** This function is called after the sqlite3expert object has been configured
10959 ** with all SQL statements using sqlite3_expert_sql() to actually perform
10960 ** the analysis. Once this function has been called, it is not possible to
10961 ** add further SQL statements to the analysis.
10962 **
10963 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
10964 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
10965 ** point to a buffer containing an English language error message. In this
10966 ** case it is the responsibility of the caller to eventually free the buffer
10967 ** using sqlite3_free().
10968 **
10969 ** If an error does occur within this function, the sqlite3expert object
10970 ** is no longer useful for any purpose. At that point it is no longer
10971 ** possible to add further SQL statements to the object or to re-attempt
10972 ** the analysis. The sqlite3expert object must still be freed using a call
10973 ** sqlite3_expert_destroy().
10974 */
10975 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
10976
10977 /*
10978 ** Return the total number of statements loaded using sqlite3_expert_sql().
10979 ** The total number of SQL statements may be different from the total number
10980 ** to calls to sqlite3_expert_sql().
10981 */
10982 int sqlite3_expert_count(sqlite3expert*);
10983
10984 /*
10985 ** Return a component of the report.
10986 **
10987 ** This function is called after sqlite3_expert_analyze() to extract the
10988 ** results of the analysis. Each call to this function returns either a
10989 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
10990 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
10991 ** #define constants defined below.
10992 **
10993 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
10994 ** information relating to a specific SQL statement. In these cases that
10995 ** SQL statement is identified by the value passed as the second argument.
10996 ** SQL statements are numbered from 0 in the order in which they are parsed.
10997 ** If an out-of-range value (less than zero or equal to or greater than the
10998 ** value returned by sqlite3_expert_count()) is passed as the second argument
10999 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
11000 **
11001 ** EXPERT_REPORT_SQL:
11002 ** Return the text of SQL statement iStmt.
11003 **
11004 ** EXPERT_REPORT_INDEXES:
11005 ** Return a buffer containing the CREATE INDEX statements for all recommended
11006 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL
11007 ** is returned.
11008 **
11009 ** EXPERT_REPORT_PLAN:
11010 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
11011 ** iStmt after the proposed indexes have been added to the database schema.
11012 **
11013 ** EXPERT_REPORT_CANDIDATES:
11014 ** Return a pointer to a buffer containing the CREATE INDEX statements
11015 ** for all indexes that were tested (for all SQL statements). The iStmt
11016 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
11017 */
11018 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
11019
11020 /*
11021 ** Values for the third argument passed to sqlite3_expert_report().
11022 */
11023 #define EXPERT_REPORT_SQL 1
11024 #define EXPERT_REPORT_INDEXES 2
11025 #define EXPERT_REPORT_PLAN 3
11026 #define EXPERT_REPORT_CANDIDATES 4
11027
11028 /*
11029 ** Free an (sqlite3expert*) handle and all associated resources. There
11030 ** should be one call to this function for each successful call to
11031 ** sqlite3-expert_new().
11032 */
11033 void sqlite3_expert_destroy(sqlite3expert*);
11034
11035 #endif /* !defined(SQLITEEXPERT_H) */
11036
11037 /************************* End ../ext/expert/sqlite3expert.h ********************/
11038 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
11039 /*
11040 ** 2017 April 09
11041 **
11042 ** The author disclaims copyright to this source code. In place of
11043 ** a legal notice, here is a blessing:
11044 **
11045 ** May you do good and not evil.
11046 ** May you find forgiveness for yourself and forgive others.
11047 ** May you share freely, never taking more than you give.
11048 **
11049 *************************************************************************
11050 */
11051 /* #include "sqlite3expert.h" */
11052 #include <assert.h>
11053 #include <string.h>
11054 #include <stdio.h>
11055
11056 #if !defined(SQLITE_AMALGAMATION)
11057 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
11058 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
11059 #endif
11060 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
11061 # define ALWAYS(X) (1)
11062 # define NEVER(X) (0)
11063 #elif !defined(NDEBUG)
11064 # define ALWAYS(X) ((X)?1:(assert(0),0))
11065 # define NEVER(X) ((X)?(assert(0),1):0)
11066 #else
11067 # define ALWAYS(X) (X)
11068 # define NEVER(X) (X)
11069 #endif
11070 #endif /* !defined(SQLITE_AMALGAMATION) */
11071
11072
11073 #ifndef SQLITE_OMIT_VIRTUALTABLE
11074
11075 /* typedef sqlite3_int64 i64; */
11076 /* typedef sqlite3_uint64 u64; */
11077
11078 typedef struct IdxColumn IdxColumn;
11079 typedef struct IdxConstraint IdxConstraint;
11080 typedef struct IdxScan IdxScan;
11081 typedef struct IdxStatement IdxStatement;
11082 typedef struct IdxTable IdxTable;
11083 typedef struct IdxWrite IdxWrite;
11084
11085 #define STRLEN (int)strlen
11086
11087 /*
11088 ** A temp table name that we assume no user database will actually use.
11089 ** If this assumption proves incorrect triggers on the table with the
11090 ** conflicting name will be ignored.
11091 */
11092 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
11093
11094 /*
11095 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
11096 ** any other type of single-ended range constraint on a column).
11097 **
11098 ** pLink:
11099 ** Used to temporarily link IdxConstraint objects into lists while
11100 ** creating candidate indexes.
11101 */
11102 struct IdxConstraint {
11103 char *zColl; /* Collation sequence */
11104 int bRange; /* True for range, false for eq */
11105 int iCol; /* Constrained table column */
11106 int bFlag; /* Used by idxFindCompatible() */
11107 int bDesc; /* True if ORDER BY <expr> DESC */
11108 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */
11109 IdxConstraint *pLink; /* See above */
11110 };
11111
11112 /*
11113 ** A single scan of a single table.
11114 */
11115 struct IdxScan {
11116 IdxTable *pTab; /* Associated table object */
11117 int iDb; /* Database containing table zTable */
11118 i64 covering; /* Mask of columns required for cov. index */
11119 IdxConstraint *pOrder; /* ORDER BY columns */
11120 IdxConstraint *pEq; /* List of == constraints */
11121 IdxConstraint *pRange; /* List of < constraints */
11122 IdxScan *pNextScan; /* Next IdxScan object for same analysis */
11123 };
11124
11125 /*
11126 ** Information regarding a single database table. Extracted from
11127 ** "PRAGMA table_info" by function idxGetTableInfo().
11128 */
11129 struct IdxColumn {
11130 char *zName;
11131 char *zColl;
11132 int iPk;
11133 };
11134 struct IdxTable {
11135 int nCol;
11136 char *zName; /* Table name */
11137 IdxColumn *aCol;
11138 IdxTable *pNext; /* Next table in linked list of all tables */
11139 };
11140
11141 /*
11142 ** An object of the following type is created for each unique table/write-op
11143 ** seen. The objects are stored in a singly-linked list beginning at
11144 ** sqlite3expert.pWrite.
11145 */
11146 struct IdxWrite {
11147 IdxTable *pTab;
11148 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */
11149 IdxWrite *pNext;
11150 };
11151
11152 /*
11153 ** Each statement being analyzed is represented by an instance of this
11154 ** structure.
11155 */
11156 struct IdxStatement {
11157 int iId; /* Statement number */
11158 char *zSql; /* SQL statement */
11159 char *zIdx; /* Indexes */
11160 char *zEQP; /* Plan */
11161 IdxStatement *pNext;
11162 };
11163
11164
11165 /*
11166 ** A hash table for storing strings. With space for a payload string
11167 ** with each entry. Methods are:
11168 **
11169 ** idxHashInit()
11170 ** idxHashClear()
11171 ** idxHashAdd()
11172 ** idxHashSearch()
11173 */
11174 #define IDX_HASH_SIZE 1023
11175 typedef struct IdxHashEntry IdxHashEntry;
11176 typedef struct IdxHash IdxHash;
11177 struct IdxHashEntry {
11178 char *zKey; /* nul-terminated key */
11179 char *zVal; /* nul-terminated value string */
11180 char *zVal2; /* nul-terminated value string 2 */
11181 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */
11182 IdxHashEntry *pNext; /* Next entry in hash */
11183 };
11184 struct IdxHash {
11185 IdxHashEntry *pFirst;
11186 IdxHashEntry *aHash[IDX_HASH_SIZE];
11187 };
11188
11189 /*
11190 ** sqlite3expert object.
11191 */
11192 struct sqlite3expert {
11193 int iSample; /* Percentage of tables to sample for stat1 */
11194 sqlite3 *db; /* User database */
11195 sqlite3 *dbm; /* In-memory db for this analysis */
11196 sqlite3 *dbv; /* Vtab schema for this analysis */
11197 IdxTable *pTable; /* List of all IdxTable objects */
11198 IdxScan *pScan; /* List of scan objects */
11199 IdxWrite *pWrite; /* List of write objects */
11200 IdxStatement *pStatement; /* List of IdxStatement objects */
11201 int bRun; /* True once analysis has run */
11202 char **pzErrmsg;
11203 int rc; /* Error code from whereinfo hook */
11204 IdxHash hIdx; /* Hash containing all candidate indexes */
11205 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */
11206 };
11207
11208
11209 /*
11210 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
11211 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
11212 */
11213 static void *idxMalloc(int *pRc, int nByte){
11214 void *pRet;
11215 assert( *pRc==SQLITE_OK );
11216 assert( nByte>0 );
11217 pRet = sqlite3_malloc(nByte);
11218 if( pRet ){
11219 memset(pRet, 0, nByte);
11220 }else{
11221 *pRc = SQLITE_NOMEM;
11222 }
11223 return pRet;
11224 }
11225
11226 /*
11227 ** Initialize an IdxHash hash table.
11228 */
11229 static void idxHashInit(IdxHash *pHash){
11230 memset(pHash, 0, sizeof(IdxHash));
11231 }
11232
11233 /*
11234 ** Reset an IdxHash hash table.
11235 */
11236 static void idxHashClear(IdxHash *pHash){
11237 int i;
11238 for(i=0; i<IDX_HASH_SIZE; i++){
11239 IdxHashEntry *pEntry;
11240 IdxHashEntry *pNext;
11241 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
11242 pNext = pEntry->pHashNext;
11243 sqlite3_free(pEntry->zVal2);
11244 sqlite3_free(pEntry);
11245 }
11246 }
11247 memset(pHash, 0, sizeof(IdxHash));
11248 }
11249
11250 /*
11251 ** Return the index of the hash bucket that the string specified by the
11252 ** arguments to this function belongs.
11253 */
11254 static int idxHashString(const char *z, int n){
11255 unsigned int ret = 0;
11256 int i;
11257 for(i=0; i<n; i++){
11258 ret += (ret<<3) + (unsigned char)(z[i]);
11259 }
11260 return (int)(ret % IDX_HASH_SIZE);
11261 }
11262
11263 /*
11264 ** If zKey is already present in the hash table, return non-zero and do
11265 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
11266 ** the hash table passed as the second argument.
11267 */
11268 static int idxHashAdd(
11269 int *pRc,
11270 IdxHash *pHash,
11271 const char *zKey,
11272 const char *zVal
11273 ){
11274 int nKey = STRLEN(zKey);
11275 int iHash = idxHashString(zKey, nKey);
11276 int nVal = (zVal ? STRLEN(zVal) : 0);
11277 IdxHashEntry *pEntry;
11278 assert( iHash>=0 );
11279 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
11280 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
11281 return 1;
11282 }
11283 }
11284 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
11285 if( pEntry ){
11286 pEntry->zKey = (char*)&pEntry[1];
11287 memcpy(pEntry->zKey, zKey, nKey);
11288 if( zVal ){
11289 pEntry->zVal = &pEntry->zKey[nKey+1];
11290 memcpy(pEntry->zVal, zVal, nVal);
11291 }
11292 pEntry->pHashNext = pHash->aHash[iHash];
11293 pHash->aHash[iHash] = pEntry;
11294
11295 pEntry->pNext = pHash->pFirst;
11296 pHash->pFirst = pEntry;
11297 }
11298 return 0;
11299 }
11300
11301 /*
11302 ** If zKey/nKey is present in the hash table, return a pointer to the
11303 ** hash-entry object.
11304 */
11305 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
11306 int iHash;
11307 IdxHashEntry *pEntry;
11308 if( nKey<0 ) nKey = STRLEN(zKey);
11309 iHash = idxHashString(zKey, nKey);
11310 assert( iHash>=0 );
11311 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
11312 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
11313 return pEntry;
11314 }
11315 }
11316 return 0;
11317 }
11318
11319 /*
11320 ** If the hash table contains an entry with a key equal to the string
11321 ** passed as the final two arguments to this function, return a pointer
11322 ** to the payload string. Otherwise, if zKey/nKey is not present in the
11323 ** hash table, return NULL.
11324 */
11325 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
11326 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
11327 if( pEntry ) return pEntry->zVal;
11328 return 0;
11329 }
11330
11331 /*
11332 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
11333 ** variable to point to a copy of nul-terminated string zColl.
11334 */
11335 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
11336 IdxConstraint *pNew;
11337 int nColl = STRLEN(zColl);
11338
11339 assert( *pRc==SQLITE_OK );
11340 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
11341 if( pNew ){
11342 pNew->zColl = (char*)&pNew[1];
11343 memcpy(pNew->zColl, zColl, nColl+1);
11344 }
11345 return pNew;
11346 }
11347
11348 /*
11349 ** An error associated with database handle db has just occurred. Pass
11350 ** the error message to callback function xOut.
11351 */
11352 static void idxDatabaseError(
11353 sqlite3 *db, /* Database handle */
11354 char **pzErrmsg /* Write error here */
11355 ){
11356 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
11357 }
11358
11359 /*
11360 ** Prepare an SQL statement.
11361 */
11362 static int idxPrepareStmt(
11363 sqlite3 *db, /* Database handle to compile against */
11364 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
11365 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
11366 const char *zSql /* SQL statement to compile */
11367 ){
11368 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
11369 if( rc!=SQLITE_OK ){
11370 *ppStmt = 0;
11371 idxDatabaseError(db, pzErrmsg);
11372 }
11373 return rc;
11374 }
11375
11376 /*
11377 ** Prepare an SQL statement using the results of a printf() formatting.
11378 */
11379 static int idxPrintfPrepareStmt(
11380 sqlite3 *db, /* Database handle to compile against */
11381 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
11382 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
11383 const char *zFmt, /* printf() format of SQL statement */
11384 ... /* Trailing printf() arguments */
11385 ){
11386 va_list ap;
11387 int rc;
11388 char *zSql;
11389 va_start(ap, zFmt);
11390 zSql = sqlite3_vmprintf(zFmt, ap);
11391 if( zSql==0 ){
11392 rc = SQLITE_NOMEM;
11393 }else{
11394 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
11395 sqlite3_free(zSql);
11396 }
11397 va_end(ap);
11398 return rc;
11399 }
11400
11401
11402 /*************************************************************************
11403 ** Beginning of virtual table implementation.
11404 */
11405 typedef struct ExpertVtab ExpertVtab;
11406 struct ExpertVtab {
11407 sqlite3_vtab base;
11408 IdxTable *pTab;
11409 sqlite3expert *pExpert;
11410 };
11411
11412 typedef struct ExpertCsr ExpertCsr;
11413 struct ExpertCsr {
11414 sqlite3_vtab_cursor base;
11415 sqlite3_stmt *pData;
11416 };
11417
11418 static char *expertDequote(const char *zIn){
11419 int n = STRLEN(zIn);
11420 char *zRet = sqlite3_malloc(n);
11421
11422 assert( zIn[0]=='\'' );
11423 assert( zIn[n-1]=='\'' );
11424
11425 if( zRet ){
11426 int iOut = 0;
11427 int iIn = 0;
11428 for(iIn=1; iIn<(n-1); iIn++){
11429 if( zIn[iIn]=='\'' ){
11430 assert( zIn[iIn+1]=='\'' );
11431 iIn++;
11432 }
11433 zRet[iOut++] = zIn[iIn];
11434 }
11435 zRet[iOut] = '\0';
11436 }
11437
11438 return zRet;
11439 }
11440
11441 /*
11442 ** This function is the implementation of both the xConnect and xCreate
11443 ** methods of the r-tree virtual table.
11444 **
11445 ** argv[0] -> module name
11446 ** argv[1] -> database name
11447 ** argv[2] -> table name
11448 ** argv[...] -> column names...
11449 */
11450 static int expertConnect(
11451 sqlite3 *db,
11452 void *pAux,
11453 int argc, const char *const*argv,
11454 sqlite3_vtab **ppVtab,
11455 char **pzErr
11456 ){
11457 sqlite3expert *pExpert = (sqlite3expert*)pAux;
11458 ExpertVtab *p = 0;
11459 int rc;
11460
11461 if( argc!=4 ){
11462 *pzErr = sqlite3_mprintf("internal error!");
11463 rc = SQLITE_ERROR;
11464 }else{
11465 char *zCreateTable = expertDequote(argv[3]);
11466 if( zCreateTable ){
11467 rc = sqlite3_declare_vtab(db, zCreateTable);
11468 if( rc==SQLITE_OK ){
11469 p = idxMalloc(&rc, sizeof(ExpertVtab));
11470 }
11471 if( rc==SQLITE_OK ){
11472 p->pExpert = pExpert;
11473 p->pTab = pExpert->pTable;
11474 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
11475 }
11476 sqlite3_free(zCreateTable);
11477 }else{
11478 rc = SQLITE_NOMEM;
11479 }
11480 }
11481
11482 *ppVtab = (sqlite3_vtab*)p;
11483 return rc;
11484 }
11485
11486 static int expertDisconnect(sqlite3_vtab *pVtab){
11487 ExpertVtab *p = (ExpertVtab*)pVtab;
11488 sqlite3_free(p);
11489 return SQLITE_OK;
11490 }
11491
11492 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
11493 ExpertVtab *p = (ExpertVtab*)pVtab;
11494 int rc = SQLITE_OK;
11495 int n = 0;
11496 IdxScan *pScan;
11497 const int opmask =
11498 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
11499 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
11500 SQLITE_INDEX_CONSTRAINT_LE;
11501
11502 pScan = idxMalloc(&rc, sizeof(IdxScan));
11503 if( pScan ){
11504 int i;
11505
11506 /* Link the new scan object into the list */
11507 pScan->pTab = p->pTab;
11508 pScan->pNextScan = p->pExpert->pScan;
11509 p->pExpert->pScan = pScan;
11510
11511 /* Add the constraints to the IdxScan object */
11512 for(i=0; i<pIdxInfo->nConstraint; i++){
11513 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
11514 if( pCons->usable
11515 && pCons->iColumn>=0
11516 && p->pTab->aCol[pCons->iColumn].iPk==0
11517 && (pCons->op & opmask)
11518 ){
11519 IdxConstraint *pNew;
11520 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
11521 pNew = idxNewConstraint(&rc, zColl);
11522 if( pNew ){
11523 pNew->iCol = pCons->iColumn;
11524 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
11525 pNew->pNext = pScan->pEq;
11526 pScan->pEq = pNew;
11527 }else{
11528 pNew->bRange = 1;
11529 pNew->pNext = pScan->pRange;
11530 pScan->pRange = pNew;
11531 }
11532 }
11533 n++;
11534 pIdxInfo->aConstraintUsage[i].argvIndex = n;
11535 }
11536 }
11537
11538 /* Add the ORDER BY to the IdxScan object */
11539 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
11540 int iCol = pIdxInfo->aOrderBy[i].iColumn;
11541 if( iCol>=0 ){
11542 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
11543 if( pNew ){
11544 pNew->iCol = iCol;
11545 pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
11546 pNew->pNext = pScan->pOrder;
11547 pNew->pLink = pScan->pOrder;
11548 pScan->pOrder = pNew;
11549 n++;
11550 }
11551 }
11552 }
11553 }
11554
11555 pIdxInfo->estimatedCost = 1000000.0 / (n+1);
11556 return rc;
11557 }
11558
11559 static int expertUpdate(
11560 sqlite3_vtab *pVtab,
11561 int nData,
11562 sqlite3_value **azData,
11563 sqlite_int64 *pRowid
11564 ){
11565 (void)pVtab;
11566 (void)nData;
11567 (void)azData;
11568 (void)pRowid;
11569 return SQLITE_OK;
11570 }
11571
11572 /*
11573 ** Virtual table module xOpen method.
11574 */
11575 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
11576 int rc = SQLITE_OK;
11577 ExpertCsr *pCsr;
11578 (void)pVTab;
11579 pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
11580 *ppCursor = (sqlite3_vtab_cursor*)pCsr;
11581 return rc;
11582 }
11583
11584 /*
11585 ** Virtual table module xClose method.
11586 */
11587 static int expertClose(sqlite3_vtab_cursor *cur){
11588 ExpertCsr *pCsr = (ExpertCsr*)cur;
11589 sqlite3_finalize(pCsr->pData);
11590 sqlite3_free(pCsr);
11591 return SQLITE_OK;
11592 }
11593
11594 /*
11595 ** Virtual table module xEof method.
11596 **
11597 ** Return non-zero if the cursor does not currently point to a valid
11598 ** record (i.e if the scan has finished), or zero otherwise.
11599 */
11600 static int expertEof(sqlite3_vtab_cursor *cur){
11601 ExpertCsr *pCsr = (ExpertCsr*)cur;
11602 return pCsr->pData==0;
11603 }
11604
11605 /*
11606 ** Virtual table module xNext method.
11607 */
11608 static int expertNext(sqlite3_vtab_cursor *cur){
11609 ExpertCsr *pCsr = (ExpertCsr*)cur;
11610 int rc = SQLITE_OK;
11611
11612 assert( pCsr->pData );
11613 rc = sqlite3_step(pCsr->pData);
11614 if( rc!=SQLITE_ROW ){
11615 rc = sqlite3_finalize(pCsr->pData);
11616 pCsr->pData = 0;
11617 }else{
11618 rc = SQLITE_OK;
11619 }
11620
11621 return rc;
11622 }
11623
11624 /*
11625 ** Virtual table module xRowid method.
11626 */
11627 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
11628 (void)cur;
11629 *pRowid = 0;
11630 return SQLITE_OK;
11631 }
11632
11633 /*
11634 ** Virtual table module xColumn method.
11635 */
11636 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
11637 ExpertCsr *pCsr = (ExpertCsr*)cur;
11638 sqlite3_value *pVal;
11639 pVal = sqlite3_column_value(pCsr->pData, i);
11640 if( pVal ){
11641 sqlite3_result_value(ctx, pVal);
11642 }
11643 return SQLITE_OK;
11644 }
11645
11646 /*
11647 ** Virtual table module xFilter method.
11648 */
11649 static int expertFilter(
11650 sqlite3_vtab_cursor *cur,
11651 int idxNum, const char *idxStr,
11652 int argc, sqlite3_value **argv
11653 ){
11654 ExpertCsr *pCsr = (ExpertCsr*)cur;
11655 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
11656 sqlite3expert *pExpert = pVtab->pExpert;
11657 int rc;
11658
11659 (void)idxNum;
11660 (void)idxStr;
11661 (void)argc;
11662 (void)argv;
11663 rc = sqlite3_finalize(pCsr->pData);
11664 pCsr->pData = 0;
11665 if( rc==SQLITE_OK ){
11666 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
11667 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
11668 );
11669 }
11670
11671 if( rc==SQLITE_OK ){
11672 rc = expertNext(cur);
11673 }
11674 return rc;
11675 }
11676
11677 static int idxRegisterVtab(sqlite3expert *p){
11678 static sqlite3_module expertModule = {
11679 2, /* iVersion */
11680 expertConnect, /* xCreate - create a table */
11681 expertConnect, /* xConnect - connect to an existing table */
11682 expertBestIndex, /* xBestIndex - Determine search strategy */
11683 expertDisconnect, /* xDisconnect - Disconnect from a table */
11684 expertDisconnect, /* xDestroy - Drop a table */
11685 expertOpen, /* xOpen - open a cursor */
11686 expertClose, /* xClose - close a cursor */
11687 expertFilter, /* xFilter - configure scan constraints */
11688 expertNext, /* xNext - advance a cursor */
11689 expertEof, /* xEof */
11690 expertColumn, /* xColumn - read data */
11691 expertRowid, /* xRowid - read data */
11692 expertUpdate, /* xUpdate - write data */
11693 0, /* xBegin - begin transaction */
11694 0, /* xSync - sync transaction */
11695 0, /* xCommit - commit transaction */
11696 0, /* xRollback - rollback transaction */
11697 0, /* xFindFunction - function overloading */
11698 0, /* xRename - rename the table */
11699 0, /* xSavepoint */
11700 0, /* xRelease */
11701 0, /* xRollbackTo */
11702 0, /* xShadowName */
11703 };
11704
11705 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
11706 }
11707 /*
11708 ** End of virtual table implementation.
11709 *************************************************************************/
11710 /*
11711 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
11712 ** is called, set it to the return value of sqlite3_finalize() before
11713 ** returning. Otherwise, discard the sqlite3_finalize() return value.
11714 */
11715 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
11716 int rc = sqlite3_finalize(pStmt);
11717 if( *pRc==SQLITE_OK ) *pRc = rc;
11718 }
11719
11720 /*
11721 ** Attempt to allocate an IdxTable structure corresponding to table zTab
11722 ** in the main database of connection db. If successful, set (*ppOut) to
11723 ** point to the new object and return SQLITE_OK. Otherwise, return an
11724 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
11725 ** set to point to an error string.
11726 **
11727 ** It is the responsibility of the caller to eventually free either the
11728 ** IdxTable object or error message using sqlite3_free().
11729 */
11730 static int idxGetTableInfo(
11731 sqlite3 *db, /* Database connection to read details from */
11732 const char *zTab, /* Table name */
11733 IdxTable **ppOut, /* OUT: New object (if successful) */
11734 char **pzErrmsg /* OUT: Error message (if not) */
11735 ){
11736 sqlite3_stmt *p1 = 0;
11737 int nCol = 0;
11738 int nTab;
11739 int nByte;
11740 IdxTable *pNew = 0;
11741 int rc, rc2;
11742 char *pCsr = 0;
11743 int nPk = 0;
11744
11745 *ppOut = 0;
11746 if( zTab==0 ) return SQLITE_ERROR;
11747 nTab = STRLEN(zTab);
11748 nByte = sizeof(IdxTable) + nTab + 1;
11749 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
11750 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
11751 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
11752 const char *zColSeq = 0;
11753 if( zCol==0 ){
11754 rc = SQLITE_ERROR;
11755 break;
11756 }
11757 nByte += 1 + STRLEN(zCol);
11758 rc = sqlite3_table_column_metadata(
11759 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
11760 );
11761 if( zColSeq==0 ) zColSeq = "binary";
11762 nByte += 1 + STRLEN(zColSeq);
11763 nCol++;
11764 nPk += (sqlite3_column_int(p1, 5)>0);
11765 }
11766 rc2 = sqlite3_reset(p1);
11767 if( rc==SQLITE_OK ) rc = rc2;
11768
11769 nByte += sizeof(IdxColumn) * nCol;
11770 if( rc==SQLITE_OK ){
11771 pNew = idxMalloc(&rc, nByte);
11772 }
11773 if( rc==SQLITE_OK ){
11774 pNew->aCol = (IdxColumn*)&pNew[1];
11775 pNew->nCol = nCol;
11776 pCsr = (char*)&pNew->aCol[nCol];
11777 }
11778
11779 nCol = 0;
11780 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
11781 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
11782 const char *zColSeq = 0;
11783 int nCopy;
11784 if( zCol==0 ) continue;
11785 nCopy = STRLEN(zCol) + 1;
11786 pNew->aCol[nCol].zName = pCsr;
11787 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
11788 memcpy(pCsr, zCol, nCopy);
11789 pCsr += nCopy;
11790
11791 rc = sqlite3_table_column_metadata(
11792 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
11793 );
11794 if( rc==SQLITE_OK ){
11795 if( zColSeq==0 ) zColSeq = "binary";
11796 nCopy = STRLEN(zColSeq) + 1;
11797 pNew->aCol[nCol].zColl = pCsr;
11798 memcpy(pCsr, zColSeq, nCopy);
11799 pCsr += nCopy;
11800 }
11801
11802 nCol++;
11803 }
11804 idxFinalize(&rc, p1);
11805
11806 if( rc!=SQLITE_OK ){
11807 sqlite3_free(pNew);
11808 pNew = 0;
11809 }else if( ALWAYS(pNew!=0) ){
11810 pNew->zName = pCsr;
11811 if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
11812 }
11813
11814 *ppOut = pNew;
11815 return rc;
11816 }
11817
11818 /*
11819 ** This function is a no-op if *pRc is set to anything other than
11820 ** SQLITE_OK when it is called.
11821 **
11822 ** If *pRc is initially set to SQLITE_OK, then the text specified by
11823 ** the printf() style arguments is appended to zIn and the result returned
11824 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
11825 ** zIn before returning.
11826 */
11827 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
11828 va_list ap;
11829 char *zAppend = 0;
11830 char *zRet = 0;
11831 int nIn = zIn ? STRLEN(zIn) : 0;
11832 int nAppend = 0;
11833 va_start(ap, zFmt);
11834 if( *pRc==SQLITE_OK ){
11835 zAppend = sqlite3_vmprintf(zFmt, ap);
11836 if( zAppend ){
11837 nAppend = STRLEN(zAppend);
11838 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
11839 }
11840 if( zAppend && zRet ){
11841 if( nIn ) memcpy(zRet, zIn, nIn);
11842 memcpy(&zRet[nIn], zAppend, nAppend+1);
11843 }else{
11844 sqlite3_free(zRet);
11845 zRet = 0;
11846 *pRc = SQLITE_NOMEM;
11847 }
11848 sqlite3_free(zAppend);
11849 sqlite3_free(zIn);
11850 }
11851 va_end(ap);
11852 return zRet;
11853 }
11854
11855 /*
11856 ** Return true if zId must be quoted in order to use it as an SQL
11857 ** identifier, or false otherwise.
11858 */
11859 static int idxIdentifierRequiresQuotes(const char *zId){
11860 int i;
11861 int nId = STRLEN(zId);
11862
11863 if( sqlite3_keyword_check(zId, nId) ) return 1;
11864
11865 for(i=0; zId[i]; i++){
11866 if( !(zId[i]=='_')
11867 && !(zId[i]>='0' && zId[i]<='9')
11868 && !(zId[i]>='a' && zId[i]<='z')
11869 && !(zId[i]>='A' && zId[i]<='Z')
11870 ){
11871 return 1;
11872 }
11873 }
11874 return 0;
11875 }
11876
11877 /*
11878 ** This function appends an index column definition suitable for constraint
11879 ** pCons to the string passed as zIn and returns the result.
11880 */
11881 static char *idxAppendColDefn(
11882 int *pRc, /* IN/OUT: Error code */
11883 char *zIn, /* Column defn accumulated so far */
11884 IdxTable *pTab, /* Table index will be created on */
11885 IdxConstraint *pCons
11886 ){
11887 char *zRet = zIn;
11888 IdxColumn *p = &pTab->aCol[pCons->iCol];
11889 if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
11890
11891 if( idxIdentifierRequiresQuotes(p->zName) ){
11892 zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
11893 }else{
11894 zRet = idxAppendText(pRc, zRet, "%s", p->zName);
11895 }
11896
11897 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
11898 if( idxIdentifierRequiresQuotes(pCons->zColl) ){
11899 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
11900 }else{
11901 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
11902 }
11903 }
11904
11905 if( pCons->bDesc ){
11906 zRet = idxAppendText(pRc, zRet, " DESC");
11907 }
11908 return zRet;
11909 }
11910
11911 /*
11912 ** Search database dbm for an index compatible with the one idxCreateFromCons()
11913 ** would create from arguments pScan, pEq and pTail. If no error occurs and
11914 ** such an index is found, return non-zero. Or, if no such index is found,
11915 ** return zero.
11916 **
11917 ** If an error occurs, set *pRc to an SQLite error code and return zero.
11918 */
11919 static int idxFindCompatible(
11920 int *pRc, /* OUT: Error code */
11921 sqlite3* dbm, /* Database to search */
11922 IdxScan *pScan, /* Scan for table to search for index on */
11923 IdxConstraint *pEq, /* List of == constraints */
11924 IdxConstraint *pTail /* List of range constraints */
11925 ){
11926 const char *zTbl = pScan->pTab->zName;
11927 sqlite3_stmt *pIdxList = 0;
11928 IdxConstraint *pIter;
11929 int nEq = 0; /* Number of elements in pEq */
11930 int rc;
11931
11932 /* Count the elements in list pEq */
11933 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
11934
11935 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
11936 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
11937 int bMatch = 1;
11938 IdxConstraint *pT = pTail;
11939 sqlite3_stmt *pInfo = 0;
11940 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
11941 if( zIdx==0 ) continue;
11942
11943 /* Zero the IdxConstraint.bFlag values in the pEq list */
11944 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
11945
11946 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
11947 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
11948 int iIdx = sqlite3_column_int(pInfo, 0);
11949 int iCol = sqlite3_column_int(pInfo, 1);
11950 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
11951
11952 if( iIdx<nEq ){
11953 for(pIter=pEq; pIter; pIter=pIter->pLink){
11954 if( pIter->bFlag ) continue;
11955 if( pIter->iCol!=iCol ) continue;
11956 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
11957 pIter->bFlag = 1;
11958 break;
11959 }
11960 if( pIter==0 ){
11961 bMatch = 0;
11962 break;
11963 }
11964 }else{
11965 if( pT ){
11966 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
11967 bMatch = 0;
11968 break;
11969 }
11970 pT = pT->pLink;
11971 }
11972 }
11973 }
11974 idxFinalize(&rc, pInfo);
11975
11976 if( rc==SQLITE_OK && bMatch ){
11977 sqlite3_finalize(pIdxList);
11978 return 1;
11979 }
11980 }
11981 idxFinalize(&rc, pIdxList);
11982
11983 *pRc = rc;
11984 return 0;
11985 }
11986
11987 /* Callback for sqlite3_exec() with query with leading count(*) column.
11988 * The first argument is expected to be an int*, referent to be incremented
11989 * if that leading column is not exactly '0'.
11990 */
11991 static int countNonzeros(void* pCount, int nc,
11992 char* azResults[], char* azColumns[]){
11993 (void)azColumns; /* Suppress unused parameter warning */
11994 if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
11995 *((int *)pCount) += 1;
11996 }
11997 return 0;
11998 }
11999
12000 static int idxCreateFromCons(
12001 sqlite3expert *p,
12002 IdxScan *pScan,
12003 IdxConstraint *pEq,
12004 IdxConstraint *pTail
12005 ){
12006 sqlite3 *dbm = p->dbm;
12007 int rc = SQLITE_OK;
12008 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
12009 IdxTable *pTab = pScan->pTab;
12010 char *zCols = 0;
12011 char *zIdx = 0;
12012 IdxConstraint *pCons;
12013 unsigned int h = 0;
12014 const char *zFmt;
12015
12016 for(pCons=pEq; pCons; pCons=pCons->pLink){
12017 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12018 }
12019 for(pCons=pTail; pCons; pCons=pCons->pLink){
12020 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12021 }
12022
12023 if( rc==SQLITE_OK ){
12024 /* Hash the list of columns to come up with a name for the index */
12025 const char *zTable = pScan->pTab->zName;
12026 int quoteTable = idxIdentifierRequiresQuotes(zTable);
12027 char *zName = 0; /* Index name */
12028 int collisions = 0;
12029 do{
12030 int i;
12031 char *zFind;
12032 for(i=0; zCols[i]; i++){
12033 h += ((h<<3) + zCols[i]);
12034 }
12035 sqlite3_free(zName);
12036 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
12037 if( zName==0 ) break;
12038 /* Is is unique among table, view and index names? */
12039 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
12040 " AND type in ('index','table','view')";
12041 zFind = sqlite3_mprintf(zFmt, zName);
12042 i = 0;
12043 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
12044 assert(rc==SQLITE_OK);
12045 sqlite3_free(zFind);
12046 if( i==0 ){
12047 collisions = 0;
12048 break;
12049 }
12050 ++collisions;
12051 }while( collisions<50 && zName!=0 );
12052 if( collisions ){
12053 /* This return means "Gave up trying to find a unique index name." */
12054 rc = SQLITE_BUSY_TIMEOUT;
12055 }else if( zName==0 ){
12056 rc = SQLITE_NOMEM;
12057 }else{
12058 if( quoteTable ){
12059 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
12060 }else{
12061 zFmt = "CREATE INDEX %s ON %s(%s)";
12062 }
12063 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
12064 if( !zIdx ){
12065 rc = SQLITE_NOMEM;
12066 }else{
12067 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
12068 if( rc!=SQLITE_OK ){
12069 rc = SQLITE_BUSY_TIMEOUT;
12070 }else{
12071 idxHashAdd(&rc, &p->hIdx, zName, zIdx);
12072 }
12073 }
12074 sqlite3_free(zName);
12075 sqlite3_free(zIdx);
12076 }
12077 }
12078
12079 sqlite3_free(zCols);
12080 }
12081 return rc;
12082 }
12083
12084 /*
12085 ** Return true if list pList (linked by IdxConstraint.pLink) contains
12086 ** a constraint compatible with *p. Otherwise return false.
12087 */
12088 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
12089 IdxConstraint *pCmp;
12090 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
12091 if( p->iCol==pCmp->iCol ) return 1;
12092 }
12093 return 0;
12094 }
12095
12096 static int idxCreateFromWhere(
12097 sqlite3expert *p,
12098 IdxScan *pScan, /* Create indexes for this scan */
12099 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */
12100 ){
12101 IdxConstraint *p1 = 0;
12102 IdxConstraint *pCon;
12103 int rc;
12104
12105 /* Gather up all the == constraints. */
12106 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
12107 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
12108 pCon->pLink = p1;
12109 p1 = pCon;
12110 }
12111 }
12112
12113 /* Create an index using the == constraints collected above. And the
12114 ** range constraint/ORDER BY terms passed in by the caller, if any. */
12115 rc = idxCreateFromCons(p, pScan, p1, pTail);
12116
12117 /* If no range/ORDER BY passed by the caller, create a version of the
12118 ** index for each range constraint. */
12119 if( pTail==0 ){
12120 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
12121 assert( pCon->pLink==0 );
12122 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
12123 rc = idxCreateFromCons(p, pScan, p1, pCon);
12124 }
12125 }
12126 }
12127
12128 return rc;
12129 }
12130
12131 /*
12132 ** Create candidate indexes in database [dbm] based on the data in
12133 ** linked-list pScan.
12134 */
12135 static int idxCreateCandidates(sqlite3expert *p){
12136 int rc = SQLITE_OK;
12137 IdxScan *pIter;
12138
12139 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
12140 rc = idxCreateFromWhere(p, pIter, 0);
12141 if( rc==SQLITE_OK && pIter->pOrder ){
12142 rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
12143 }
12144 }
12145
12146 return rc;
12147 }
12148
12149 /*
12150 ** Free all elements of the linked list starting at pConstraint.
12151 */
12152 static void idxConstraintFree(IdxConstraint *pConstraint){
12153 IdxConstraint *pNext;
12154 IdxConstraint *p;
12155
12156 for(p=pConstraint; p; p=pNext){
12157 pNext = p->pNext;
12158 sqlite3_free(p);
12159 }
12160 }
12161
12162 /*
12163 ** Free all elements of the linked list starting from pScan up until pLast
12164 ** (pLast is not freed).
12165 */
12166 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
12167 IdxScan *p;
12168 IdxScan *pNext;
12169 for(p=pScan; p!=pLast; p=pNext){
12170 pNext = p->pNextScan;
12171 idxConstraintFree(p->pOrder);
12172 idxConstraintFree(p->pEq);
12173 idxConstraintFree(p->pRange);
12174 sqlite3_free(p);
12175 }
12176 }
12177
12178 /*
12179 ** Free all elements of the linked list starting from pStatement up
12180 ** until pLast (pLast is not freed).
12181 */
12182 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
12183 IdxStatement *p;
12184 IdxStatement *pNext;
12185 for(p=pStatement; p!=pLast; p=pNext){
12186 pNext = p->pNext;
12187 sqlite3_free(p->zEQP);
12188 sqlite3_free(p->zIdx);
12189 sqlite3_free(p);
12190 }
12191 }
12192
12193 /*
12194 ** Free the linked list of IdxTable objects starting at pTab.
12195 */
12196 static void idxTableFree(IdxTable *pTab){
12197 IdxTable *pIter;
12198 IdxTable *pNext;
12199 for(pIter=pTab; pIter; pIter=pNext){
12200 pNext = pIter->pNext;
12201 sqlite3_free(pIter);
12202 }
12203 }
12204
12205 /*
12206 ** Free the linked list of IdxWrite objects starting at pTab.
12207 */
12208 static void idxWriteFree(IdxWrite *pTab){
12209 IdxWrite *pIter;
12210 IdxWrite *pNext;
12211 for(pIter=pTab; pIter; pIter=pNext){
12212 pNext = pIter->pNext;
12213 sqlite3_free(pIter);
12214 }
12215 }
12216
12217
12218
12219 /*
12220 ** This function is called after candidate indexes have been created. It
12221 ** runs all the queries to see which indexes they prefer, and populates
12222 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
12223 */
12224 static int idxFindIndexes(
12225 sqlite3expert *p,
12226 char **pzErr /* OUT: Error message (sqlite3_malloc) */
12227 ){
12228 IdxStatement *pStmt;
12229 sqlite3 *dbm = p->dbm;
12230 int rc = SQLITE_OK;
12231
12232 IdxHash hIdx;
12233 idxHashInit(&hIdx);
12234
12235 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
12236 IdxHashEntry *pEntry;
12237 sqlite3_stmt *pExplain = 0;
12238 idxHashClear(&hIdx);
12239 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
12240 "EXPLAIN QUERY PLAN %s", pStmt->zSql
12241 );
12242 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
12243 /* int iId = sqlite3_column_int(pExplain, 0); */
12244 /* int iParent = sqlite3_column_int(pExplain, 1); */
12245 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
12246 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
12247 int nDetail;
12248 int i;
12249
12250 if( !zDetail ) continue;
12251 nDetail = STRLEN(zDetail);
12252
12253 for(i=0; i<nDetail; i++){
12254 const char *zIdx = 0;
12255 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
12256 zIdx = &zDetail[i+13];
12257 }else if( i+22<nDetail
12258 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
12259 ){
12260 zIdx = &zDetail[i+22];
12261 }
12262 if( zIdx ){
12263 const char *zSql;
12264 int nIdx = 0;
12265 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
12266 nIdx++;
12267 }
12268 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
12269 if( zSql ){
12270 idxHashAdd(&rc, &hIdx, zSql, 0);
12271 if( rc ) goto find_indexes_out;
12272 }
12273 break;
12274 }
12275 }
12276
12277 if( zDetail[0]!='-' ){
12278 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
12279 }
12280 }
12281
12282 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
12283 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
12284 }
12285
12286 idxFinalize(&rc, pExplain);
12287 }
12288
12289 find_indexes_out:
12290 idxHashClear(&hIdx);
12291 return rc;
12292 }
12293
12294 static int idxAuthCallback(
12295 void *pCtx,
12296 int eOp,
12297 const char *z3,
12298 const char *z4,
12299 const char *zDb,
12300 const char *zTrigger
12301 ){
12302 int rc = SQLITE_OK;
12303 (void)z4;
12304 (void)zTrigger;
12305 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
12306 if( sqlite3_stricmp(zDb, "main")==0 ){
12307 sqlite3expert *p = (sqlite3expert*)pCtx;
12308 IdxTable *pTab;
12309 for(pTab=p->pTable; pTab; pTab=pTab->pNext){
12310 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
12311 }
12312 if( pTab ){
12313 IdxWrite *pWrite;
12314 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
12315 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
12316 }
12317 if( pWrite==0 ){
12318 pWrite = idxMalloc(&rc, sizeof(IdxWrite));
12319 if( rc==SQLITE_OK ){
12320 pWrite->pTab = pTab;
12321 pWrite->eOp = eOp;
12322 pWrite->pNext = p->pWrite;
12323 p->pWrite = pWrite;
12324 }
12325 }
12326 }
12327 }
12328 }
12329 return rc;
12330 }
12331
12332 static int idxProcessOneTrigger(
12333 sqlite3expert *p,
12334 IdxWrite *pWrite,
12335 char **pzErr
12336 ){
12337 static const char *zInt = UNIQUE_TABLE_NAME;
12338 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
12339 IdxTable *pTab = pWrite->pTab;
12340 const char *zTab = pTab->zName;
12341 const char *zSql =
12342 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
12343 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
12344 "ORDER BY type;";
12345 sqlite3_stmt *pSelect = 0;
12346 int rc = SQLITE_OK;
12347 char *zWrite = 0;
12348
12349 /* Create the table and its triggers in the temp schema */
12350 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
12351 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
12352 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
12353 if( zCreate==0 ) continue;
12354 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
12355 }
12356 idxFinalize(&rc, pSelect);
12357
12358 /* Rename the table in the temp schema to zInt */
12359 if( rc==SQLITE_OK ){
12360 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
12361 if( z==0 ){
12362 rc = SQLITE_NOMEM;
12363 }else{
12364 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
12365 sqlite3_free(z);
12366 }
12367 }
12368
12369 switch( pWrite->eOp ){
12370 case SQLITE_INSERT: {
12371 int i;
12372 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
12373 for(i=0; i<pTab->nCol; i++){
12374 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
12375 }
12376 zWrite = idxAppendText(&rc, zWrite, ")");
12377 break;
12378 }
12379 case SQLITE_UPDATE: {
12380 int i;
12381 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
12382 for(i=0; i<pTab->nCol; i++){
12383 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
12384 pTab->aCol[i].zName
12385 );
12386 }
12387 break;
12388 }
12389 default: {
12390 assert( pWrite->eOp==SQLITE_DELETE );
12391 if( rc==SQLITE_OK ){
12392 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
12393 if( zWrite==0 ) rc = SQLITE_NOMEM;
12394 }
12395 }
12396 }
12397
12398 if( rc==SQLITE_OK ){
12399 sqlite3_stmt *pX = 0;
12400 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
12401 idxFinalize(&rc, pX);
12402 if( rc!=SQLITE_OK ){
12403 idxDatabaseError(p->dbv, pzErr);
12404 }
12405 }
12406 sqlite3_free(zWrite);
12407
12408 if( rc==SQLITE_OK ){
12409 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
12410 }
12411
12412 return rc;
12413 }
12414
12415 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
12416 int rc = SQLITE_OK;
12417 IdxWrite *pEnd = 0;
12418 IdxWrite *pFirst = p->pWrite;
12419
12420 while( rc==SQLITE_OK && pFirst!=pEnd ){
12421 IdxWrite *pIter;
12422 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
12423 rc = idxProcessOneTrigger(p, pIter, pzErr);
12424 }
12425 pEnd = pFirst;
12426 pFirst = p->pWrite;
12427 }
12428
12429 return rc;
12430 }
12431
12432
12433 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
12434 int rc = idxRegisterVtab(p);
12435 sqlite3_stmt *pSchema = 0;
12436
12437 /* For each table in the main db schema:
12438 **
12439 ** 1) Add an entry to the p->pTable list, and
12440 ** 2) Create the equivalent virtual table in dbv.
12441 */
12442 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
12443 "SELECT type, name, sql, 1 FROM sqlite_schema "
12444 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
12445 " UNION ALL "
12446 "SELECT type, name, sql, 2 FROM sqlite_schema "
12447 "WHERE type = 'trigger'"
12448 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
12449 "ORDER BY 4, 1"
12450 );
12451 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
12452 const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
12453 const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
12454 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
12455
12456 if( zType==0 || zName==0 ) continue;
12457 if( zType[0]=='v' || zType[1]=='r' ){
12458 if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
12459 }else{
12460 IdxTable *pTab;
12461 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
12462 if( rc==SQLITE_OK ){
12463 int i;
12464 char *zInner = 0;
12465 char *zOuter = 0;
12466 pTab->pNext = p->pTable;
12467 p->pTable = pTab;
12468
12469 /* The statement the vtab will pass to sqlite3_declare_vtab() */
12470 zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
12471 for(i=0; i<pTab->nCol; i++){
12472 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
12473 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
12474 );
12475 }
12476 zInner = idxAppendText(&rc, zInner, ")");
12477
12478 /* The CVT statement to create the vtab */
12479 zOuter = idxAppendText(&rc, 0,
12480 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
12481 );
12482 if( rc==SQLITE_OK ){
12483 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
12484 }
12485 sqlite3_free(zInner);
12486 sqlite3_free(zOuter);
12487 }
12488 }
12489 }
12490 idxFinalize(&rc, pSchema);
12491 return rc;
12492 }
12493
12494 struct IdxSampleCtx {
12495 int iTarget;
12496 double target; /* Target nRet/nRow value */
12497 double nRow; /* Number of rows seen */
12498 double nRet; /* Number of rows returned */
12499 };
12500
12501 static void idxSampleFunc(
12502 sqlite3_context *pCtx,
12503 int argc,
12504 sqlite3_value **argv
12505 ){
12506 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
12507 int bRet;
12508
12509 (void)argv;
12510 assert( argc==0 );
12511 if( p->nRow==0.0 ){
12512 bRet = 1;
12513 }else{
12514 bRet = (p->nRet / p->nRow) <= p->target;
12515 if( bRet==0 ){
12516 unsigned short rnd;
12517 sqlite3_randomness(2, (void*)&rnd);
12518 bRet = ((int)rnd % 100) <= p->iTarget;
12519 }
12520 }
12521
12522 sqlite3_result_int(pCtx, bRet);
12523 p->nRow += 1.0;
12524 p->nRet += (double)bRet;
12525 }
12526
12527 struct IdxRemCtx {
12528 int nSlot;
12529 struct IdxRemSlot {
12530 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
12531 i64 iVal; /* SQLITE_INTEGER value */
12532 double rVal; /* SQLITE_FLOAT value */
12533 int nByte; /* Bytes of space allocated at z */
12534 int n; /* Size of buffer z */
12535 char *z; /* SQLITE_TEXT/BLOB value */
12536 } aSlot[1];
12537 };
12538
12539 /*
12540 ** Implementation of scalar function rem().
12541 */
12542 static void idxRemFunc(
12543 sqlite3_context *pCtx,
12544 int argc,
12545 sqlite3_value **argv
12546 ){
12547 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
12548 struct IdxRemSlot *pSlot;
12549 int iSlot;
12550 assert( argc==2 );
12551
12552 iSlot = sqlite3_value_int(argv[0]);
12553 assert( iSlot<=p->nSlot );
12554 pSlot = &p->aSlot[iSlot];
12555
12556 switch( pSlot->eType ){
12557 case SQLITE_NULL:
12558 /* no-op */
12559 break;
12560
12561 case SQLITE_INTEGER:
12562 sqlite3_result_int64(pCtx, pSlot->iVal);
12563 break;
12564
12565 case SQLITE_FLOAT:
12566 sqlite3_result_double(pCtx, pSlot->rVal);
12567 break;
12568
12569 case SQLITE_BLOB:
12570 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
12571 break;
12572
12573 case SQLITE_TEXT:
12574 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
12575 break;
12576 }
12577
12578 pSlot->eType = sqlite3_value_type(argv[1]);
12579 switch( pSlot->eType ){
12580 case SQLITE_NULL:
12581 /* no-op */
12582 break;
12583
12584 case SQLITE_INTEGER:
12585 pSlot->iVal = sqlite3_value_int64(argv[1]);
12586 break;
12587
12588 case SQLITE_FLOAT:
12589 pSlot->rVal = sqlite3_value_double(argv[1]);
12590 break;
12591
12592 case SQLITE_BLOB:
12593 case SQLITE_TEXT: {
12594 int nByte = sqlite3_value_bytes(argv[1]);
12595 const void *pData = 0;
12596 if( nByte>pSlot->nByte ){
12597 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
12598 if( zNew==0 ){
12599 sqlite3_result_error_nomem(pCtx);
12600 return;
12601 }
12602 pSlot->nByte = nByte*2;
12603 pSlot->z = zNew;
12604 }
12605 pSlot->n = nByte;
12606 if( pSlot->eType==SQLITE_BLOB ){
12607 pData = sqlite3_value_blob(argv[1]);
12608 if( pData ) memcpy(pSlot->z, pData, nByte);
12609 }else{
12610 pData = sqlite3_value_text(argv[1]);
12611 memcpy(pSlot->z, pData, nByte);
12612 }
12613 break;
12614 }
12615 }
12616 }
12617
12618 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
12619 int rc = SQLITE_OK;
12620 const char *zMax =
12621 "SELECT max(i.seqno) FROM "
12622 " sqlite_schema AS s, "
12623 " pragma_index_list(s.name) AS l, "
12624 " pragma_index_info(l.name) AS i "
12625 "WHERE s.type = 'table'";
12626 sqlite3_stmt *pMax = 0;
12627
12628 *pnMax = 0;
12629 rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
12630 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
12631 *pnMax = sqlite3_column_int(pMax, 0) + 1;
12632 }
12633 idxFinalize(&rc, pMax);
12634
12635 return rc;
12636 }
12637
12638 static int idxPopulateOneStat1(
12639 sqlite3expert *p,
12640 sqlite3_stmt *pIndexXInfo,
12641 sqlite3_stmt *pWriteStat,
12642 const char *zTab,
12643 const char *zIdx,
12644 char **pzErr
12645 ){
12646 char *zCols = 0;
12647 char *zOrder = 0;
12648 char *zQuery = 0;
12649 int nCol = 0;
12650 int i;
12651 sqlite3_stmt *pQuery = 0;
12652 int *aStat = 0;
12653 int rc = SQLITE_OK;
12654
12655 assert( p->iSample>0 );
12656
12657 /* Formulate the query text */
12658 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
12659 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
12660 const char *zComma = zCols==0 ? "" : ", ";
12661 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
12662 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
12663 zCols = idxAppendText(&rc, zCols,
12664 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
12665 );
12666 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
12667 }
12668 sqlite3_reset(pIndexXInfo);
12669 if( rc==SQLITE_OK ){
12670 if( p->iSample==100 ){
12671 zQuery = sqlite3_mprintf(
12672 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
12673 );
12674 }else{
12675 zQuery = sqlite3_mprintf(
12676 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
12677 );
12678 }
12679 }
12680 sqlite3_free(zCols);
12681 sqlite3_free(zOrder);
12682
12683 /* Formulate the query text */
12684 if( rc==SQLITE_OK ){
12685 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
12686 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
12687 }
12688 sqlite3_free(zQuery);
12689
12690 if( rc==SQLITE_OK ){
12691 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
12692 }
12693 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
12694 IdxHashEntry *pEntry;
12695 char *zStat = 0;
12696 for(i=0; i<=nCol; i++) aStat[i] = 1;
12697 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
12698 aStat[0]++;
12699 for(i=0; i<nCol; i++){
12700 if( sqlite3_column_int(pQuery, i)==0 ) break;
12701 }
12702 for(/*no-op*/; i<nCol; i++){
12703 aStat[i+1]++;
12704 }
12705 }
12706
12707 if( rc==SQLITE_OK ){
12708 int s0 = aStat[0];
12709 zStat = sqlite3_mprintf("%d", s0);
12710 if( zStat==0 ) rc = SQLITE_NOMEM;
12711 for(i=1; rc==SQLITE_OK && i<=nCol; i++){
12712 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
12713 }
12714 }
12715
12716 if( rc==SQLITE_OK ){
12717 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
12718 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
12719 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
12720 sqlite3_step(pWriteStat);
12721 rc = sqlite3_reset(pWriteStat);
12722 }
12723
12724 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
12725 if( pEntry ){
12726 assert( pEntry->zVal2==0 );
12727 pEntry->zVal2 = zStat;
12728 }else{
12729 sqlite3_free(zStat);
12730 }
12731 }
12732 sqlite3_free(aStat);
12733 idxFinalize(&rc, pQuery);
12734
12735 return rc;
12736 }
12737
12738 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
12739 int rc;
12740 char *zSql;
12741
12742 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
12743 if( rc!=SQLITE_OK ) return rc;
12744
12745 zSql = sqlite3_mprintf(
12746 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
12747 );
12748 if( zSql==0 ) return SQLITE_NOMEM;
12749 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
12750 sqlite3_free(zSql);
12751
12752 return rc;
12753 }
12754
12755 /*
12756 ** This function is called as part of sqlite3_expert_analyze(). Candidate
12757 ** indexes have already been created in database sqlite3expert.dbm, this
12758 ** function populates sqlite_stat1 table in the same database.
12759 **
12760 ** The stat1 data is generated by querying the
12761 */
12762 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
12763 int rc = SQLITE_OK;
12764 int nMax =0;
12765 struct IdxRemCtx *pCtx = 0;
12766 struct IdxSampleCtx samplectx;
12767 int i;
12768 i64 iPrev = -100000;
12769 sqlite3_stmt *pAllIndex = 0;
12770 sqlite3_stmt *pIndexXInfo = 0;
12771 sqlite3_stmt *pWrite = 0;
12772
12773 const char *zAllIndex =
12774 "SELECT s.rowid, s.name, l.name FROM "
12775 " sqlite_schema AS s, "
12776 " pragma_index_list(s.name) AS l "
12777 "WHERE s.type = 'table'";
12778 const char *zIndexXInfo =
12779 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
12780 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
12781
12782 /* If iSample==0, no sqlite_stat1 data is required. */
12783 if( p->iSample==0 ) return SQLITE_OK;
12784
12785 rc = idxLargestIndex(p->dbm, &nMax, pzErr);
12786 if( nMax<=0 || rc!=SQLITE_OK ) return rc;
12787
12788 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
12789
12790 if( rc==SQLITE_OK ){
12791 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
12792 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
12793 }
12794
12795 if( rc==SQLITE_OK ){
12796 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
12797 rc = sqlite3_create_function(
12798 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
12799 );
12800 }
12801 if( rc==SQLITE_OK ){
12802 rc = sqlite3_create_function(
12803 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
12804 );
12805 }
12806
12807 if( rc==SQLITE_OK ){
12808 pCtx->nSlot = nMax+1;
12809 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
12810 }
12811 if( rc==SQLITE_OK ){
12812 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
12813 }
12814 if( rc==SQLITE_OK ){
12815 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
12816 }
12817
12818 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
12819 i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
12820 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
12821 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
12822 if( zTab==0 || zIdx==0 ) continue;
12823 if( p->iSample<100 && iPrev!=iRowid ){
12824 samplectx.target = (double)p->iSample / 100.0;
12825 samplectx.iTarget = p->iSample;
12826 samplectx.nRow = 0.0;
12827 samplectx.nRet = 0.0;
12828 rc = idxBuildSampleTable(p, zTab);
12829 if( rc!=SQLITE_OK ) break;
12830 }
12831 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
12832 iPrev = iRowid;
12833 }
12834 if( rc==SQLITE_OK && p->iSample<100 ){
12835 rc = sqlite3_exec(p->dbv,
12836 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
12837 );
12838 }
12839
12840 idxFinalize(&rc, pAllIndex);
12841 idxFinalize(&rc, pIndexXInfo);
12842 idxFinalize(&rc, pWrite);
12843
12844 if( pCtx ){
12845 for(i=0; i<pCtx->nSlot; i++){
12846 sqlite3_free(pCtx->aSlot[i].z);
12847 }
12848 sqlite3_free(pCtx);
12849 }
12850
12851 if( rc==SQLITE_OK ){
12852 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
12853 }
12854
12855 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
12856 return rc;
12857 }
12858
12859 /*
12860 ** Allocate a new sqlite3expert object.
12861 */
12862 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
12863 int rc = SQLITE_OK;
12864 sqlite3expert *pNew;
12865
12866 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
12867
12868 /* Open two in-memory databases to work with. The "vtab database" (dbv)
12869 ** will contain a virtual table corresponding to each real table in
12870 ** the user database schema, and a copy of each view. It is used to
12871 ** collect information regarding the WHERE, ORDER BY and other clauses
12872 ** of the user's query.
12873 */
12874 if( rc==SQLITE_OK ){
12875 pNew->db = db;
12876 pNew->iSample = 100;
12877 rc = sqlite3_open(":memory:", &pNew->dbv);
12878 }
12879 if( rc==SQLITE_OK ){
12880 rc = sqlite3_open(":memory:", &pNew->dbm);
12881 if( rc==SQLITE_OK ){
12882 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
12883 }
12884 }
12885
12886
12887 /* Copy the entire schema of database [db] into [dbm]. */
12888 if( rc==SQLITE_OK ){
12889 sqlite3_stmt *pSql = 0;
12890 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
12891 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
12892 " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
12893 );
12894 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
12895 const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
12896 if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
12897 }
12898 idxFinalize(&rc, pSql);
12899 }
12900
12901 /* Create the vtab schema */
12902 if( rc==SQLITE_OK ){
12903 rc = idxCreateVtabSchema(pNew, pzErrmsg);
12904 }
12905
12906 /* Register the auth callback with dbv */
12907 if( rc==SQLITE_OK ){
12908 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
12909 }
12910
12911 /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
12912 ** return the new sqlite3expert handle. */
12913 if( rc!=SQLITE_OK ){
12914 sqlite3_expert_destroy(pNew);
12915 pNew = 0;
12916 }
12917 return pNew;
12918 }
12919
12920 /*
12921 ** Configure an sqlite3expert object.
12922 */
12923 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
12924 int rc = SQLITE_OK;
12925 va_list ap;
12926 va_start(ap, op);
12927 switch( op ){
12928 case EXPERT_CONFIG_SAMPLE: {
12929 int iVal = va_arg(ap, int);
12930 if( iVal<0 ) iVal = 0;
12931 if( iVal>100 ) iVal = 100;
12932 p->iSample = iVal;
12933 break;
12934 }
12935 default:
12936 rc = SQLITE_NOTFOUND;
12937 break;
12938 }
12939
12940 va_end(ap);
12941 return rc;
12942 }
12943
12944 /*
12945 ** Add an SQL statement to the analysis.
12946 */
12947 int sqlite3_expert_sql(
12948 sqlite3expert *p, /* From sqlite3_expert_new() */
12949 const char *zSql, /* SQL statement to add */
12950 char **pzErr /* OUT: Error message (if any) */
12951 ){
12952 IdxScan *pScanOrig = p->pScan;
12953 IdxStatement *pStmtOrig = p->pStatement;
12954 int rc = SQLITE_OK;
12955 const char *zStmt = zSql;
12956
12957 if( p->bRun ) return SQLITE_MISUSE;
12958
12959 while( rc==SQLITE_OK && zStmt && zStmt[0] ){
12960 sqlite3_stmt *pStmt = 0;
12961 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
12962 if( rc==SQLITE_OK ){
12963 if( pStmt ){
12964 IdxStatement *pNew;
12965 const char *z = sqlite3_sql(pStmt);
12966 int n = STRLEN(z);
12967 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
12968 if( rc==SQLITE_OK ){
12969 pNew->zSql = (char*)&pNew[1];
12970 memcpy(pNew->zSql, z, n+1);
12971 pNew->pNext = p->pStatement;
12972 if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
12973 p->pStatement = pNew;
12974 }
12975 sqlite3_finalize(pStmt);
12976 }
12977 }else{
12978 idxDatabaseError(p->dbv, pzErr);
12979 }
12980 }
12981
12982 if( rc!=SQLITE_OK ){
12983 idxScanFree(p->pScan, pScanOrig);
12984 idxStatementFree(p->pStatement, pStmtOrig);
12985 p->pScan = pScanOrig;
12986 p->pStatement = pStmtOrig;
12987 }
12988
12989 return rc;
12990 }
12991
12992 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
12993 int rc;
12994 IdxHashEntry *pEntry;
12995
12996 /* Do trigger processing to collect any extra IdxScan structures */
12997 rc = idxProcessTriggers(p, pzErr);
12998
12999 /* Create candidate indexes within the in-memory database file */
13000 if( rc==SQLITE_OK ){
13001 rc = idxCreateCandidates(p);
13002 }else if ( rc==SQLITE_BUSY_TIMEOUT ){
13003 if( pzErr )
13004 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
13005 return rc;
13006 }
13007
13008 /* Generate the stat1 data */
13009 if( rc==SQLITE_OK ){
13010 rc = idxPopulateStat1(p, pzErr);
13011 }
13012
13013 /* Formulate the EXPERT_REPORT_CANDIDATES text */
13014 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
13015 p->zCandidates = idxAppendText(&rc, p->zCandidates,
13016 "%s;%s%s\n", pEntry->zVal,
13017 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
13018 );
13019 }
13020
13021 /* Figure out which of the candidate indexes are preferred by the query
13022 ** planner and report the results to the user. */
13023 if( rc==SQLITE_OK ){
13024 rc = idxFindIndexes(p, pzErr);
13025 }
13026
13027 if( rc==SQLITE_OK ){
13028 p->bRun = 1;
13029 }
13030 return rc;
13031 }
13032
13033 /*
13034 ** Return the total number of statements that have been added to this
13035 ** sqlite3expert using sqlite3_expert_sql().
13036 */
13037 int sqlite3_expert_count(sqlite3expert *p){
13038 int nRet = 0;
13039 if( p->pStatement ) nRet = p->pStatement->iId+1;
13040 return nRet;
13041 }
13042
13043 /*
13044 ** Return a component of the report.
13045 */
13046 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
13047 const char *zRet = 0;
13048 IdxStatement *pStmt;
13049
13050 if( p->bRun==0 ) return 0;
13051 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
13052 switch( eReport ){
13053 case EXPERT_REPORT_SQL:
13054 if( pStmt ) zRet = pStmt->zSql;
13055 break;
13056 case EXPERT_REPORT_INDEXES:
13057 if( pStmt ) zRet = pStmt->zIdx;
13058 break;
13059 case EXPERT_REPORT_PLAN:
13060 if( pStmt ) zRet = pStmt->zEQP;
13061 break;
13062 case EXPERT_REPORT_CANDIDATES:
13063 zRet = p->zCandidates;
13064 break;
13065 }
13066 return zRet;
13067 }
13068
13069 /*
13070 ** Free an sqlite3expert object.
13071 */
13072 void sqlite3_expert_destroy(sqlite3expert *p){
13073 if( p ){
13074 sqlite3_close(p->dbm);
13075 sqlite3_close(p->dbv);
13076 idxScanFree(p->pScan, 0);
13077 idxStatementFree(p->pStatement, 0);
13078 idxTableFree(p->pTable);
13079 idxWriteFree(p->pWrite);
13080 idxHashClear(&p->hIdx);
13081 sqlite3_free(p->zCandidates);
13082 sqlite3_free(p);
13083 }
13084 }
13085
13086 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
13087
13088 /************************* End ../ext/expert/sqlite3expert.c ********************/
13089
13090 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
13091 #define SQLITE_SHELL_HAVE_RECOVER 1
13092 #else
13093 #define SQLITE_SHELL_HAVE_RECOVER 0
13094 #endif
13095 #if SQLITE_SHELL_HAVE_RECOVER
13096 /************************* Begin ../ext/recover/sqlite3recover.h ******************/
13097 /*
13098 ** 2022-08-27
13099 **
13100 ** The author disclaims copyright to this source code. In place of
13101 ** a legal notice, here is a blessing:
13102 **
13103 ** May you do good and not evil.
13104 ** May you find forgiveness for yourself and forgive others.
13105 ** May you share freely, never taking more than you give.
13106 **
13107 *************************************************************************
13108 **
13109 ** This file contains the public interface to the "recover" extension -
13110 ** an SQLite extension designed to recover data from corrupted database
13111 ** files.
13112 */
13113
13114 /*
13115 ** OVERVIEW:
13116 **
13117 ** To use the API to recover data from a corrupted database, an
13118 ** application:
13119 **
13120 ** 1) Creates an sqlite3_recover handle by calling either
13121 ** sqlite3_recover_init() or sqlite3_recover_init_sql().
13122 **
13123 ** 2) Configures the new handle using one or more calls to
13124 ** sqlite3_recover_config().
13125 **
13126 ** 3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
13127 ** the handle until it returns something other than SQLITE_OK. If it
13128 ** returns SQLITE_DONE, then the recovery operation completed without
13129 ** error. If it returns some other non-SQLITE_OK value, then an error
13130 ** has occurred.
13131 **
13132 ** 4) Retrieves any error code and English language error message using the
13133 ** sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
13134 ** respectively.
13135 **
13136 ** 5) Destroys the sqlite3_recover handle and frees all resources
13137 ** using sqlite3_recover_finish().
13138 **
13139 ** The application may abandon the recovery operation at any point
13140 ** before it is finished by passing the sqlite3_recover handle to
13141 ** sqlite3_recover_finish(). This is not an error, but the final state
13142 ** of the output database, or the results of running the partial script
13143 ** delivered to the SQL callback, are undefined.
13144 */
13145
13146 #ifndef _SQLITE_RECOVER_H
13147 #define _SQLITE_RECOVER_H
13148
13149 /* #include "sqlite3.h" */
13150
13151 #ifdef __cplusplus
13152 extern "C" {
13153 #endif
13154
13155 /*
13156 ** An instance of the sqlite3_recover object represents a recovery
13157 ** operation in progress.
13158 **
13159 ** Constructors:
13160 **
13161 ** sqlite3_recover_init()
13162 ** sqlite3_recover_init_sql()
13163 **
13164 ** Destructor:
13165 **
13166 ** sqlite3_recover_finish()
13167 **
13168 ** Methods:
13169 **
13170 ** sqlite3_recover_config()
13171 ** sqlite3_recover_errcode()
13172 ** sqlite3_recover_errmsg()
13173 ** sqlite3_recover_run()
13174 ** sqlite3_recover_step()
13175 */
13176 typedef struct sqlite3_recover sqlite3_recover;
13177
13178 /*
13179 ** These two APIs attempt to create and return a new sqlite3_recover object.
13180 ** In both cases the first two arguments identify the (possibly
13181 ** corrupt) database to recover data from. The first argument is an open
13182 ** database handle and the second the name of a database attached to that
13183 ** handle (i.e. "main", "temp" or the name of an attached database).
13184 **
13185 ** If sqlite3_recover_init() is used to create the new sqlite3_recover
13186 ** handle, then data is recovered into a new database, identified by
13187 ** string parameter zUri. zUri may be an absolute or relative file path,
13188 ** or may be an SQLite URI. If the identified database file already exists,
13189 ** it is overwritten.
13190 **
13191 ** If sqlite3_recover_init_sql() is invoked, then any recovered data will
13192 ** be returned to the user as a series of SQL statements. Executing these
13193 ** SQL statements results in the same database as would have been created
13194 ** had sqlite3_recover_init() been used. For each SQL statement in the
13195 ** output, the callback function passed as the third argument (xSql) is
13196 ** invoked once. The first parameter is a passed a copy of the fourth argument
13197 ** to this function (pCtx) as its first parameter, and a pointer to a
13198 ** nul-terminated buffer containing the SQL statement formated as UTF-8 as
13199 ** the second. If the xSql callback returns any value other than SQLITE_OK,
13200 ** then processing is immediately abandoned and the value returned used as
13201 ** the recover handle error code (see below).
13202 **
13203 ** If an out-of-memory error occurs, NULL may be returned instead of
13204 ** a valid handle. In all other cases, it is the responsibility of the
13205 ** application to avoid resource leaks by ensuring that
13206 ** sqlite3_recover_finish() is called on all allocated handles.
13207 */
13208 sqlite3_recover *sqlite3_recover_init(
13209 sqlite3* db,
13210 const char *zDb,
13211 const char *zUri
13212 );
13213 sqlite3_recover *sqlite3_recover_init_sql(
13214 sqlite3* db,
13215 const char *zDb,
13216 int (*xSql)(void*, const char*),
13217 void *pCtx
13218 );
13219
13220 /*
13221 ** Configure an sqlite3_recover object that has just been created using
13222 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
13223 ** may only be called before the first call to sqlite3_recover_step()
13224 ** or sqlite3_recover_run() on the object.
13225 **
13226 ** The second argument passed to this function must be one of the
13227 ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
13228 ** depend on the specific SQLITE_RECOVER_* symbol in use.
13229 **
13230 ** SQLITE_OK is returned if the configuration operation was successful,
13231 ** or an SQLite error code otherwise.
13232 */
13233 int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
13234
13235 /*
13236 ** SQLITE_RECOVER_LOST_AND_FOUND:
13237 ** The pArg argument points to a string buffer containing the name
13238 ** of a "lost-and-found" table in the output database, or NULL. If
13239 ** the argument is non-NULL and the database contains seemingly
13240 ** valid pages that cannot be associated with any table in the
13241 ** recovered part of the schema, data is extracted from these
13242 ** pages to add to the lost-and-found table.
13243 **
13244 ** SQLITE_RECOVER_FREELIST_CORRUPT:
13245 ** The pArg value must actually be a pointer to a value of type
13246 ** int containing value 0 or 1 cast as a (void*). If this option is set
13247 ** (argument is 1) and a lost-and-found table has been configured using
13248 ** SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is
13249 ** corrupt and an attempt is made to recover records from pages that
13250 ** appear to be linked into the freelist. Otherwise, pages on the freelist
13251 ** are ignored. Setting this option can recover more data from the
13252 ** database, but often ends up "recovering" deleted records. The default
13253 ** value is 0 (clear).
13254 **
13255 ** SQLITE_RECOVER_ROWIDS:
13256 ** The pArg value must actually be a pointer to a value of type
13257 ** int containing value 0 or 1 cast as a (void*). If this option is set
13258 ** (argument is 1), then an attempt is made to recover rowid values
13259 ** that are not also INTEGER PRIMARY KEY values. If this option is
13260 ** clear, then new rowids are assigned to all recovered rows. The
13261 ** default value is 1 (set).
13262 **
13263 ** SQLITE_RECOVER_SLOWINDEXES:
13264 ** The pArg value must actually be a pointer to a value of type
13265 ** int containing value 0 or 1 cast as a (void*). If this option is clear
13266 ** (argument is 0), then when creating an output database, the recover
13267 ** module creates and populates non-UNIQUE indexes right at the end of the
13268 ** recovery operation - after all recoverable data has been inserted
13269 ** into the new database. This is faster overall, but means that the
13270 ** final call to sqlite3_recover_step() for a recovery operation may
13271 ** be need to create a large number of indexes, which may be very slow.
13272 **
13273 ** Or, if this option is set (argument is 1), then non-UNIQUE indexes
13274 ** are created in the output database before it is populated with
13275 ** recovered data. This is slower overall, but avoids the slow call
13276 ** to sqlite3_recover_step() at the end of the recovery operation.
13277 **
13278 ** The default option value is 0.
13279 */
13280 #define SQLITE_RECOVER_LOST_AND_FOUND 1
13281 #define SQLITE_RECOVER_FREELIST_CORRUPT 2
13282 #define SQLITE_RECOVER_ROWIDS 3
13283 #define SQLITE_RECOVER_SLOWINDEXES 4
13284
13285 /*
13286 ** Perform a unit of work towards the recovery operation. This function
13287 ** must normally be called multiple times to complete database recovery.
13288 **
13289 ** If no error occurs but the recovery operation is not completed, this
13290 ** function returns SQLITE_OK. If recovery has been completed successfully
13291 ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
13292 ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
13293 ** considered an error if some or all of the data cannot be recovered
13294 ** due to database corruption.
13295 **
13296 ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
13297 ** all further such calls on the same recover handle are no-ops that return
13298 ** the same non-SQLITE_OK value.
13299 */
13300 int sqlite3_recover_step(sqlite3_recover*);
13301
13302 /*
13303 ** Run the recovery operation to completion. Return SQLITE_OK if successful,
13304 ** or an SQLite error code otherwise. Calling this function is the same
13305 ** as executing:
13306 **
13307 ** while( SQLITE_OK==sqlite3_recover_step(p) );
13308 ** return sqlite3_recover_errcode(p);
13309 */
13310 int sqlite3_recover_run(sqlite3_recover*);
13311
13312 /*
13313 ** If an error has been encountered during a prior call to
13314 ** sqlite3_recover_step(), then this function attempts to return a
13315 ** pointer to a buffer containing an English language explanation of
13316 ** the error. If no error message is available, or if an out-of memory
13317 ** error occurs while attempting to allocate a buffer in which to format
13318 ** the error message, NULL is returned.
13319 **
13320 ** The returned buffer remains valid until the sqlite3_recover handle is
13321 ** destroyed using sqlite3_recover_finish().
13322 */
13323 const char *sqlite3_recover_errmsg(sqlite3_recover*);
13324
13325 /*
13326 ** If this function is called on an sqlite3_recover handle after
13327 ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
13328 */
13329 int sqlite3_recover_errcode(sqlite3_recover*);
13330
13331 /*
13332 ** Clean up a recovery object created by a call to sqlite3_recover_init().
13333 ** The results of using a recovery object with any API after it has been
13334 ** passed to this function are undefined.
13335 **
13336 ** This function returns the same value as sqlite3_recover_errcode().
13337 */
13338 int sqlite3_recover_finish(sqlite3_recover*);
13339
13340
13341 #ifdef __cplusplus
13342 } /* end of the 'extern "C"' block */
13343 #endif
13344
13345 #endif /* ifndef _SQLITE_RECOVER_H */
13346
13347 /************************* End ../ext/recover/sqlite3recover.h ********************/
13348 # ifndef SQLITE_HAVE_SQLITE3R
13349 /************************* Begin ../ext/recover/dbdata.c ******************/
13350 /*
13351 ** 2019-04-17
13352 **
13353 ** The author disclaims copyright to this source code. In place of
13354 ** a legal notice, here is a blessing:
13355 **
13356 ** May you do good and not evil.
13357 ** May you find forgiveness for yourself and forgive others.
13358 ** May you share freely, never taking more than you give.
13359 **
13360 ******************************************************************************
13361 **
13362 ** This file contains an implementation of two eponymous virtual tables,
13363 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
13364 ** "sqlite_dbpage" eponymous virtual table be available.
13365 **
13366 ** SQLITE_DBDATA:
13367 ** sqlite_dbdata is used to extract data directly from a database b-tree
13368 ** page and its associated overflow pages, bypassing the b-tree layer.
13369 ** The table schema is equivalent to:
13370 **
13371 ** CREATE TABLE sqlite_dbdata(
13372 ** pgno INTEGER,
13373 ** cell INTEGER,
13374 ** field INTEGER,
13375 ** value ANY,
13376 ** schema TEXT HIDDEN
13377 ** );
13378 **
13379 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
13380 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
13381 ** "schema".
13382 **
13383 ** Each page of the database is inspected. If it cannot be interpreted as
13384 ** a b-tree page, or if it is a b-tree page containing 0 entries, the
13385 ** sqlite_dbdata table contains no rows for that page. Otherwise, the
13386 ** table contains one row for each field in the record associated with
13387 ** each cell on the page. For intkey b-trees, the key value is stored in
13388 ** field -1.
13389 **
13390 ** For example, for the database:
13391 **
13392 ** CREATE TABLE t1(a, b); -- root page is page 2
13393 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
13394 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
13395 **
13396 ** the sqlite_dbdata table contains, as well as from entries related to
13397 ** page 1, content equivalent to:
13398 **
13399 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
13400 ** (2, 0, -1, 5 ),
13401 ** (2, 0, 0, 'v' ),
13402 ** (2, 0, 1, 'five'),
13403 ** (2, 1, -1, 10 ),
13404 ** (2, 1, 0, 'x' ),
13405 ** (2, 1, 1, 'ten' );
13406 **
13407 ** If database corruption is encountered, this module does not report an
13408 ** error. Instead, it attempts to extract as much data as possible and
13409 ** ignores the corruption.
13410 **
13411 ** SQLITE_DBPTR:
13412 ** The sqlite_dbptr table has the following schema:
13413 **
13414 ** CREATE TABLE sqlite_dbptr(
13415 ** pgno INTEGER,
13416 ** child INTEGER,
13417 ** schema TEXT HIDDEN
13418 ** );
13419 **
13420 ** It contains one entry for each b-tree pointer between a parent and
13421 ** child page in the database.
13422 */
13423
13424 #if !defined(SQLITEINT_H)
13425 /* #include "sqlite3.h" */
13426
13427 /* typedef unsigned char u8; */
13428 /* typedef unsigned int u32; */
13429
13430 #endif
13431 #include <string.h>
13432 #include <assert.h>
13433
13434 #ifndef SQLITE_OMIT_VIRTUALTABLE
13435
13436 #define DBDATA_PADDING_BYTES 100
13437
13438 typedef struct DbdataTable DbdataTable;
13439 typedef struct DbdataCursor DbdataCursor;
13440
13441 /* Cursor object */
13442 struct DbdataCursor {
13443 sqlite3_vtab_cursor base; /* Base class. Must be first */
13444 sqlite3_stmt *pStmt; /* For fetching database pages */
13445
13446 int iPgno; /* Current page number */
13447 u8 *aPage; /* Buffer containing page */
13448 int nPage; /* Size of aPage[] in bytes */
13449 int nCell; /* Number of cells on aPage[] */
13450 int iCell; /* Current cell number */
13451 int bOnePage; /* True to stop after one page */
13452 int szDb;
13453 sqlite3_int64 iRowid;
13454
13455 /* Only for the sqlite_dbdata table */
13456 u8 *pRec; /* Buffer containing current record */
13457 sqlite3_int64 nRec; /* Size of pRec[] in bytes */
13458 sqlite3_int64 nHdr; /* Size of header in bytes */
13459 int iField; /* Current field number */
13460 u8 *pHdrPtr;
13461 u8 *pPtr;
13462 u32 enc; /* Text encoding */
13463
13464 sqlite3_int64 iIntkey; /* Integer key value */
13465 };
13466
13467 /* Table object */
13468 struct DbdataTable {
13469 sqlite3_vtab base; /* Base class. Must be first */
13470 sqlite3 *db; /* The database connection */
13471 sqlite3_stmt *pStmt; /* For fetching database pages */
13472 int bPtr; /* True for sqlite3_dbptr table */
13473 };
13474
13475 /* Column and schema definitions for sqlite_dbdata */
13476 #define DBDATA_COLUMN_PGNO 0
13477 #define DBDATA_COLUMN_CELL 1
13478 #define DBDATA_COLUMN_FIELD 2
13479 #define DBDATA_COLUMN_VALUE 3
13480 #define DBDATA_COLUMN_SCHEMA 4
13481 #define DBDATA_SCHEMA \
13482 "CREATE TABLE x(" \
13483 " pgno INTEGER," \
13484 " cell INTEGER," \
13485 " field INTEGER," \
13486 " value ANY," \
13487 " schema TEXT HIDDEN" \
13488 ")"
13489
13490 /* Column and schema definitions for sqlite_dbptr */
13491 #define DBPTR_COLUMN_PGNO 0
13492 #define DBPTR_COLUMN_CHILD 1
13493 #define DBPTR_COLUMN_SCHEMA 2
13494 #define DBPTR_SCHEMA \
13495 "CREATE TABLE x(" \
13496 " pgno INTEGER," \
13497 " child INTEGER," \
13498 " schema TEXT HIDDEN" \
13499 ")"
13500
13501 /*
13502 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
13503 ** table.
13504 */
13505 static int dbdataConnect(
13506 sqlite3 *db,
13507 void *pAux,
13508 int argc, const char *const*argv,
13509 sqlite3_vtab **ppVtab,
13510 char **pzErr
13511 ){
13512 DbdataTable *pTab = 0;
13513 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
13514
13515 (void)argc;
13516 (void)argv;
13517 (void)pzErr;
13518 sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
13519 if( rc==SQLITE_OK ){
13520 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
13521 if( pTab==0 ){
13522 rc = SQLITE_NOMEM;
13523 }else{
13524 memset(pTab, 0, sizeof(DbdataTable));
13525 pTab->db = db;
13526 pTab->bPtr = (pAux!=0);
13527 }
13528 }
13529
13530 *ppVtab = (sqlite3_vtab*)pTab;
13531 return rc;
13532 }
13533
13534 /*
13535 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
13536 */
13537 static int dbdataDisconnect(sqlite3_vtab *pVtab){
13538 DbdataTable *pTab = (DbdataTable*)pVtab;
13539 if( pTab ){
13540 sqlite3_finalize(pTab->pStmt);
13541 sqlite3_free(pVtab);
13542 }
13543 return SQLITE_OK;
13544 }
13545
13546 /*
13547 ** This function interprets two types of constraints:
13548 **
13549 ** schema=?
13550 ** pgno=?
13551 **
13552 ** If neither are present, idxNum is set to 0. If schema=? is present,
13553 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
13554 ** in idxNum is set.
13555 **
13556 ** If both parameters are present, schema is in position 0 and pgno in
13557 ** position 1.
13558 */
13559 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
13560 DbdataTable *pTab = (DbdataTable*)tab;
13561 int i;
13562 int iSchema = -1;
13563 int iPgno = -1;
13564 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
13565
13566 for(i=0; i<pIdx->nConstraint; i++){
13567 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
13568 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
13569 if( p->iColumn==colSchema ){
13570 if( p->usable==0 ) return SQLITE_CONSTRAINT;
13571 iSchema = i;
13572 }
13573 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
13574 iPgno = i;
13575 }
13576 }
13577 }
13578
13579 if( iSchema>=0 ){
13580 pIdx->aConstraintUsage[iSchema].argvIndex = 1;
13581 pIdx->aConstraintUsage[iSchema].omit = 1;
13582 }
13583 if( iPgno>=0 ){
13584 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
13585 pIdx->aConstraintUsage[iPgno].omit = 1;
13586 pIdx->estimatedCost = 100;
13587 pIdx->estimatedRows = 50;
13588
13589 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
13590 int iCol = pIdx->aOrderBy[0].iColumn;
13591 if( pIdx->nOrderBy==1 ){
13592 pIdx->orderByConsumed = (iCol==0 || iCol==1);
13593 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
13594 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
13595 }
13596 }
13597
13598 }else{
13599 pIdx->estimatedCost = 100000000;
13600 pIdx->estimatedRows = 1000000000;
13601 }
13602 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
13603 return SQLITE_OK;
13604 }
13605
13606 /*
13607 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
13608 */
13609 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
13610 DbdataCursor *pCsr;
13611
13612 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
13613 if( pCsr==0 ){
13614 return SQLITE_NOMEM;
13615 }else{
13616 memset(pCsr, 0, sizeof(DbdataCursor));
13617 pCsr->base.pVtab = pVTab;
13618 }
13619
13620 *ppCursor = (sqlite3_vtab_cursor *)pCsr;
13621 return SQLITE_OK;
13622 }
13623
13624 /*
13625 ** Restore a cursor object to the state it was in when first allocated
13626 ** by dbdataOpen().
13627 */
13628 static void dbdataResetCursor(DbdataCursor *pCsr){
13629 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
13630 if( pTab->pStmt==0 ){
13631 pTab->pStmt = pCsr->pStmt;
13632 }else{
13633 sqlite3_finalize(pCsr->pStmt);
13634 }
13635 pCsr->pStmt = 0;
13636 pCsr->iPgno = 1;
13637 pCsr->iCell = 0;
13638 pCsr->iField = 0;
13639 pCsr->bOnePage = 0;
13640 sqlite3_free(pCsr->aPage);
13641 sqlite3_free(pCsr->pRec);
13642 pCsr->pRec = 0;
13643 pCsr->aPage = 0;
13644 }
13645
13646 /*
13647 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
13648 */
13649 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
13650 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
13651 dbdataResetCursor(pCsr);
13652 sqlite3_free(pCsr);
13653 return SQLITE_OK;
13654 }
13655
13656 /*
13657 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
13658 */
13659 static u32 get_uint16(unsigned char *a){
13660 return (a[0]<<8)|a[1];
13661 }
13662 static u32 get_uint32(unsigned char *a){
13663 return ((u32)a[0]<<24)
13664 | ((u32)a[1]<<16)
13665 | ((u32)a[2]<<8)
13666 | ((u32)a[3]);
13667 }
13668
13669 /*
13670 ** Load page pgno from the database via the sqlite_dbpage virtual table.
13671 ** If successful, set (*ppPage) to point to a buffer containing the page
13672 ** data, (*pnPage) to the size of that buffer in bytes and return
13673 ** SQLITE_OK. In this case it is the responsibility of the caller to
13674 ** eventually free the buffer using sqlite3_free().
13675 **
13676 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
13677 ** return an SQLite error code.
13678 */
13679 static int dbdataLoadPage(
13680 DbdataCursor *pCsr, /* Cursor object */
13681 u32 pgno, /* Page number of page to load */
13682 u8 **ppPage, /* OUT: pointer to page buffer */
13683 int *pnPage /* OUT: Size of (*ppPage) in bytes */
13684 ){
13685 int rc2;
13686 int rc = SQLITE_OK;
13687 sqlite3_stmt *pStmt = pCsr->pStmt;
13688
13689 *ppPage = 0;
13690 *pnPage = 0;
13691 if( pgno>0 ){
13692 sqlite3_bind_int64(pStmt, 2, pgno);
13693 if( SQLITE_ROW==sqlite3_step(pStmt) ){
13694 int nCopy = sqlite3_column_bytes(pStmt, 0);
13695 if( nCopy>0 ){
13696 u8 *pPage;
13697 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
13698 if( pPage==0 ){
13699 rc = SQLITE_NOMEM;
13700 }else{
13701 const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
13702 memcpy(pPage, pCopy, nCopy);
13703 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
13704 }
13705 *ppPage = pPage;
13706 *pnPage = nCopy;
13707 }
13708 }
13709 rc2 = sqlite3_reset(pStmt);
13710 if( rc==SQLITE_OK ) rc = rc2;
13711 }
13712
13713 return rc;
13714 }
13715
13716 /*
13717 ** Read a varint. Put the value in *pVal and return the number of bytes.
13718 */
13719 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
13720 sqlite3_uint64 u = 0;
13721 int i;
13722 for(i=0; i<8; i++){
13723 u = (u<<7) + (z[i]&0x7f);
13724 if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
13725 }
13726 u = (u<<8) + (z[i]&0xff);
13727 *pVal = (sqlite3_int64)u;
13728 return 9;
13729 }
13730
13731 /*
13732 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
13733 ** or greater than 0xFFFFFFFF. This can be used for all varints in an
13734 ** SQLite database except for key values in intkey tables.
13735 */
13736 static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
13737 sqlite3_int64 val;
13738 int nRet = dbdataGetVarint(z, &val);
13739 if( val<0 || val>0xFFFFFFFF ) val = 0;
13740 *pVal = val;
13741 return nRet;
13742 }
13743
13744 /*
13745 ** Return the number of bytes of space used by an SQLite value of type
13746 ** eType.
13747 */
13748 static int dbdataValueBytes(int eType){
13749 switch( eType ){
13750 case 0: case 8: case 9:
13751 case 10: case 11:
13752 return 0;
13753 case 1:
13754 return 1;
13755 case 2:
13756 return 2;
13757 case 3:
13758 return 3;
13759 case 4:
13760 return 4;
13761 case 5:
13762 return 6;
13763 case 6:
13764 case 7:
13765 return 8;
13766 default:
13767 if( eType>0 ){
13768 return ((eType-12) / 2);
13769 }
13770 return 0;
13771 }
13772 }
13773
13774 /*
13775 ** Load a value of type eType from buffer pData and use it to set the
13776 ** result of context object pCtx.
13777 */
13778 static void dbdataValue(
13779 sqlite3_context *pCtx,
13780 u32 enc,
13781 int eType,
13782 u8 *pData,
13783 sqlite3_int64 nData
13784 ){
13785 if( eType>=0 && dbdataValueBytes(eType)<=nData ){
13786 switch( eType ){
13787 case 0:
13788 case 10:
13789 case 11:
13790 sqlite3_result_null(pCtx);
13791 break;
13792
13793 case 8:
13794 sqlite3_result_int(pCtx, 0);
13795 break;
13796 case 9:
13797 sqlite3_result_int(pCtx, 1);
13798 break;
13799
13800 case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
13801 sqlite3_uint64 v = (signed char)pData[0];
13802 pData++;
13803 switch( eType ){
13804 case 7:
13805 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
13806 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
13807 case 4: v = (v<<8) + pData[0]; pData++;
13808 case 3: v = (v<<8) + pData[0]; pData++;
13809 case 2: v = (v<<8) + pData[0]; pData++;
13810 }
13811
13812 if( eType==7 ){
13813 double r;
13814 memcpy(&r, &v, sizeof(r));
13815 sqlite3_result_double(pCtx, r);
13816 }else{
13817 sqlite3_result_int64(pCtx, (sqlite3_int64)v);
13818 }
13819 break;
13820 }
13821
13822 default: {
13823 int n = ((eType-12) / 2);
13824 if( eType % 2 ){
13825 switch( enc ){
13826 #ifndef SQLITE_OMIT_UTF16
13827 case SQLITE_UTF16BE:
13828 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
13829 break;
13830 case SQLITE_UTF16LE:
13831 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
13832 break;
13833 #endif
13834 default:
13835 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
13836 break;
13837 }
13838 }else{
13839 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
13840 }
13841 }
13842 }
13843 }
13844 }
13845
13846 /*
13847 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
13848 */
13849 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
13850 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
13851 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
13852
13853 pCsr->iRowid++;
13854 while( 1 ){
13855 int rc;
13856 int iOff = (pCsr->iPgno==1 ? 100 : 0);
13857 int bNextPage = 0;
13858
13859 if( pCsr->aPage==0 ){
13860 while( 1 ){
13861 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
13862 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
13863 if( rc!=SQLITE_OK ) return rc;
13864 if( pCsr->aPage && pCsr->nPage>=256 ) break;
13865 sqlite3_free(pCsr->aPage);
13866 pCsr->aPage = 0;
13867 if( pCsr->bOnePage ) return SQLITE_OK;
13868 pCsr->iPgno++;
13869 }
13870
13871 assert( iOff+3+2<=pCsr->nPage );
13872 pCsr->iCell = pTab->bPtr ? -2 : 0;
13873 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
13874 }
13875
13876 if( pTab->bPtr ){
13877 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
13878 pCsr->iCell = pCsr->nCell;
13879 }
13880 pCsr->iCell++;
13881 if( pCsr->iCell>=pCsr->nCell ){
13882 sqlite3_free(pCsr->aPage);
13883 pCsr->aPage = 0;
13884 if( pCsr->bOnePage ) return SQLITE_OK;
13885 pCsr->iPgno++;
13886 }else{
13887 return SQLITE_OK;
13888 }
13889 }else{
13890 /* If there is no record loaded, load it now. */
13891 if( pCsr->pRec==0 ){
13892 int bHasRowid = 0;
13893 int nPointer = 0;
13894 sqlite3_int64 nPayload = 0;
13895 sqlite3_int64 nHdr = 0;
13896 int iHdr;
13897 int U, X;
13898 int nLocal;
13899
13900 switch( pCsr->aPage[iOff] ){
13901 case 0x02:
13902 nPointer = 4;
13903 break;
13904 case 0x0a:
13905 break;
13906 case 0x0d:
13907 bHasRowid = 1;
13908 break;
13909 default:
13910 /* This is not a b-tree page with records on it. Continue. */
13911 pCsr->iCell = pCsr->nCell;
13912 break;
13913 }
13914
13915 if( pCsr->iCell>=pCsr->nCell ){
13916 bNextPage = 1;
13917 }else{
13918
13919 iOff += 8 + nPointer + pCsr->iCell*2;
13920 if( iOff>pCsr->nPage ){
13921 bNextPage = 1;
13922 }else{
13923 iOff = get_uint16(&pCsr->aPage[iOff]);
13924 }
13925
13926 /* For an interior node cell, skip past the child-page number */
13927 iOff += nPointer;
13928
13929 /* Load the "byte of payload including overflow" field */
13930 if( bNextPage || iOff>pCsr->nPage ){
13931 bNextPage = 1;
13932 }else{
13933 iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
13934 }
13935
13936 /* If this is a leaf intkey cell, load the rowid */
13937 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
13938 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
13939 }
13940
13941 /* Figure out how much data to read from the local page */
13942 U = pCsr->nPage;
13943 if( bHasRowid ){
13944 X = U-35;
13945 }else{
13946 X = ((U-12)*64/255)-23;
13947 }
13948 if( nPayload<=X ){
13949 nLocal = nPayload;
13950 }else{
13951 int M, K;
13952 M = ((U-12)*32/255)-23;
13953 K = M+((nPayload-M)%(U-4));
13954 if( K<=X ){
13955 nLocal = K;
13956 }else{
13957 nLocal = M;
13958 }
13959 }
13960
13961 if( bNextPage || nLocal+iOff>pCsr->nPage ){
13962 bNextPage = 1;
13963 }else{
13964
13965 /* Allocate space for payload. And a bit more to catch small buffer
13966 ** overruns caused by attempting to read a varint or similar from
13967 ** near the end of a corrupt record. */
13968 pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
13969 if( pCsr->pRec==0 ) return SQLITE_NOMEM;
13970 memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
13971 pCsr->nRec = nPayload;
13972
13973 /* Load the nLocal bytes of payload */
13974 memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
13975 iOff += nLocal;
13976
13977 /* Load content from overflow pages */
13978 if( nPayload>nLocal ){
13979 sqlite3_int64 nRem = nPayload - nLocal;
13980 u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
13981 while( nRem>0 ){
13982 u8 *aOvfl = 0;
13983 int nOvfl = 0;
13984 int nCopy;
13985 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
13986 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
13987 if( rc!=SQLITE_OK ) return rc;
13988 if( aOvfl==0 ) break;
13989
13990 nCopy = U-4;
13991 if( nCopy>nRem ) nCopy = nRem;
13992 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
13993 nRem -= nCopy;
13994
13995 pgnoOvfl = get_uint32(aOvfl);
13996 sqlite3_free(aOvfl);
13997 }
13998 }
13999
14000 iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr);
14001 if( nHdr>nPayload ) nHdr = 0;
14002 pCsr->nHdr = nHdr;
14003 pCsr->pHdrPtr = &pCsr->pRec[iHdr];
14004 pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
14005 pCsr->iField = (bHasRowid ? -1 : 0);
14006 }
14007 }
14008 }else{
14009 pCsr->iField++;
14010 if( pCsr->iField>0 ){
14011 sqlite3_int64 iType;
14012 if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
14013 bNextPage = 1;
14014 }else{
14015 int szField = 0;
14016 pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
14017 szField = dbdataValueBytes(iType);
14018 if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))<szField ){
14019 pCsr->pPtr = &pCsr->pRec[pCsr->nRec];
14020 }else{
14021 pCsr->pPtr += szField;
14022 }
14023 }
14024 }
14025 }
14026
14027 if( bNextPage ){
14028 sqlite3_free(pCsr->aPage);
14029 sqlite3_free(pCsr->pRec);
14030 pCsr->aPage = 0;
14031 pCsr->pRec = 0;
14032 if( pCsr->bOnePage ) return SQLITE_OK;
14033 pCsr->iPgno++;
14034 }else{
14035 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
14036 return SQLITE_OK;
14037 }
14038
14039 /* Advance to the next cell. The next iteration of the loop will load
14040 ** the record and so on. */
14041 sqlite3_free(pCsr->pRec);
14042 pCsr->pRec = 0;
14043 pCsr->iCell++;
14044 }
14045 }
14046 }
14047
14048 assert( !"can't get here" );
14049 return SQLITE_OK;
14050 }
14051
14052 /*
14053 ** Return true if the cursor is at EOF.
14054 */
14055 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
14056 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14057 return pCsr->aPage==0;
14058 }
14059
14060 /*
14061 ** Return true if nul-terminated string zSchema ends in "()". Or false
14062 ** otherwise.
14063 */
14064 static int dbdataIsFunction(const char *zSchema){
14065 size_t n = strlen(zSchema);
14066 if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
14067 return (int)n-2;
14068 }
14069 return 0;
14070 }
14071
14072 /*
14073 ** Determine the size in pages of database zSchema (where zSchema is
14074 ** "main", "temp" or the name of an attached database) and set
14075 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
14076 ** an SQLite error code.
14077 */
14078 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
14079 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
14080 char *zSql = 0;
14081 int rc, rc2;
14082 int nFunc = 0;
14083 sqlite3_stmt *pStmt = 0;
14084
14085 if( (nFunc = dbdataIsFunction(zSchema))>0 ){
14086 zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
14087 }else{
14088 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
14089 }
14090 if( zSql==0 ) return SQLITE_NOMEM;
14091
14092 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
14093 sqlite3_free(zSql);
14094 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
14095 pCsr->szDb = sqlite3_column_int(pStmt, 0);
14096 }
14097 rc2 = sqlite3_finalize(pStmt);
14098 if( rc==SQLITE_OK ) rc = rc2;
14099 return rc;
14100 }
14101
14102 /*
14103 ** Attempt to figure out the encoding of the database by retrieving page 1
14104 ** and inspecting the header field. If successful, set the pCsr->enc variable
14105 ** and return SQLITE_OK. Otherwise, return an SQLite error code.
14106 */
14107 static int dbdataGetEncoding(DbdataCursor *pCsr){
14108 int rc = SQLITE_OK;
14109 int nPg1 = 0;
14110 u8 *aPg1 = 0;
14111 rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
14112 if( rc==SQLITE_OK && nPg1>=(56+4) ){
14113 pCsr->enc = get_uint32(&aPg1[56]);
14114 }
14115 sqlite3_free(aPg1);
14116 return rc;
14117 }
14118
14119
14120 /*
14121 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
14122 */
14123 static int dbdataFilter(
14124 sqlite3_vtab_cursor *pCursor,
14125 int idxNum, const char *idxStr,
14126 int argc, sqlite3_value **argv
14127 ){
14128 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14129 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
14130 int rc = SQLITE_OK;
14131 const char *zSchema = "main";
14132 (void)idxStr;
14133 (void)argc;
14134
14135 dbdataResetCursor(pCsr);
14136 assert( pCsr->iPgno==1 );
14137 if( idxNum & 0x01 ){
14138 zSchema = (const char*)sqlite3_value_text(argv[0]);
14139 if( zSchema==0 ) zSchema = "";
14140 }
14141 if( idxNum & 0x02 ){
14142 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
14143 pCsr->bOnePage = 1;
14144 }else{
14145 rc = dbdataDbsize(pCsr, zSchema);
14146 }
14147
14148 if( rc==SQLITE_OK ){
14149 int nFunc = 0;
14150 if( pTab->pStmt ){
14151 pCsr->pStmt = pTab->pStmt;
14152 pTab->pStmt = 0;
14153 }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
14154 char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
14155 if( zSql==0 ){
14156 rc = SQLITE_NOMEM;
14157 }else{
14158 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
14159 sqlite3_free(zSql);
14160 }
14161 }else{
14162 rc = sqlite3_prepare_v2(pTab->db,
14163 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
14164 &pCsr->pStmt, 0
14165 );
14166 }
14167 }
14168 if( rc==SQLITE_OK ){
14169 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
14170 }
14171
14172 /* Try to determine the encoding of the db by inspecting the header
14173 ** field on page 1. */
14174 if( rc==SQLITE_OK ){
14175 rc = dbdataGetEncoding(pCsr);
14176 }
14177
14178 if( rc!=SQLITE_OK ){
14179 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
14180 }
14181
14182 if( rc==SQLITE_OK ){
14183 rc = dbdataNext(pCursor);
14184 }
14185 return rc;
14186 }
14187
14188 /*
14189 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
14190 */
14191 static int dbdataColumn(
14192 sqlite3_vtab_cursor *pCursor,
14193 sqlite3_context *ctx,
14194 int i
14195 ){
14196 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14197 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
14198 if( pTab->bPtr ){
14199 switch( i ){
14200 case DBPTR_COLUMN_PGNO:
14201 sqlite3_result_int64(ctx, pCsr->iPgno);
14202 break;
14203 case DBPTR_COLUMN_CHILD: {
14204 int iOff = pCsr->iPgno==1 ? 100 : 0;
14205 if( pCsr->iCell<0 ){
14206 iOff += 8;
14207 }else{
14208 iOff += 12 + pCsr->iCell*2;
14209 if( iOff>pCsr->nPage ) return SQLITE_OK;
14210 iOff = get_uint16(&pCsr->aPage[iOff]);
14211 }
14212 if( iOff<=pCsr->nPage ){
14213 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
14214 }
14215 break;
14216 }
14217 }
14218 }else{
14219 switch( i ){
14220 case DBDATA_COLUMN_PGNO:
14221 sqlite3_result_int64(ctx, pCsr->iPgno);
14222 break;
14223 case DBDATA_COLUMN_CELL:
14224 sqlite3_result_int(ctx, pCsr->iCell);
14225 break;
14226 case DBDATA_COLUMN_FIELD:
14227 sqlite3_result_int(ctx, pCsr->iField);
14228 break;
14229 case DBDATA_COLUMN_VALUE: {
14230 if( pCsr->iField<0 ){
14231 sqlite3_result_int64(ctx, pCsr->iIntkey);
14232 }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){
14233 sqlite3_int64 iType;
14234 dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
14235 dbdataValue(
14236 ctx, pCsr->enc, iType, pCsr->pPtr,
14237 &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
14238 );
14239 }
14240 break;
14241 }
14242 }
14243 }
14244 return SQLITE_OK;
14245 }
14246
14247 /*
14248 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
14249 */
14250 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
14251 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14252 *pRowid = pCsr->iRowid;
14253 return SQLITE_OK;
14254 }
14255
14256
14257 /*
14258 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
14259 */
14260 static int sqlite3DbdataRegister(sqlite3 *db){
14261 static sqlite3_module dbdata_module = {
14262 0, /* iVersion */
14263 0, /* xCreate */
14264 dbdataConnect, /* xConnect */
14265 dbdataBestIndex, /* xBestIndex */
14266 dbdataDisconnect, /* xDisconnect */
14267 0, /* xDestroy */
14268 dbdataOpen, /* xOpen - open a cursor */
14269 dbdataClose, /* xClose - close a cursor */
14270 dbdataFilter, /* xFilter - configure scan constraints */
14271 dbdataNext, /* xNext - advance a cursor */
14272 dbdataEof, /* xEof - check for end of scan */
14273 dbdataColumn, /* xColumn - read data */
14274 dbdataRowid, /* xRowid - read data */
14275 0, /* xUpdate */
14276 0, /* xBegin */
14277 0, /* xSync */
14278 0, /* xCommit */
14279 0, /* xRollback */
14280 0, /* xFindMethod */
14281 0, /* xRename */
14282 0, /* xSavepoint */
14283 0, /* xRelease */
14284 0, /* xRollbackTo */
14285 0 /* xShadowName */
14286 };
14287
14288 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
14289 if( rc==SQLITE_OK ){
14290 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
14291 }
14292 return rc;
14293 }
14294
14295 int sqlite3_dbdata_init(
14296 sqlite3 *db,
14297 char **pzErrMsg,
14298 const sqlite3_api_routines *pApi
14299 ){
14300 (void)pzErrMsg;
14301 return sqlite3DbdataRegister(db);
14302 }
14303
14304 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
14305
14306 /************************* End ../ext/recover/dbdata.c ********************/
14307 /************************* Begin ../ext/recover/sqlite3recover.c ******************/
14308 /*
14309 ** 2022-08-27
14310 **
14311 ** The author disclaims copyright to this source code. In place of
14312 ** a legal notice, here is a blessing:
14313 **
14314 ** May you do good and not evil.
14315 ** May you find forgiveness for yourself and forgive others.
14316 ** May you share freely, never taking more than you give.
14317 **
14318 *************************************************************************
14319 **
14320 */
14321
14322
14323 /* #include "sqlite3recover.h" */
14324 #include <assert.h>
14325 #include <string.h>
14326
14327 #ifndef SQLITE_OMIT_VIRTUALTABLE
14328
14329 /*
14330 ** Declaration for public API function in file dbdata.c. This may be called
14331 ** with NULL as the final two arguments to register the sqlite_dbptr and
14332 ** sqlite_dbdata virtual tables with a database handle.
14333 */
14334 #ifdef _WIN32
14335
14336 #endif
14337 int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
14338
14339 /* typedef unsigned int u32; */
14340 /* typedef unsigned char u8; */
14341 /* typedef sqlite3_int64 i64; */
14342
14343 typedef struct RecoverTable RecoverTable;
14344 typedef struct RecoverColumn RecoverColumn;
14345
14346 /*
14347 ** When recovering rows of data that can be associated with table
14348 ** definitions recovered from the sqlite_schema table, each table is
14349 ** represented by an instance of the following object.
14350 **
14351 ** iRoot:
14352 ** The root page in the original database. Not necessarily (and usually
14353 ** not) the same in the recovered database.
14354 **
14355 ** zTab:
14356 ** Name of the table.
14357 **
14358 ** nCol/aCol[]:
14359 ** aCol[] is an array of nCol columns. In the order in which they appear
14360 ** in the table.
14361 **
14362 ** bIntkey:
14363 ** Set to true for intkey tables, false for WITHOUT ROWID.
14364 **
14365 ** iRowidBind:
14366 ** Each column in the aCol[] array has associated with it the index of
14367 ** the bind parameter its values will be bound to in the INSERT statement
14368 ** used to construct the output database. If the table does has a rowid
14369 ** but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
14370 ** index of the bind paramater to which the rowid value should be bound.
14371 ** Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY
14372 ** KEY column, then the rowid value should be bound to the index associated
14373 ** with the column.
14374 **
14375 ** pNext:
14376 ** All RecoverTable objects used by the recovery operation are allocated
14377 ** and populated as part of creating the recovered database schema in
14378 ** the output database, before any non-schema data are recovered. They
14379 ** are then stored in a singly-linked list linked by this variable beginning
14380 ** at sqlite3_recover.pTblList.
14381 */
14382 struct RecoverTable {
14383 u32 iRoot; /* Root page in original database */
14384 char *zTab; /* Name of table */
14385 int nCol; /* Number of columns in table */
14386 RecoverColumn *aCol; /* Array of columns */
14387 int bIntkey; /* True for intkey, false for without rowid */
14388 int iRowidBind; /* If >0, bind rowid to INSERT here */
14389 RecoverTable *pNext;
14390 };
14391
14392 /*
14393 ** Each database column is represented by an instance of the following object
14394 ** stored in the RecoverTable.aCol[] array of the associated table.
14395 **
14396 ** iField:
14397 ** The index of the associated field within database records. Or -1 if
14398 ** there is no associated field (e.g. for virtual generated columns).
14399 **
14400 ** iBind:
14401 ** The bind index of the INSERT statement to bind this columns values
14402 ** to. Or 0 if there is no such index (iff (iField<0)).
14403 **
14404 ** bIPK:
14405 ** True if this is the INTEGER PRIMARY KEY column.
14406 **
14407 ** zCol:
14408 ** Name of column.
14409 **
14410 ** eHidden:
14411 ** A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
14412 */
14413 struct RecoverColumn {
14414 int iField; /* Field in record on disk */
14415 int iBind; /* Binding to use in INSERT */
14416 int bIPK; /* True for IPK column */
14417 char *zCol;
14418 int eHidden;
14419 };
14420
14421 #define RECOVER_EHIDDEN_NONE 0 /* Normal database column */
14422 #define RECOVER_EHIDDEN_HIDDEN 1 /* Column is __HIDDEN__ */
14423 #define RECOVER_EHIDDEN_VIRTUAL 2 /* Virtual generated column */
14424 #define RECOVER_EHIDDEN_STORED 3 /* Stored generated column */
14425
14426 /*
14427 ** Bitmap object used to track pages in the input database. Allocated
14428 ** and manipulated only by the following functions:
14429 **
14430 ** recoverBitmapAlloc()
14431 ** recoverBitmapFree()
14432 ** recoverBitmapSet()
14433 ** recoverBitmapQuery()
14434 **
14435 ** nPg:
14436 ** Largest page number that may be stored in the bitmap. The range
14437 ** of valid keys is 1 to nPg, inclusive.
14438 **
14439 ** aElem[]:
14440 ** Array large enough to contain a bit for each key. For key value
14441 ** iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
14442 ** In other words, the following is true if bit iKey is set, or
14443 ** false if it is clear:
14444 **
14445 ** (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
14446 */
14447 typedef struct RecoverBitmap RecoverBitmap;
14448 struct RecoverBitmap {
14449 i64 nPg; /* Size of bitmap */
14450 u32 aElem[1]; /* Array of 32-bit bitmasks */
14451 };
14452
14453 /*
14454 ** State variables (part of the sqlite3_recover structure) used while
14455 ** recovering data for tables identified in the recovered schema (state
14456 ** RECOVER_STATE_WRITING).
14457 */
14458 typedef struct RecoverStateW1 RecoverStateW1;
14459 struct RecoverStateW1 {
14460 sqlite3_stmt *pTbls;
14461 sqlite3_stmt *pSel;
14462 sqlite3_stmt *pInsert;
14463 int nInsert;
14464
14465 RecoverTable *pTab; /* Table currently being written */
14466 int nMax; /* Max column count in any schema table */
14467 sqlite3_value **apVal; /* Array of nMax values */
14468 int nVal; /* Number of valid entries in apVal[] */
14469 int bHaveRowid;
14470 i64 iRowid;
14471 i64 iPrevPage;
14472 int iPrevCell;
14473 };
14474
14475 /*
14476 ** State variables (part of the sqlite3_recover structure) used while
14477 ** recovering data destined for the lost and found table (states
14478 ** RECOVER_STATE_LOSTANDFOUND[123]).
14479 */
14480 typedef struct RecoverStateLAF RecoverStateLAF;
14481 struct RecoverStateLAF {
14482 RecoverBitmap *pUsed;
14483 i64 nPg; /* Size of db in pages */
14484 sqlite3_stmt *pAllAndParent;
14485 sqlite3_stmt *pMapInsert;
14486 sqlite3_stmt *pMaxField;
14487 sqlite3_stmt *pUsedPages;
14488 sqlite3_stmt *pFindRoot;
14489 sqlite3_stmt *pInsert; /* INSERT INTO lost_and_found ... */
14490 sqlite3_stmt *pAllPage;
14491 sqlite3_stmt *pPageData;
14492 sqlite3_value **apVal;
14493 int nMaxField;
14494 };
14495
14496 /*
14497 ** Main recover handle structure.
14498 */
14499 struct sqlite3_recover {
14500 /* Copies of sqlite3_recover_init[_sql]() parameters */
14501 sqlite3 *dbIn; /* Input database */
14502 char *zDb; /* Name of input db ("main" etc.) */
14503 char *zUri; /* URI for output database */
14504 void *pSqlCtx; /* SQL callback context */
14505 int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
14506
14507 /* Values configured by sqlite3_recover_config() */
14508 char *zStateDb; /* State database to use (or NULL) */
14509 char *zLostAndFound; /* Name of lost-and-found table (or NULL) */
14510 int bFreelistCorrupt; /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
14511 int bRecoverRowid; /* SQLITE_RECOVER_ROWIDS setting */
14512 int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */
14513
14514 int pgsz;
14515 int detected_pgsz;
14516 int nReserve;
14517 u8 *pPage1Disk;
14518 u8 *pPage1Cache;
14519
14520 /* Error code and error message */
14521 int errCode; /* For sqlite3_recover_errcode() */
14522 char *zErrMsg; /* For sqlite3_recover_errmsg() */
14523
14524 int eState;
14525 int bCloseTransaction;
14526
14527 /* Variables used with eState==RECOVER_STATE_WRITING */
14528 RecoverStateW1 w1;
14529
14530 /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
14531 RecoverStateLAF laf;
14532
14533 /* Fields used within sqlite3_recover_run() */
14534 sqlite3 *dbOut; /* Output database */
14535 sqlite3_stmt *pGetPage; /* SELECT against input db sqlite_dbdata */
14536 RecoverTable *pTblList; /* List of tables recovered from schema */
14537 };
14538
14539 /*
14540 ** The various states in which an sqlite3_recover object may exist:
14541 **
14542 ** RECOVER_STATE_INIT:
14543 ** The object is initially created in this state. sqlite3_recover_step()
14544 ** has yet to be called. This is the only state in which it is permitted
14545 ** to call sqlite3_recover_config().
14546 **
14547 ** RECOVER_STATE_WRITING:
14548 **
14549 ** RECOVER_STATE_LOSTANDFOUND1:
14550 ** State to populate the bitmap of pages used by other tables or the
14551 ** database freelist.
14552 **
14553 ** RECOVER_STATE_LOSTANDFOUND2:
14554 ** Populate the recovery.map table - used to figure out a "root" page
14555 ** for each lost page from in the database from which records are
14556 ** extracted.
14557 **
14558 ** RECOVER_STATE_LOSTANDFOUND3:
14559 ** Populate the lost-and-found table itself.
14560 */
14561 #define RECOVER_STATE_INIT 0
14562 #define RECOVER_STATE_WRITING 1
14563 #define RECOVER_STATE_LOSTANDFOUND1 2
14564 #define RECOVER_STATE_LOSTANDFOUND2 3
14565 #define RECOVER_STATE_LOSTANDFOUND3 4
14566 #define RECOVER_STATE_SCHEMA2 5
14567 #define RECOVER_STATE_DONE 6
14568
14569
14570 /*
14571 ** Global variables used by this extension.
14572 */
14573 typedef struct RecoverGlobal RecoverGlobal;
14574 struct RecoverGlobal {
14575 const sqlite3_io_methods *pMethods;
14576 sqlite3_recover *p;
14577 };
14578 static RecoverGlobal recover_g;
14579
14580 /*
14581 ** Use this static SQLite mutex to protect the globals during the
14582 ** first call to sqlite3_recover_step().
14583 */
14584 #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
14585
14586
14587 /*
14588 ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
14589 */
14590 #define RECOVER_ROWID_DEFAULT 1
14591
14592 /*
14593 ** Mutex handling:
14594 **
14595 ** recoverEnterMutex() - Enter the recovery mutex
14596 ** recoverLeaveMutex() - Leave the recovery mutex
14597 ** recoverAssertMutexHeld() - Assert that the recovery mutex is held
14598 */
14599 #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
14600 # define recoverEnterMutex()
14601 # define recoverLeaveMutex()
14602 #else
14603 static void recoverEnterMutex(void){
14604 sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
14605 }
14606 static void recoverLeaveMutex(void){
14607 sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
14608 }
14609 #endif
14610 #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
14611 static void recoverAssertMutexHeld(void){
14612 assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
14613 }
14614 #else
14615 # define recoverAssertMutexHeld()
14616 #endif
14617
14618
14619 /*
14620 ** Like strlen(). But handles NULL pointer arguments.
14621 */
14622 static int recoverStrlen(const char *zStr){
14623 if( zStr==0 ) return 0;
14624 return (int)(strlen(zStr)&0x7fffffff);
14625 }
14626
14627 /*
14628 ** This function is a no-op if the recover handle passed as the first
14629 ** argument already contains an error (if p->errCode!=SQLITE_OK).
14630 **
14631 ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
14632 ** bytes in size. If successful, a pointer to the new buffer is returned. Or,
14633 ** if an OOM error occurs, NULL is returned and the handle error code
14634 ** (p->errCode) set to SQLITE_NOMEM.
14635 */
14636 static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
14637 void *pRet = 0;
14638 assert( nByte>0 );
14639 if( p->errCode==SQLITE_OK ){
14640 pRet = sqlite3_malloc64(nByte);
14641 if( pRet ){
14642 memset(pRet, 0, nByte);
14643 }else{
14644 p->errCode = SQLITE_NOMEM;
14645 }
14646 }
14647 return pRet;
14648 }
14649
14650 /*
14651 ** Set the error code and error message for the recover handle passed as
14652 ** the first argument. The error code is set to the value of parameter
14653 ** errCode.
14654 **
14655 ** Parameter zFmt must be a printf() style formatting string. The handle
14656 ** error message is set to the result of using any trailing arguments for
14657 ** parameter substitutions in the formatting string.
14658 **
14659 ** For example:
14660 **
14661 ** recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
14662 */
14663 static int recoverError(
14664 sqlite3_recover *p,
14665 int errCode,
14666 const char *zFmt, ...
14667 ){
14668 char *z = 0;
14669 va_list ap;
14670 va_start(ap, zFmt);
14671 if( zFmt ){
14672 z = sqlite3_vmprintf(zFmt, ap);
14673 va_end(ap);
14674 }
14675 sqlite3_free(p->zErrMsg);
14676 p->zErrMsg = z;
14677 p->errCode = errCode;
14678 return errCode;
14679 }
14680
14681
14682 /*
14683 ** This function is a no-op if p->errCode is initially other than SQLITE_OK.
14684 ** In this case it returns NULL.
14685 **
14686 ** Otherwise, an attempt is made to allocate and return a bitmap object
14687 ** large enough to store a bit for all page numbers between 1 and nPg,
14688 ** inclusive. The bitmap is initially zeroed.
14689 */
14690 static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
14691 int nElem = (nPg+1+31) / 32;
14692 int nByte = sizeof(RecoverBitmap) + nElem*sizeof(u32);
14693 RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
14694
14695 if( pRet ){
14696 pRet->nPg = nPg;
14697 }
14698 return pRet;
14699 }
14700
14701 /*
14702 ** Free a bitmap object allocated by recoverBitmapAlloc().
14703 */
14704 static void recoverBitmapFree(RecoverBitmap *pMap){
14705 sqlite3_free(pMap);
14706 }
14707
14708 /*
14709 ** Set the bit associated with page iPg in bitvec pMap.
14710 */
14711 static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
14712 if( iPg<=pMap->nPg ){
14713 int iElem = (iPg / 32);
14714 int iBit = (iPg % 32);
14715 pMap->aElem[iElem] |= (((u32)1) << iBit);
14716 }
14717 }
14718
14719 /*
14720 ** Query bitmap object pMap for the state of the bit associated with page
14721 ** iPg. Return 1 if it is set, or 0 otherwise.
14722 */
14723 static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
14724 int ret = 1;
14725 if( iPg<=pMap->nPg && iPg>0 ){
14726 int iElem = (iPg / 32);
14727 int iBit = (iPg % 32);
14728 ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
14729 }
14730 return ret;
14731 }
14732
14733 /*
14734 ** Set the recover handle error to the error code and message returned by
14735 ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
14736 ** handle db.
14737 */
14738 static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
14739 return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
14740 }
14741
14742 /*
14743 ** This function is a no-op if recover handle p already contains an error
14744 ** (if p->errCode!=SQLITE_OK).
14745 **
14746 ** Otherwise, it attempts to prepare the SQL statement in zSql against
14747 ** database handle db. If successful, the statement handle is returned.
14748 ** Or, if an error occurs, NULL is returned and an error left in the
14749 ** recover handle.
14750 */
14751 static sqlite3_stmt *recoverPrepare(
14752 sqlite3_recover *p,
14753 sqlite3 *db,
14754 const char *zSql
14755 ){
14756 sqlite3_stmt *pStmt = 0;
14757 if( p->errCode==SQLITE_OK ){
14758 if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
14759 recoverDbError(p, db);
14760 }
14761 }
14762 return pStmt;
14763 }
14764
14765 /*
14766 ** This function is a no-op if recover handle p already contains an error
14767 ** (if p->errCode!=SQLITE_OK).
14768 **
14769 ** Otherwise, argument zFmt is used as a printf() style format string,
14770 ** along with any trailing arguments, to create an SQL statement. This
14771 ** SQL statement is prepared against database handle db and, if successful,
14772 ** the statment handle returned. Or, if an error occurs - either during
14773 ** the printf() formatting or when preparing the resulting SQL - an
14774 ** error code and message are left in the recover handle.
14775 */
14776 static sqlite3_stmt *recoverPreparePrintf(
14777 sqlite3_recover *p,
14778 sqlite3 *db,
14779 const char *zFmt, ...
14780 ){
14781 sqlite3_stmt *pStmt = 0;
14782 if( p->errCode==SQLITE_OK ){
14783 va_list ap;
14784 char *z;
14785 va_start(ap, zFmt);
14786 z = sqlite3_vmprintf(zFmt, ap);
14787 va_end(ap);
14788 if( z==0 ){
14789 p->errCode = SQLITE_NOMEM;
14790 }else{
14791 pStmt = recoverPrepare(p, db, z);
14792 sqlite3_free(z);
14793 }
14794 }
14795 return pStmt;
14796 }
14797
14798 /*
14799 ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset()
14800 ** indicates that an error occurred, and there is not already an error
14801 ** in the recover handle passed as the first argument, set the error
14802 ** code and error message appropriately.
14803 **
14804 ** This function returns a copy of the statement handle pointer passed
14805 ** as the second argument.
14806 */
14807 static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
14808 int rc = sqlite3_reset(pStmt);
14809 if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
14810 recoverDbError(p, sqlite3_db_handle(pStmt));
14811 }
14812 return pStmt;
14813 }
14814
14815 /*
14816 ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset()
14817 ** indicates that an error occurred, and there is not already an error
14818 ** in the recover handle passed as the first argument, set the error
14819 ** code and error message appropriately.
14820 */
14821 static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
14822 sqlite3 *db = sqlite3_db_handle(pStmt);
14823 int rc = sqlite3_finalize(pStmt);
14824 if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
14825 recoverDbError(p, db);
14826 }
14827 }
14828
14829 /*
14830 ** This function is a no-op if recover handle p already contains an error
14831 ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this
14832 ** case.
14833 **
14834 ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
14835 ** Or, if an error occurs, leave an error code and message in the recover
14836 ** handle and return a copy of the error code.
14837 */
14838 static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
14839 if( p->errCode==SQLITE_OK ){
14840 int rc = sqlite3_exec(db, zSql, 0, 0, 0);
14841 if( rc ){
14842 recoverDbError(p, db);
14843 }
14844 }
14845 return p->errCode;
14846 }
14847
14848 /*
14849 ** Bind the value pVal to parameter iBind of statement pStmt. Leave an
14850 ** error in the recover handle passed as the first argument if an error
14851 ** (e.g. an OOM) occurs.
14852 */
14853 static void recoverBindValue(
14854 sqlite3_recover *p,
14855 sqlite3_stmt *pStmt,
14856 int iBind,
14857 sqlite3_value *pVal
14858 ){
14859 if( p->errCode==SQLITE_OK ){
14860 int rc = sqlite3_bind_value(pStmt, iBind, pVal);
14861 if( rc ) recoverError(p, rc, 0);
14862 }
14863 }
14864
14865 /*
14866 ** This function is a no-op if recover handle p already contains an error
14867 ** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
14868 **
14869 ** Otherwise, an attempt is made to interpret zFmt as a printf() style
14870 ** formatting string and the result of using the trailing arguments for
14871 ** parameter substitution with it written into a buffer obtained from
14872 ** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
14873 ** It is the responsibility of the caller to eventually free the buffer
14874 ** using sqlite3_free().
14875 **
14876 ** Or, if an error occurs, an error code and message is left in the recover
14877 ** handle and NULL returned.
14878 */
14879 static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
14880 va_list ap;
14881 char *z;
14882 va_start(ap, zFmt);
14883 z = sqlite3_vmprintf(zFmt, ap);
14884 va_end(ap);
14885 if( p->errCode==SQLITE_OK ){
14886 if( z==0 ) p->errCode = SQLITE_NOMEM;
14887 }else{
14888 sqlite3_free(z);
14889 z = 0;
14890 }
14891 return z;
14892 }
14893
14894 /*
14895 ** This function is a no-op if recover handle p already contains an error
14896 ** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
14897 **
14898 ** Otherwise, execute "PRAGMA page_count" against the input database. If
14899 ** successful, return the integer result. Or, if an error occurs, leave an
14900 ** error code and error message in the sqlite3_recover handle and return
14901 ** zero.
14902 */
14903 static i64 recoverPageCount(sqlite3_recover *p){
14904 i64 nPg = 0;
14905 if( p->errCode==SQLITE_OK ){
14906 sqlite3_stmt *pStmt = 0;
14907 pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
14908 if( pStmt ){
14909 sqlite3_step(pStmt);
14910 nPg = sqlite3_column_int64(pStmt, 0);
14911 }
14912 recoverFinalize(p, pStmt);
14913 }
14914 return nPg;
14915 }
14916
14917 /*
14918 ** Implementation of SQL scalar function "read_i32". The first argument to
14919 ** this function must be a blob. The second a non-negative integer. This
14920 ** function reads and returns a 32-bit big-endian integer from byte
14921 ** offset (4*<arg2>) of the blob.
14922 **
14923 ** SELECT read_i32(<blob>, <idx>)
14924 */
14925 static void recoverReadI32(
14926 sqlite3_context *context,
14927 int argc,
14928 sqlite3_value **argv
14929 ){
14930 const unsigned char *pBlob;
14931 int nBlob;
14932 int iInt;
14933
14934 assert( argc==2 );
14935 nBlob = sqlite3_value_bytes(argv[0]);
14936 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
14937 iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
14938
14939 if( (iInt+1)*4<=nBlob ){
14940 const unsigned char *a = &pBlob[iInt*4];
14941 i64 iVal = ((i64)a[0]<<24)
14942 + ((i64)a[1]<<16)
14943 + ((i64)a[2]<< 8)
14944 + ((i64)a[3]<< 0);
14945 sqlite3_result_int64(context, iVal);
14946 }
14947 }
14948
14949 /*
14950 ** Implementation of SQL scalar function "page_is_used". This function
14951 ** is used as part of the procedure for locating orphan rows for the
14952 ** lost-and-found table, and it depends on those routines having populated
14953 ** the sqlite3_recover.laf.pUsed variable.
14954 **
14955 ** The only argument to this function is a page-number. It returns true
14956 ** if the page has already been used somehow during data recovery, or false
14957 ** otherwise.
14958 **
14959 ** SELECT page_is_used(<pgno>);
14960 */
14961 static void recoverPageIsUsed(
14962 sqlite3_context *pCtx,
14963 int nArg,
14964 sqlite3_value **apArg
14965 ){
14966 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
14967 i64 pgno = sqlite3_value_int64(apArg[0]);
14968 assert( nArg==1 );
14969 sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
14970 }
14971
14972 /*
14973 ** The implementation of a user-defined SQL function invoked by the
14974 ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
14975 ** of the database being recovered.
14976 **
14977 ** This function always takes a single integer argument. If the argument
14978 ** is zero, then the value returned is the number of pages in the db being
14979 ** recovered. If the argument is greater than zero, it is a page number.
14980 ** The value returned in this case is an SQL blob containing the data for
14981 ** the identified page of the db being recovered. e.g.
14982 **
14983 ** SELECT getpage(0); -- return number of pages in db
14984 ** SELECT getpage(4); -- return page 4 of db as a blob of data
14985 */
14986 static void recoverGetPage(
14987 sqlite3_context *pCtx,
14988 int nArg,
14989 sqlite3_value **apArg
14990 ){
14991 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
14992 i64 pgno = sqlite3_value_int64(apArg[0]);
14993 sqlite3_stmt *pStmt = 0;
14994
14995 assert( nArg==1 );
14996 if( pgno==0 ){
14997 i64 nPg = recoverPageCount(p);
14998 sqlite3_result_int64(pCtx, nPg);
14999 return;
15000 }else{
15001 if( p->pGetPage==0 ){
15002 pStmt = p->pGetPage = recoverPreparePrintf(
15003 p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
15004 );
15005 }else if( p->errCode==SQLITE_OK ){
15006 pStmt = p->pGetPage;
15007 }
15008
15009 if( pStmt ){
15010 sqlite3_bind_int64(pStmt, 1, pgno);
15011 if( SQLITE_ROW==sqlite3_step(pStmt) ){
15012 const u8 *aPg;
15013 int nPg;
15014 assert( p->errCode==SQLITE_OK );
15015 aPg = sqlite3_column_blob(pStmt, 0);
15016 nPg = sqlite3_column_bytes(pStmt, 0);
15017 if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
15018 aPg = p->pPage1Disk;
15019 }
15020 sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
15021 }
15022 recoverReset(p, pStmt);
15023 }
15024 }
15025
15026 if( p->errCode ){
15027 if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
15028 sqlite3_result_error_code(pCtx, p->errCode);
15029 }
15030 }
15031
15032 /*
15033 ** Find a string that is not found anywhere in z[]. Return a pointer
15034 ** to that string.
15035 **
15036 ** Try to use zA and zB first. If both of those are already found in z[]
15037 ** then make up some string and store it in the buffer zBuf.
15038 */
15039 static const char *recoverUnusedString(
15040 const char *z, /* Result must not appear anywhere in z */
15041 const char *zA, const char *zB, /* Try these first */
15042 char *zBuf /* Space to store a generated string */
15043 ){
15044 unsigned i = 0;
15045 if( strstr(z, zA)==0 ) return zA;
15046 if( strstr(z, zB)==0 ) return zB;
15047 do{
15048 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
15049 }while( strstr(z,zBuf)!=0 );
15050 return zBuf;
15051 }
15052
15053 /*
15054 ** Implementation of scalar SQL function "escape_crnl". The argument passed to
15055 ** this function is the output of built-in function quote(). If the first
15056 ** character of the input is "'", indicating that the value passed to quote()
15057 ** was a text value, then this function searches the input for "\n" and "\r"
15058 ** characters and adds a wrapper similar to the following:
15059 **
15060 ** replace(replace(<input>, '\n', char(10), '\r', char(13));
15061 **
15062 ** Or, if the first character of the input is not "'", then a copy of the input
15063 ** is returned.
15064 */
15065 static void recoverEscapeCrnl(
15066 sqlite3_context *context,
15067 int argc,
15068 sqlite3_value **argv
15069 ){
15070 const char *zText = (const char*)sqlite3_value_text(argv[0]);
15071 (void)argc;
15072 if( zText && zText[0]=='\'' ){
15073 int nText = sqlite3_value_bytes(argv[0]);
15074 int i;
15075 char zBuf1[20];
15076 char zBuf2[20];
15077 const char *zNL = 0;
15078 const char *zCR = 0;
15079 int nCR = 0;
15080 int nNL = 0;
15081
15082 for(i=0; zText[i]; i++){
15083 if( zNL==0 && zText[i]=='\n' ){
15084 zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
15085 nNL = (int)strlen(zNL);
15086 }
15087 if( zCR==0 && zText[i]=='\r' ){
15088 zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
15089 nCR = (int)strlen(zCR);
15090 }
15091 }
15092
15093 if( zNL || zCR ){
15094 int iOut = 0;
15095 i64 nMax = (nNL > nCR) ? nNL : nCR;
15096 i64 nAlloc = nMax * nText + (nMax+64)*2;
15097 char *zOut = (char*)sqlite3_malloc64(nAlloc);
15098 if( zOut==0 ){
15099 sqlite3_result_error_nomem(context);
15100 return;
15101 }
15102
15103 if( zNL && zCR ){
15104 memcpy(&zOut[iOut], "replace(replace(", 16);
15105 iOut += 16;
15106 }else{
15107 memcpy(&zOut[iOut], "replace(", 8);
15108 iOut += 8;
15109 }
15110 for(i=0; zText[i]; i++){
15111 if( zText[i]=='\n' ){
15112 memcpy(&zOut[iOut], zNL, nNL);
15113 iOut += nNL;
15114 }else if( zText[i]=='\r' ){
15115 memcpy(&zOut[iOut], zCR, nCR);
15116 iOut += nCR;
15117 }else{
15118 zOut[iOut] = zText[i];
15119 iOut++;
15120 }
15121 }
15122
15123 if( zNL ){
15124 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
15125 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
15126 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
15127 }
15128 if( zCR ){
15129 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
15130 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
15131 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
15132 }
15133
15134 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
15135 sqlite3_free(zOut);
15136 return;
15137 }
15138 }
15139
15140 sqlite3_result_value(context, argv[0]);
15141 }
15142
15143 /*
15144 ** This function is a no-op if recover handle p already contains an error
15145 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
15146 ** this case.
15147 **
15148 ** Otherwise, attempt to populate temporary table "recovery.schema" with the
15149 ** parts of the database schema that can be extracted from the input database.
15150 **
15151 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
15152 ** and error message are left in the recover handle and a copy of the
15153 ** error code returned. It is not considered an error if part of all of
15154 ** the database schema cannot be recovered due to corruption.
15155 */
15156 static int recoverCacheSchema(sqlite3_recover *p){
15157 return recoverExec(p, p->dbOut,
15158 "WITH RECURSIVE pages(p) AS ("
15159 " SELECT 1"
15160 " UNION"
15161 " SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
15162 ")"
15163 "INSERT INTO recovery.schema SELECT"
15164 " max(CASE WHEN field=0 THEN value ELSE NULL END),"
15165 " max(CASE WHEN field=1 THEN value ELSE NULL END),"
15166 " max(CASE WHEN field=2 THEN value ELSE NULL END),"
15167 " max(CASE WHEN field=3 THEN value ELSE NULL END),"
15168 " max(CASE WHEN field=4 THEN value ELSE NULL END)"
15169 "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
15170 " SELECT p FROM pages"
15171 ") GROUP BY pgno, cell"
15172 );
15173 }
15174
15175 /*
15176 ** If this recover handle is not in SQL callback mode (i.e. was not created
15177 ** using sqlite3_recover_init_sql()) of if an error has already occurred,
15178 ** this function is a no-op. Otherwise, issue a callback with SQL statement
15179 ** zSql as the parameter.
15180 **
15181 ** If the callback returns non-zero, set the recover handle error code to
15182 ** the value returned (so that the caller will abandon processing).
15183 */
15184 static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
15185 if( p->errCode==SQLITE_OK && p->xSql ){
15186 int res = p->xSql(p->pSqlCtx, zSql);
15187 if( res ){
15188 recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
15189 }
15190 }
15191 }
15192
15193 /*
15194 ** Transfer the following settings from the input database to the output
15195 ** database:
15196 **
15197 ** + page-size,
15198 ** + auto-vacuum settings,
15199 ** + database encoding,
15200 ** + user-version (PRAGMA user_version), and
15201 ** + application-id (PRAGMA application_id), and
15202 */
15203 static void recoverTransferSettings(sqlite3_recover *p){
15204 const char *aPragma[] = {
15205 "encoding",
15206 "page_size",
15207 "auto_vacuum",
15208 "user_version",
15209 "application_id"
15210 };
15211 int ii;
15212
15213 /* Truncate the output database to 0 pages in size. This is done by
15214 ** opening a new, empty, temp db, then using the backup API to clobber
15215 ** any existing output db with a copy of it. */
15216 if( p->errCode==SQLITE_OK ){
15217 sqlite3 *db2 = 0;
15218 int rc = sqlite3_open("", &db2);
15219 if( rc!=SQLITE_OK ){
15220 recoverDbError(p, db2);
15221 return;
15222 }
15223
15224 for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
15225 const char *zPrag = aPragma[ii];
15226 sqlite3_stmt *p1 = 0;
15227 p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
15228 if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
15229 const char *zArg = (const char*)sqlite3_column_text(p1, 0);
15230 char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
15231 recoverSqlCallback(p, z2);
15232 recoverExec(p, db2, z2);
15233 sqlite3_free(z2);
15234 if( zArg==0 ){
15235 recoverError(p, SQLITE_NOMEM, 0);
15236 }
15237 }
15238 recoverFinalize(p, p1);
15239 }
15240 recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
15241
15242 if( p->errCode==SQLITE_OK ){
15243 sqlite3 *db = p->dbOut;
15244 sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
15245 if( pBackup ){
15246 sqlite3_backup_step(pBackup, -1);
15247 p->errCode = sqlite3_backup_finish(pBackup);
15248 }else{
15249 recoverDbError(p, db);
15250 }
15251 }
15252
15253 sqlite3_close(db2);
15254 }
15255 }
15256
15257 /*
15258 ** This function is a no-op if recover handle p already contains an error
15259 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
15260 ** this case.
15261 **
15262 ** Otherwise, an attempt is made to open the output database, attach
15263 ** and create the schema of the temporary database used to store
15264 ** intermediate data, and to register all required user functions and
15265 ** virtual table modules with the output handle.
15266 **
15267 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
15268 ** and error message are left in the recover handle and a copy of the
15269 ** error code returned.
15270 */
15271 static int recoverOpenOutput(sqlite3_recover *p){
15272 struct Func {
15273 const char *zName;
15274 int nArg;
15275 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
15276 } aFunc[] = {
15277 { "getpage", 1, recoverGetPage },
15278 { "page_is_used", 1, recoverPageIsUsed },
15279 { "read_i32", 2, recoverReadI32 },
15280 { "escape_crnl", 1, recoverEscapeCrnl },
15281 };
15282
15283 const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
15284 sqlite3 *db = 0; /* New database handle */
15285 int ii; /* For iterating through aFunc[] */
15286
15287 assert( p->dbOut==0 );
15288
15289 if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
15290 recoverDbError(p, db);
15291 }
15292
15293 /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
15294 ** These two are registered with the output database handle - this
15295 ** module depends on the input handle supporting the sqlite_dbpage
15296 ** virtual table only. */
15297 if( p->errCode==SQLITE_OK ){
15298 p->errCode = sqlite3_dbdata_init(db, 0, 0);
15299 }
15300
15301 /* Register the custom user-functions with the output handle. */
15302 for(ii=0;
15303 p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
15304 ii++){
15305 p->errCode = sqlite3_create_function(db, aFunc[ii].zName,
15306 aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
15307 );
15308 }
15309
15310 p->dbOut = db;
15311 return p->errCode;
15312 }
15313
15314 /*
15315 ** Attach the auxiliary database 'recovery' to the output database handle.
15316 ** This temporary database is used during the recovery process and then
15317 ** discarded.
15318 */
15319 static void recoverOpenRecovery(sqlite3_recover *p){
15320 char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
15321 recoverExec(p, p->dbOut, zSql);
15322 recoverExec(p, p->dbOut,
15323 "PRAGMA writable_schema = 1;"
15324 "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);"
15325 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
15326 );
15327 sqlite3_free(zSql);
15328 }
15329
15330
15331 /*
15332 ** This function is a no-op if recover handle p already contains an error
15333 ** (if p->errCode!=SQLITE_OK).
15334 **
15335 ** Otherwise, argument zName must be the name of a table that has just been
15336 ** created in the output database. This function queries the output db
15337 ** for the schema of said table, and creates a RecoverTable object to
15338 ** store the schema in memory. The new RecoverTable object is linked into
15339 ** the list at sqlite3_recover.pTblList.
15340 **
15341 ** Parameter iRoot must be the root page of table zName in the INPUT
15342 ** database.
15343 */
15344 static void recoverAddTable(
15345 sqlite3_recover *p,
15346 const char *zName, /* Name of table created in output db */
15347 i64 iRoot /* Root page of same table in INPUT db */
15348 ){
15349 sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut,
15350 "PRAGMA table_xinfo(%Q)", zName
15351 );
15352
15353 if( pStmt ){
15354 int iPk = -1;
15355 int iBind = 1;
15356 RecoverTable *pNew = 0;
15357 int nCol = 0;
15358 int nName = recoverStrlen(zName);
15359 int nByte = 0;
15360 while( sqlite3_step(pStmt)==SQLITE_ROW ){
15361 nCol++;
15362 nByte += (sqlite3_column_bytes(pStmt, 1)+1);
15363 }
15364 nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
15365 recoverReset(p, pStmt);
15366
15367 pNew = recoverMalloc(p, nByte);
15368 if( pNew ){
15369 int i = 0;
15370 int iField = 0;
15371 char *csr = 0;
15372 pNew->aCol = (RecoverColumn*)&pNew[1];
15373 pNew->zTab = csr = (char*)&pNew->aCol[nCol];
15374 pNew->nCol = nCol;
15375 pNew->iRoot = iRoot;
15376 memcpy(csr, zName, nName);
15377 csr += nName+1;
15378
15379 for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
15380 int iPKF = sqlite3_column_int(pStmt, 5);
15381 int n = sqlite3_column_bytes(pStmt, 1);
15382 const char *z = (const char*)sqlite3_column_text(pStmt, 1);
15383 const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
15384 int eHidden = sqlite3_column_int(pStmt, 6);
15385
15386 if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
15387 if( iPKF>1 ) iPk = -2;
15388 pNew->aCol[i].zCol = csr;
15389 pNew->aCol[i].eHidden = eHidden;
15390 if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
15391 pNew->aCol[i].iField = -1;
15392 }else{
15393 pNew->aCol[i].iField = iField++;
15394 }
15395 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
15396 && eHidden!=RECOVER_EHIDDEN_STORED
15397 ){
15398 pNew->aCol[i].iBind = iBind++;
15399 }
15400 memcpy(csr, z, n);
15401 csr += (n+1);
15402 }
15403
15404 pNew->pNext = p->pTblList;
15405 p->pTblList = pNew;
15406 pNew->bIntkey = 1;
15407 }
15408
15409 recoverFinalize(p, pStmt);
15410
15411 pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
15412 while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
15413 int iField = sqlite3_column_int(pStmt, 0);
15414 int iCol = sqlite3_column_int(pStmt, 1);
15415
15416 assert( iCol<pNew->nCol );
15417 pNew->aCol[iCol].iField = iField;
15418
15419 pNew->bIntkey = 0;
15420 iPk = -2;
15421 }
15422 recoverFinalize(p, pStmt);
15423
15424 if( p->errCode==SQLITE_OK ){
15425 if( iPk>=0 ){
15426 pNew->aCol[iPk].bIPK = 1;
15427 }else if( pNew->bIntkey ){
15428 pNew->iRowidBind = iBind++;
15429 }
15430 }
15431 }
15432 }
15433
15434 /*
15435 ** This function is called after recoverCacheSchema() has cached those parts
15436 ** of the input database schema that could be recovered in temporary table
15437 ** "recovery.schema". This function creates in the output database copies
15438 ** of all parts of that schema that must be created before the tables can
15439 ** be populated. Specifically, this means:
15440 **
15441 ** * all tables that are not VIRTUAL, and
15442 ** * UNIQUE indexes.
15443 **
15444 ** If the recovery handle uses SQL callbacks, then callbacks containing
15445 ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
15446 **
15447 ** Additionally, records are added to the sqlite_schema table of the
15448 ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
15449 ** records are written directly to sqlite_schema, not actually executed.
15450 ** If the handle is in SQL callback mode, then callbacks are invoked
15451 ** with equivalent SQL statements.
15452 */
15453 static int recoverWriteSchema1(sqlite3_recover *p){
15454 sqlite3_stmt *pSelect = 0;
15455 sqlite3_stmt *pTblname = 0;
15456
15457 pSelect = recoverPrepare(p, p->dbOut,
15458 "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
15459 " SELECT rootpage, name, sql, "
15460 " type='table', "
15461 " sql LIKE 'create virtual%',"
15462 " (type='index' AND (sql LIKE '%unique%' OR ?1))"
15463 " FROM recovery.schema"
15464 ")"
15465 "SELECT rootpage, tbl, isVirtual, name, sql"
15466 " FROM dbschema "
15467 " WHERE tbl OR isIndex"
15468 " ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
15469 );
15470
15471 pTblname = recoverPrepare(p, p->dbOut,
15472 "SELECT name FROM sqlite_schema "
15473 "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
15474 );
15475
15476 if( pSelect ){
15477 sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
15478 while( sqlite3_step(pSelect)==SQLITE_ROW ){
15479 i64 iRoot = sqlite3_column_int64(pSelect, 0);
15480 int bTable = sqlite3_column_int(pSelect, 1);
15481 int bVirtual = sqlite3_column_int(pSelect, 2);
15482 const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
15483 const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
15484 char *zFree = 0;
15485 int rc = SQLITE_OK;
15486
15487 if( bVirtual ){
15488 zSql = (const char*)(zFree = recoverMPrintf(p,
15489 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
15490 zName, zName, zSql
15491 ));
15492 }
15493 rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
15494 if( rc==SQLITE_OK ){
15495 recoverSqlCallback(p, zSql);
15496 if( bTable && !bVirtual ){
15497 if( SQLITE_ROW==sqlite3_step(pTblname) ){
15498 const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
15499 recoverAddTable(p, zTbl, iRoot);
15500 }
15501 recoverReset(p, pTblname);
15502 }
15503 }else if( rc!=SQLITE_ERROR ){
15504 recoverDbError(p, p->dbOut);
15505 }
15506 sqlite3_free(zFree);
15507 }
15508 }
15509 recoverFinalize(p, pSelect);
15510 recoverFinalize(p, pTblname);
15511
15512 return p->errCode;
15513 }
15514
15515 /*
15516 ** This function is called after the output database has been populated. It
15517 ** adds all recovered schema elements that were not created in the output
15518 ** database by recoverWriteSchema1() - everything except for tables and
15519 ** UNIQUE indexes. Specifically:
15520 **
15521 ** * views,
15522 ** * triggers,
15523 ** * non-UNIQUE indexes.
15524 **
15525 ** If the recover handle is in SQL callback mode, then equivalent callbacks
15526 ** are issued to create the schema elements.
15527 */
15528 static int recoverWriteSchema2(sqlite3_recover *p){
15529 sqlite3_stmt *pSelect = 0;
15530
15531 pSelect = recoverPrepare(p, p->dbOut,
15532 p->bSlowIndexes ?
15533 "SELECT rootpage, sql FROM recovery.schema "
15534 " WHERE type!='table' AND type!='index'"
15535 :
15536 "SELECT rootpage, sql FROM recovery.schema "
15537 " WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
15538 );
15539
15540 if( pSelect ){
15541 while( sqlite3_step(pSelect)==SQLITE_ROW ){
15542 const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
15543 int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
15544 if( rc==SQLITE_OK ){
15545 recoverSqlCallback(p, zSql);
15546 }else if( rc!=SQLITE_ERROR ){
15547 recoverDbError(p, p->dbOut);
15548 }
15549 }
15550 }
15551 recoverFinalize(p, pSelect);
15552
15553 return p->errCode;
15554 }
15555
15556 /*
15557 ** This function is a no-op if recover handle p already contains an error
15558 ** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
15559 **
15560 ** Otherwise, if the recover handle is configured to create an output
15561 ** database (was created by sqlite3_recover_init()), then this function
15562 ** prepares and returns an SQL statement to INSERT a new record into table
15563 ** pTab, assuming the first nField fields of a record extracted from disk
15564 ** are valid.
15565 **
15566 ** For example, if table pTab is:
15567 **
15568 ** CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
15569 **
15570 ** And nField is 4, then the SQL statement prepared and returned is:
15571 **
15572 ** INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
15573 **
15574 ** In this case even though 4 values were extracted from the input db,
15575 ** only 3 are written to the output, as the generated STORED column
15576 ** cannot be written.
15577 **
15578 ** If the recover handle is in SQL callback mode, then the SQL statement
15579 ** prepared is such that evaluating it returns a single row containing
15580 ** a single text value - itself an SQL statement similar to the above,
15581 ** except with SQL literals in place of the variables. For example:
15582 **
15583 ** SELECT 'INSERT INTO (a, c, d) VALUES ('
15584 ** || quote(?1) || ', '
15585 ** || quote(?2) || ', '
15586 ** || quote(?3) || ')';
15587 **
15588 ** In either case, it is the responsibility of the caller to eventually
15589 ** free the statement handle using sqlite3_finalize().
15590 */
15591 static sqlite3_stmt *recoverInsertStmt(
15592 sqlite3_recover *p,
15593 RecoverTable *pTab,
15594 int nField
15595 ){
15596 sqlite3_stmt *pRet = 0;
15597 const char *zSep = "";
15598 const char *zSqlSep = "";
15599 char *zSql = 0;
15600 char *zFinal = 0;
15601 char *zBind = 0;
15602 int ii;
15603 int bSql = p->xSql ? 1 : 0;
15604
15605 if( nField<=0 ) return 0;
15606
15607 assert( nField<=pTab->nCol );
15608
15609 zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
15610
15611 if( pTab->iRowidBind ){
15612 assert( pTab->bIntkey );
15613 zSql = recoverMPrintf(p, "%z_rowid_", zSql);
15614 if( bSql ){
15615 zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
15616 }else{
15617 zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
15618 }
15619 zSqlSep = "||', '||";
15620 zSep = ", ";
15621 }
15622
15623 for(ii=0; ii<nField; ii++){
15624 int eHidden = pTab->aCol[ii].eHidden;
15625 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
15626 && eHidden!=RECOVER_EHIDDEN_STORED
15627 ){
15628 assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
15629 zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
15630
15631 if( bSql ){
15632 zBind = recoverMPrintf(p,
15633 "%z%sescape_crnl(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
15634 );
15635 zSqlSep = "||', '||";
15636 }else{
15637 zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
15638 }
15639 zSep = ", ";
15640 }
15641 }
15642
15643 if( bSql ){
15644 zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'",
15645 zSql, zBind
15646 );
15647 }else{
15648 zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
15649 }
15650
15651 pRet = recoverPrepare(p, p->dbOut, zFinal);
15652 sqlite3_free(zSql);
15653 sqlite3_free(zBind);
15654 sqlite3_free(zFinal);
15655
15656 return pRet;
15657 }
15658
15659
15660 /*
15661 ** Search the list of RecoverTable objects at p->pTblList for one that
15662 ** has root page iRoot in the input database. If such an object is found,
15663 ** return a pointer to it. Otherwise, return NULL.
15664 */
15665 static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
15666 RecoverTable *pRet = 0;
15667 for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
15668 return pRet;
15669 }
15670
15671 /*
15672 ** This function attempts to create a lost and found table within the
15673 ** output db. If successful, it returns a pointer to a buffer containing
15674 ** the name of the new table. It is the responsibility of the caller to
15675 ** eventually free this buffer using sqlite3_free().
15676 **
15677 ** If an error occurs, NULL is returned and an error code and error
15678 ** message left in the recover handle.
15679 */
15680 static char *recoverLostAndFoundCreate(
15681 sqlite3_recover *p, /* Recover object */
15682 int nField /* Number of column fields in new table */
15683 ){
15684 char *zTbl = 0;
15685 sqlite3_stmt *pProbe = 0;
15686 int ii = 0;
15687
15688 pProbe = recoverPrepare(p, p->dbOut,
15689 "SELECT 1 FROM sqlite_schema WHERE name=?"
15690 );
15691 for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
15692 int bFail = 0;
15693 if( ii<0 ){
15694 zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
15695 }else{
15696 zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
15697 }
15698
15699 if( p->errCode==SQLITE_OK ){
15700 sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
15701 if( SQLITE_ROW==sqlite3_step(pProbe) ){
15702 bFail = 1;
15703 }
15704 recoverReset(p, pProbe);
15705 }
15706
15707 if( bFail ){
15708 sqlite3_clear_bindings(pProbe);
15709 sqlite3_free(zTbl);
15710 zTbl = 0;
15711 }
15712 }
15713 recoverFinalize(p, pProbe);
15714
15715 if( zTbl ){
15716 const char *zSep = 0;
15717 char *zField = 0;
15718 char *zSql = 0;
15719
15720 zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
15721 for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
15722 zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
15723 zSep = ", ";
15724 }
15725
15726 zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
15727 sqlite3_free(zField);
15728
15729 recoverExec(p, p->dbOut, zSql);
15730 recoverSqlCallback(p, zSql);
15731 sqlite3_free(zSql);
15732 }else if( p->errCode==SQLITE_OK ){
15733 recoverError(
15734 p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
15735 );
15736 }
15737
15738 return zTbl;
15739 }
15740
15741 /*
15742 ** Synthesize and prepare an INSERT statement to write to the lost_and_found
15743 ** table in the output database. The name of the table is zTab, and it has
15744 ** nField c* fields.
15745 */
15746 static sqlite3_stmt *recoverLostAndFoundInsert(
15747 sqlite3_recover *p,
15748 const char *zTab,
15749 int nField
15750 ){
15751 int nTotal = nField + 4;
15752 int ii;
15753 char *zBind = 0;
15754 sqlite3_stmt *pRet = 0;
15755
15756 if( p->xSql==0 ){
15757 for(ii=0; ii<nTotal; ii++){
15758 zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
15759 }
15760 pRet = recoverPreparePrintf(
15761 p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
15762 );
15763 }else{
15764 const char *zSep = "";
15765 for(ii=0; ii<nTotal; ii++){
15766 zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
15767 zSep = "|| ', ' ||";
15768 }
15769 pRet = recoverPreparePrintf(
15770 p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
15771 );
15772 }
15773
15774 sqlite3_free(zBind);
15775 return pRet;
15776 }
15777
15778 /*
15779 ** Input database page iPg contains data that will be written to the
15780 ** lost-and-found table of the output database. This function attempts
15781 ** to identify the root page of the tree that page iPg belonged to.
15782 ** If successful, it sets output variable (*piRoot) to the page number
15783 ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
15784 ** an SQLite error code is returned and the final value of *piRoot
15785 ** undefined.
15786 */
15787 static int recoverLostAndFoundFindRoot(
15788 sqlite3_recover *p,
15789 i64 iPg,
15790 i64 *piRoot
15791 ){
15792 RecoverStateLAF *pLaf = &p->laf;
15793
15794 if( pLaf->pFindRoot==0 ){
15795 pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
15796 "WITH RECURSIVE p(pgno) AS ("
15797 " SELECT ?"
15798 " UNION"
15799 " SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
15800 ") "
15801 "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
15802 " AND m.parent IS NULL"
15803 );
15804 }
15805 if( p->errCode==SQLITE_OK ){
15806 sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
15807 if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
15808 *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
15809 }else{
15810 *piRoot = iPg;
15811 }
15812 recoverReset(p, pLaf->pFindRoot);
15813 }
15814 return p->errCode;
15815 }
15816
15817 /*
15818 ** Recover data from page iPage of the input database and write it to
15819 ** the lost-and-found table in the output database.
15820 */
15821 static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
15822 RecoverStateLAF *pLaf = &p->laf;
15823 sqlite3_value **apVal = pLaf->apVal;
15824 sqlite3_stmt *pPageData = pLaf->pPageData;
15825 sqlite3_stmt *pInsert = pLaf->pInsert;
15826
15827 int nVal = -1;
15828 int iPrevCell = 0;
15829 i64 iRoot = 0;
15830 int bHaveRowid = 0;
15831 i64 iRowid = 0;
15832 int ii = 0;
15833
15834 if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
15835 sqlite3_bind_int64(pPageData, 1, iPage);
15836 while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
15837 int iCell = sqlite3_column_int64(pPageData, 0);
15838 int iField = sqlite3_column_int64(pPageData, 1);
15839
15840 if( iPrevCell!=iCell && nVal>=0 ){
15841 /* Insert the new row */
15842 sqlite3_bind_int64(pInsert, 1, iRoot); /* rootpgno */
15843 sqlite3_bind_int64(pInsert, 2, iPage); /* pgno */
15844 sqlite3_bind_int(pInsert, 3, nVal); /* nfield */
15845 if( bHaveRowid ){
15846 sqlite3_bind_int64(pInsert, 4, iRowid); /* id */
15847 }
15848 for(ii=0; ii<nVal; ii++){
15849 recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
15850 }
15851 if( sqlite3_step(pInsert)==SQLITE_ROW ){
15852 recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
15853 }
15854 recoverReset(p, pInsert);
15855
15856 /* Discard the accumulated row data */
15857 for(ii=0; ii<nVal; ii++){
15858 sqlite3_value_free(apVal[ii]);
15859 apVal[ii] = 0;
15860 }
15861 sqlite3_clear_bindings(pInsert);
15862 bHaveRowid = 0;
15863 nVal = -1;
15864 }
15865
15866 if( iCell<0 ) break;
15867
15868 if( iField<0 ){
15869 assert( nVal==-1 );
15870 iRowid = sqlite3_column_int64(pPageData, 2);
15871 bHaveRowid = 1;
15872 nVal = 0;
15873 }else if( iField<pLaf->nMaxField ){
15874 sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
15875 apVal[iField] = sqlite3_value_dup(pVal);
15876 assert( iField==nVal || (nVal==-1 && iField==0) );
15877 nVal = iField+1;
15878 if( apVal[iField]==0 ){
15879 recoverError(p, SQLITE_NOMEM, 0);
15880 }
15881 }
15882
15883 iPrevCell = iCell;
15884 }
15885 recoverReset(p, pPageData);
15886
15887 for(ii=0; ii<nVal; ii++){
15888 sqlite3_value_free(apVal[ii]);
15889 apVal[ii] = 0;
15890 }
15891 }
15892
15893 /*
15894 ** Perform one step (sqlite3_recover_step()) of work for the connection
15895 ** passed as the only argument, which is guaranteed to be in
15896 ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found
15897 ** table of the output database is populated with recovered data that can
15898 ** not be assigned to any recovered schema object.
15899 */
15900 static int recoverLostAndFound3Step(sqlite3_recover *p){
15901 RecoverStateLAF *pLaf = &p->laf;
15902 if( p->errCode==SQLITE_OK ){
15903 if( pLaf->pInsert==0 ){
15904 return SQLITE_DONE;
15905 }else{
15906 if( p->errCode==SQLITE_OK ){
15907 int res = sqlite3_step(pLaf->pAllPage);
15908 if( res==SQLITE_ROW ){
15909 i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
15910 if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
15911 recoverLostAndFoundOnePage(p, iPage);
15912 }
15913 }else{
15914 recoverReset(p, pLaf->pAllPage);
15915 return SQLITE_DONE;
15916 }
15917 }
15918 }
15919 }
15920 return SQLITE_OK;
15921 }
15922
15923 /*
15924 ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3
15925 ** state - during which the lost-and-found table of the output database
15926 ** is populated with recovered data that can not be assigned to any
15927 ** recovered schema object.
15928 */
15929 static void recoverLostAndFound3Init(sqlite3_recover *p){
15930 RecoverStateLAF *pLaf = &p->laf;
15931
15932 if( pLaf->nMaxField>0 ){
15933 char *zTab = 0; /* Name of lost_and_found table */
15934
15935 zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
15936 pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
15937 sqlite3_free(zTab);
15938
15939 pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
15940 "WITH RECURSIVE seq(ii) AS ("
15941 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
15942 ")"
15943 "SELECT ii FROM seq" , p->laf.nPg
15944 );
15945 pLaf->pPageData = recoverPrepare(p, p->dbOut,
15946 "SELECT cell, field, value "
15947 "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
15948 "UNION ALL "
15949 "SELECT -1, -1, -1"
15950 );
15951
15952 pLaf->apVal = (sqlite3_value**)recoverMalloc(p,
15953 pLaf->nMaxField*sizeof(sqlite3_value*)
15954 );
15955 }
15956 }
15957
15958 /*
15959 ** Initialize resources required in RECOVER_STATE_WRITING state - during which
15960 ** tables recovered from the schema of the input database are populated with
15961 ** recovered data.
15962 */
15963 static int recoverWriteDataInit(sqlite3_recover *p){
15964 RecoverStateW1 *p1 = &p->w1;
15965 RecoverTable *pTbl = 0;
15966 int nByte = 0;
15967
15968 /* Figure out the maximum number of columns for any table in the schema */
15969 assert( p1->nMax==0 );
15970 for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
15971 if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
15972 }
15973
15974 /* Allocate an array of (sqlite3_value*) in which to accumulate the values
15975 ** that will be written to the output database in a single row. */
15976 nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
15977 p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
15978 if( p1->apVal==0 ) return p->errCode;
15979
15980 /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
15981 ** to loop through cells that appear to belong to a single table (pSel). */
15982 p1->pTbls = recoverPrepare(p, p->dbOut,
15983 "SELECT rootpage FROM recovery.schema "
15984 " WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
15985 " ORDER BY (tbl_name='sqlite_sequence') ASC"
15986 );
15987 p1->pSel = recoverPrepare(p, p->dbOut,
15988 "WITH RECURSIVE pages(page) AS ("
15989 " SELECT ?1"
15990 " UNION"
15991 " SELECT child FROM sqlite_dbptr('getpage()'), pages "
15992 " WHERE pgno=page"
15993 ") "
15994 "SELECT page, cell, field, value "
15995 "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
15996 "UNION ALL "
15997 "SELECT 0, 0, 0, 0"
15998 );
15999
16000 return p->errCode;
16001 }
16002
16003 /*
16004 ** Clean up resources allocated by recoverWriteDataInit() (stuff in
16005 ** sqlite3_recover.w1).
16006 */
16007 static void recoverWriteDataCleanup(sqlite3_recover *p){
16008 RecoverStateW1 *p1 = &p->w1;
16009 int ii;
16010 for(ii=0; ii<p1->nVal; ii++){
16011 sqlite3_value_free(p1->apVal[ii]);
16012 }
16013 sqlite3_free(p1->apVal);
16014 recoverFinalize(p, p1->pInsert);
16015 recoverFinalize(p, p1->pTbls);
16016 recoverFinalize(p, p1->pSel);
16017 memset(p1, 0, sizeof(*p1));
16018 }
16019
16020 /*
16021 ** Perform one step (sqlite3_recover_step()) of work for the connection
16022 ** passed as the only argument, which is guaranteed to be in
16023 ** RECOVER_STATE_WRITING state - during which tables recovered from the
16024 ** schema of the input database are populated with recovered data.
16025 */
16026 static int recoverWriteDataStep(sqlite3_recover *p){
16027 RecoverStateW1 *p1 = &p->w1;
16028 sqlite3_stmt *pSel = p1->pSel;
16029 sqlite3_value **apVal = p1->apVal;
16030
16031 if( p->errCode==SQLITE_OK && p1->pTab==0 ){
16032 if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
16033 i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
16034 p1->pTab = recoverFindTable(p, iRoot);
16035
16036 recoverFinalize(p, p1->pInsert);
16037 p1->pInsert = 0;
16038
16039 /* If this table is unknown, return early. The caller will invoke this
16040 ** function again and it will move on to the next table. */
16041 if( p1->pTab==0 ) return p->errCode;
16042
16043 /* If this is the sqlite_sequence table, delete any rows added by
16044 ** earlier INSERT statements on tables with AUTOINCREMENT primary
16045 ** keys before recovering its contents. The p1->pTbls SELECT statement
16046 ** is rigged to deliver "sqlite_sequence" last of all, so we don't
16047 ** worry about it being modified after it is recovered. */
16048 if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
16049 recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
16050 recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
16051 }
16052
16053 /* Bind the root page of this table within the original database to
16054 ** SELECT statement p1->pSel. The SELECT statement will then iterate
16055 ** through cells that look like they belong to table pTab. */
16056 sqlite3_bind_int64(pSel, 1, iRoot);
16057
16058 p1->nVal = 0;
16059 p1->bHaveRowid = 0;
16060 p1->iPrevPage = -1;
16061 p1->iPrevCell = -1;
16062 }else{
16063 return SQLITE_DONE;
16064 }
16065 }
16066 assert( p->errCode!=SQLITE_OK || p1->pTab );
16067
16068 if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
16069 RecoverTable *pTab = p1->pTab;
16070
16071 i64 iPage = sqlite3_column_int64(pSel, 0);
16072 int iCell = sqlite3_column_int(pSel, 1);
16073 int iField = sqlite3_column_int(pSel, 2);
16074 sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
16075 int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
16076
16077 assert( bNewCell==0 || (iField==-1 || iField==0) );
16078 assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
16079
16080 if( bNewCell ){
16081 int ii = 0;
16082 if( p1->nVal>=0 ){
16083 if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
16084 recoverFinalize(p, p1->pInsert);
16085 p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
16086 p1->nInsert = p1->nVal;
16087 }
16088 if( p1->nVal>0 ){
16089 sqlite3_stmt *pInsert = p1->pInsert;
16090 for(ii=0; ii<pTab->nCol; ii++){
16091 RecoverColumn *pCol = &pTab->aCol[ii];
16092 int iBind = pCol->iBind;
16093 if( iBind>0 ){
16094 if( pCol->bIPK ){
16095 sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
16096 }else if( pCol->iField<p1->nVal ){
16097 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
16098 }
16099 }
16100 }
16101 if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
16102 sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
16103 }
16104 if( SQLITE_ROW==sqlite3_step(pInsert) ){
16105 const char *z = (const char*)sqlite3_column_text(pInsert, 0);
16106 recoverSqlCallback(p, z);
16107 }
16108 recoverReset(p, pInsert);
16109 assert( p->errCode || pInsert );
16110 if( pInsert ) sqlite3_clear_bindings(pInsert);
16111 }
16112 }
16113
16114 for(ii=0; ii<p1->nVal; ii++){
16115 sqlite3_value_free(apVal[ii]);
16116 apVal[ii] = 0;
16117 }
16118 p1->nVal = -1;
16119 p1->bHaveRowid = 0;
16120 }
16121
16122 if( iPage!=0 ){
16123 if( iField<0 ){
16124 p1->iRowid = sqlite3_column_int64(pSel, 3);
16125 assert( p1->nVal==-1 );
16126 p1->nVal = 0;
16127 p1->bHaveRowid = 1;
16128 }else if( iField<pTab->nCol ){
16129 assert( apVal[iField]==0 );
16130 apVal[iField] = sqlite3_value_dup( pVal );
16131 if( apVal[iField]==0 ){
16132 recoverError(p, SQLITE_NOMEM, 0);
16133 }
16134 p1->nVal = iField+1;
16135 }
16136 p1->iPrevCell = iCell;
16137 p1->iPrevPage = iPage;
16138 }
16139 }else{
16140 recoverReset(p, pSel);
16141 p1->pTab = 0;
16142 }
16143
16144 return p->errCode;
16145 }
16146
16147 /*
16148 ** Initialize resources required by sqlite3_recover_step() in
16149 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
16150 ** already allocated to a recovered schema element is determined.
16151 */
16152 static void recoverLostAndFound1Init(sqlite3_recover *p){
16153 RecoverStateLAF *pLaf = &p->laf;
16154 sqlite3_stmt *pStmt = 0;
16155
16156 assert( p->laf.pUsed==0 );
16157 pLaf->nPg = recoverPageCount(p);
16158 pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
16159
16160 /* Prepare a statement to iterate through all pages that are part of any tree
16161 ** in the recoverable part of the input database schema to the bitmap. And,
16162 ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
16163 ** freelist. */
16164 pStmt = recoverPrepare(
16165 p, p->dbOut,
16166 "WITH trunk(pgno) AS ("
16167 " SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
16168 " UNION"
16169 " SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
16170 "),"
16171 "trunkdata(pgno, data) AS ("
16172 " SELECT pgno, getpage(pgno) FROM trunk"
16173 "),"
16174 "freelist(data, n, freepgno) AS ("
16175 " SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
16176 " UNION ALL"
16177 " SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
16178 "),"
16179 ""
16180 "roots(r) AS ("
16181 " SELECT 1 UNION ALL"
16182 " SELECT rootpage FROM recovery.schema WHERE rootpage>0"
16183 "),"
16184 "used(page) AS ("
16185 " SELECT r FROM roots"
16186 " UNION"
16187 " SELECT child FROM sqlite_dbptr('getpage()'), used "
16188 " WHERE pgno=page"
16189 ") "
16190 "SELECT page FROM used"
16191 " UNION ALL "
16192 "SELECT freepgno FROM freelist WHERE NOT ?"
16193 );
16194 if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
16195 pLaf->pUsedPages = pStmt;
16196 }
16197
16198 /*
16199 ** Perform one step (sqlite3_recover_step()) of work for the connection
16200 ** passed as the only argument, which is guaranteed to be in
16201 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
16202 ** already allocated to a recovered schema element is determined.
16203 */
16204 static int recoverLostAndFound1Step(sqlite3_recover *p){
16205 RecoverStateLAF *pLaf = &p->laf;
16206 int rc = p->errCode;
16207 if( rc==SQLITE_OK ){
16208 rc = sqlite3_step(pLaf->pUsedPages);
16209 if( rc==SQLITE_ROW ){
16210 i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
16211 recoverBitmapSet(pLaf->pUsed, iPg);
16212 rc = SQLITE_OK;
16213 }else{
16214 recoverFinalize(p, pLaf->pUsedPages);
16215 pLaf->pUsedPages = 0;
16216 }
16217 }
16218 return rc;
16219 }
16220
16221 /*
16222 ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2
16223 ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
16224 ** are sorted into sets that likely belonged to the same database tree.
16225 */
16226 static void recoverLostAndFound2Init(sqlite3_recover *p){
16227 RecoverStateLAF *pLaf = &p->laf;
16228
16229 assert( p->laf.pAllAndParent==0 );
16230 assert( p->laf.pMapInsert==0 );
16231 assert( p->laf.pMaxField==0 );
16232 assert( p->laf.nMaxField==0 );
16233
16234 pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
16235 "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
16236 );
16237 pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
16238 "WITH RECURSIVE seq(ii) AS ("
16239 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
16240 ")"
16241 "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
16242 " UNION ALL "
16243 "SELECT NULL, ii FROM seq", p->laf.nPg
16244 );
16245 pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
16246 "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
16247 );
16248 }
16249
16250 /*
16251 ** Perform one step (sqlite3_recover_step()) of work for the connection
16252 ** passed as the only argument, which is guaranteed to be in
16253 ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified
16254 ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged
16255 ** to the same database tree.
16256 */
16257 static int recoverLostAndFound2Step(sqlite3_recover *p){
16258 RecoverStateLAF *pLaf = &p->laf;
16259 if( p->errCode==SQLITE_OK ){
16260 int res = sqlite3_step(pLaf->pAllAndParent);
16261 if( res==SQLITE_ROW ){
16262 i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
16263 if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
16264 sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
16265 sqlite3_bind_value(pLaf->pMapInsert, 2,
16266 sqlite3_column_value(pLaf->pAllAndParent, 0)
16267 );
16268 sqlite3_step(pLaf->pMapInsert);
16269 recoverReset(p, pLaf->pMapInsert);
16270 sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
16271 if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
16272 int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
16273 if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
16274 }
16275 recoverReset(p, pLaf->pMaxField);
16276 }
16277 }else{
16278 recoverFinalize(p, pLaf->pAllAndParent);
16279 pLaf->pAllAndParent =0;
16280 return SQLITE_DONE;
16281 }
16282 }
16283 return p->errCode;
16284 }
16285
16286 /*
16287 ** Free all resources allocated as part of sqlite3_recover_step() calls
16288 ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
16289 */
16290 static void recoverLostAndFoundCleanup(sqlite3_recover *p){
16291 recoverBitmapFree(p->laf.pUsed);
16292 p->laf.pUsed = 0;
16293 sqlite3_finalize(p->laf.pUsedPages);
16294 sqlite3_finalize(p->laf.pAllAndParent);
16295 sqlite3_finalize(p->laf.pMapInsert);
16296 sqlite3_finalize(p->laf.pMaxField);
16297 sqlite3_finalize(p->laf.pFindRoot);
16298 sqlite3_finalize(p->laf.pInsert);
16299 sqlite3_finalize(p->laf.pAllPage);
16300 sqlite3_finalize(p->laf.pPageData);
16301 p->laf.pUsedPages = 0;
16302 p->laf.pAllAndParent = 0;
16303 p->laf.pMapInsert = 0;
16304 p->laf.pMaxField = 0;
16305 p->laf.pFindRoot = 0;
16306 p->laf.pInsert = 0;
16307 p->laf.pAllPage = 0;
16308 p->laf.pPageData = 0;
16309 sqlite3_free(p->laf.apVal);
16310 p->laf.apVal = 0;
16311 }
16312
16313 /*
16314 ** Free all resources allocated as part of sqlite3_recover_step() calls.
16315 */
16316 static void recoverFinalCleanup(sqlite3_recover *p){
16317 RecoverTable *pTab = 0;
16318 RecoverTable *pNext = 0;
16319
16320 recoverWriteDataCleanup(p);
16321 recoverLostAndFoundCleanup(p);
16322
16323 for(pTab=p->pTblList; pTab; pTab=pNext){
16324 pNext = pTab->pNext;
16325 sqlite3_free(pTab);
16326 }
16327 p->pTblList = 0;
16328 sqlite3_finalize(p->pGetPage);
16329 p->pGetPage = 0;
16330 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
16331
16332 {
16333 #ifndef NDEBUG
16334 int res =
16335 #endif
16336 sqlite3_close(p->dbOut);
16337 assert( res==SQLITE_OK );
16338 }
16339 p->dbOut = 0;
16340 }
16341
16342 /*
16343 ** Decode and return an unsigned 16-bit big-endian integer value from
16344 ** buffer a[].
16345 */
16346 static u32 recoverGetU16(const u8 *a){
16347 return (((u32)a[0])<<8) + ((u32)a[1]);
16348 }
16349
16350 /*
16351 ** Decode and return an unsigned 32-bit big-endian integer value from
16352 ** buffer a[].
16353 */
16354 static u32 recoverGetU32(const u8 *a){
16355 return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
16356 }
16357
16358 /*
16359 ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
16360 ** and return the number of bytes consumed.
16361 */
16362 static int recoverGetVarint(const u8 *a, i64 *pVal){
16363 sqlite3_uint64 u = 0;
16364 int i;
16365 for(i=0; i<8; i++){
16366 u = (u<<7) + (a[i]&0x7f);
16367 if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
16368 }
16369 u = (u<<8) + (a[i]&0xff);
16370 *pVal = (sqlite3_int64)u;
16371 return 9;
16372 }
16373
16374 /*
16375 ** The second argument points to a buffer n bytes in size. If this buffer
16376 ** or a prefix thereof appears to contain a well-formed SQLite b-tree page,
16377 ** return the page-size in bytes. Otherwise, if the buffer does not
16378 ** appear to contain a well-formed b-tree page, return 0.
16379 */
16380 static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
16381 u8 *aUsed = aTmp;
16382 int nFrag = 0;
16383 int nActual = 0;
16384 int iFree = 0;
16385 int nCell = 0; /* Number of cells on page */
16386 int iCellOff = 0; /* Offset of cell array in page */
16387 int iContent = 0;
16388 int eType = 0;
16389 int ii = 0;
16390
16391 eType = (int)a[0];
16392 if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
16393
16394 iFree = (int)recoverGetU16(&a[1]);
16395 nCell = (int)recoverGetU16(&a[3]);
16396 iContent = (int)recoverGetU16(&a[5]);
16397 if( iContent==0 ) iContent = 65536;
16398 nFrag = (int)a[7];
16399
16400 if( iContent>n ) return 0;
16401
16402 memset(aUsed, 0, n);
16403 memset(aUsed, 0xFF, iContent);
16404
16405 /* Follow the free-list. This is the same format for all b-tree pages. */
16406 if( iFree && iFree<=iContent ) return 0;
16407 while( iFree ){
16408 int iNext = 0;
16409 int nByte = 0;
16410 if( iFree>(n-4) ) return 0;
16411 iNext = recoverGetU16(&a[iFree]);
16412 nByte = recoverGetU16(&a[iFree+2]);
16413 if( iFree+nByte>n || nByte<4 ) return 0;
16414 if( iNext && iNext<iFree+nByte ) return 0;
16415 memset(&aUsed[iFree], 0xFF, nByte);
16416 iFree = iNext;
16417 }
16418
16419 /* Run through the cells */
16420 if( eType==0x02 || eType==0x05 ){
16421 iCellOff = 12;
16422 }else{
16423 iCellOff = 8;
16424 }
16425 if( (iCellOff + 2*nCell)>iContent ) return 0;
16426 for(ii=0; ii<nCell; ii++){
16427 int iByte;
16428 i64 nPayload = 0;
16429 int nByte = 0;
16430 int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
16431 if( iOff<iContent || iOff>n ){
16432 return 0;
16433 }
16434 if( eType==0x05 || eType==0x02 ) nByte += 4;
16435 nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
16436 if( eType==0x0D ){
16437 i64 dummy = 0;
16438 nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
16439 }
16440 if( eType!=0x05 ){
16441 int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
16442 int M = ((n-12)*32/255)-23;
16443 int K = M+((nPayload-M)%(n-4));
16444
16445 if( nPayload<X ){
16446 nByte += nPayload;
16447 }else if( K<=X ){
16448 nByte += K+4;
16449 }else{
16450 nByte += M+4;
16451 }
16452 }
16453
16454 if( iOff+nByte>n ){
16455 return 0;
16456 }
16457 for(iByte=iOff; iByte<(iOff+nByte); iByte++){
16458 if( aUsed[iByte]!=0 ){
16459 return 0;
16460 }
16461 aUsed[iByte] = 0xFF;
16462 }
16463 }
16464
16465 nActual = 0;
16466 for(ii=0; ii<n; ii++){
16467 if( aUsed[ii]==0 ) nActual++;
16468 }
16469 return (nActual==nFrag);
16470 }
16471
16472
16473 static int recoverVfsClose(sqlite3_file*);
16474 static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
16475 static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
16476 static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
16477 static int recoverVfsSync(sqlite3_file*, int flags);
16478 static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
16479 static int recoverVfsLock(sqlite3_file*, int);
16480 static int recoverVfsUnlock(sqlite3_file*, int);
16481 static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
16482 static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
16483 static int recoverVfsSectorSize(sqlite3_file*);
16484 static int recoverVfsDeviceCharacteristics(sqlite3_file*);
16485 static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
16486 static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
16487 static void recoverVfsShmBarrier(sqlite3_file*);
16488 static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
16489 static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
16490 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
16491
16492 static sqlite3_io_methods recover_methods = {
16493 2, /* iVersion */
16494 recoverVfsClose,
16495 recoverVfsRead,
16496 recoverVfsWrite,
16497 recoverVfsTruncate,
16498 recoverVfsSync,
16499 recoverVfsFileSize,
16500 recoverVfsLock,
16501 recoverVfsUnlock,
16502 recoverVfsCheckReservedLock,
16503 recoverVfsFileControl,
16504 recoverVfsSectorSize,
16505 recoverVfsDeviceCharacteristics,
16506 recoverVfsShmMap,
16507 recoverVfsShmLock,
16508 recoverVfsShmBarrier,
16509 recoverVfsShmUnmap,
16510 recoverVfsFetch,
16511 recoverVfsUnfetch
16512 };
16513
16514 static int recoverVfsClose(sqlite3_file *pFd){
16515 assert( pFd->pMethods!=&recover_methods );
16516 return pFd->pMethods->xClose(pFd);
16517 }
16518
16519 /*
16520 ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
16521 */
16522 static void recoverPutU16(u8 *a, u32 v){
16523 a[0] = (v>>8) & 0x00FF;
16524 a[1] = (v>>0) & 0x00FF;
16525 }
16526
16527 /*
16528 ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
16529 */
16530 static void recoverPutU32(u8 *a, u32 v){
16531 a[0] = (v>>24) & 0x00FF;
16532 a[1] = (v>>16) & 0x00FF;
16533 a[2] = (v>>8) & 0x00FF;
16534 a[3] = (v>>0) & 0x00FF;
16535 }
16536
16537 /*
16538 ** Detect the page-size of the database opened by file-handle pFd by
16539 ** searching the first part of the file for a well-formed SQLite b-tree
16540 ** page. If parameter nReserve is non-zero, then as well as searching for
16541 ** a b-tree page with zero reserved bytes, this function searches for one
16542 ** with nReserve reserved bytes at the end of it.
16543 **
16544 ** If successful, set variable p->detected_pgsz to the detected page-size
16545 ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
16546 ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
16547 ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
16548 ** is returned. The final value of p->detected_pgsz is undefined in this
16549 ** case.
16550 */
16551 static int recoverVfsDetectPagesize(
16552 sqlite3_recover *p, /* Recover handle */
16553 sqlite3_file *pFd, /* File-handle open on input database */
16554 u32 nReserve, /* Possible nReserve value */
16555 i64 nSz /* Size of database file in bytes */
16556 ){
16557 int rc = SQLITE_OK;
16558 const int nMin = 512;
16559 const int nMax = 65536;
16560 const int nMaxBlk = 4;
16561 u32 pgsz = 0;
16562 int iBlk = 0;
16563 u8 *aPg = 0;
16564 u8 *aTmp = 0;
16565 int nBlk = 0;
16566
16567 aPg = (u8*)sqlite3_malloc(2*nMax);
16568 if( aPg==0 ) return SQLITE_NOMEM;
16569 aTmp = &aPg[nMax];
16570
16571 nBlk = (nSz+nMax-1)/nMax;
16572 if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
16573
16574 do {
16575 for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
16576 int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
16577 memset(aPg, 0, nMax);
16578 rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
16579 if( rc==SQLITE_OK ){
16580 int pgsz2;
16581 for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
16582 int iOff;
16583 for(iOff=0; iOff<nMax; iOff+=pgsz2){
16584 if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
16585 pgsz = pgsz2;
16586 break;
16587 }
16588 }
16589 }
16590 }
16591 }
16592 if( pgsz>(u32)p->detected_pgsz ){
16593 p->detected_pgsz = pgsz;
16594 p->nReserve = nReserve;
16595 }
16596 if( nReserve==0 ) break;
16597 nReserve = 0;
16598 }while( 1 );
16599
16600 p->detected_pgsz = pgsz;
16601 sqlite3_free(aPg);
16602 return rc;
16603 }
16604
16605 /*
16606 ** The xRead() method of the wrapper VFS. This is used to intercept calls
16607 ** to read page 1 of the input database.
16608 */
16609 static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
16610 int rc = SQLITE_OK;
16611 if( pFd->pMethods==&recover_methods ){
16612 pFd->pMethods = recover_g.pMethods;
16613 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
16614 if( nByte==16 ){
16615 sqlite3_randomness(16, aBuf);
16616 }else
16617 if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
16618 /* Ensure that the database has a valid header file. The only fields
16619 ** that really matter to recovery are:
16620 **
16621 ** + Database page size (16-bits at offset 16)
16622 ** + Size of db in pages (32-bits at offset 28)
16623 ** + Database encoding (32-bits at offset 56)
16624 **
16625 ** Also preserved are:
16626 **
16627 ** + first freelist page (32-bits at offset 32)
16628 ** + size of freelist (32-bits at offset 36)
16629 ** + the wal-mode flags (16-bits at offset 18)
16630 **
16631 ** We also try to preserve the auto-vacuum, incr-value, user-version
16632 ** and application-id fields - all 32 bit quantities at offsets
16633 ** 52, 60, 64 and 68. All other fields are set to known good values.
16634 **
16635 ** Byte offset 105 should also contain the page-size as a 16-bit
16636 ** integer.
16637 */
16638 const int aPreserve[] = {32, 36, 52, 60, 64, 68};
16639 u8 aHdr[108] = {
16640 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66,
16641 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
16642 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
16643 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
16644 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
16646 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
16647 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16648 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16652 0x00, 0x2e, 0x5b, 0x30,
16653
16654 0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
16655 };
16656 u8 *a = (u8*)aBuf;
16657
16658 u32 pgsz = recoverGetU16(&a[16]);
16659 u32 nReserve = a[20];
16660 u32 enc = recoverGetU32(&a[56]);
16661 u32 dbsz = 0;
16662 i64 dbFileSize = 0;
16663 int ii;
16664 sqlite3_recover *p = recover_g.p;
16665
16666 if( pgsz==0x01 ) pgsz = 65536;
16667 rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
16668
16669 if( rc==SQLITE_OK && p->detected_pgsz==0 ){
16670 rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
16671 }
16672 if( p->detected_pgsz ){
16673 pgsz = p->detected_pgsz;
16674 nReserve = p->nReserve;
16675 }
16676
16677 if( pgsz ){
16678 dbsz = dbFileSize / pgsz;
16679 }
16680 if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
16681 enc = SQLITE_UTF8;
16682 }
16683
16684 sqlite3_free(p->pPage1Cache);
16685 p->pPage1Cache = 0;
16686 p->pPage1Disk = 0;
16687
16688 p->pgsz = nByte;
16689 p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
16690 if( p->pPage1Cache ){
16691 p->pPage1Disk = &p->pPage1Cache[nByte];
16692 memcpy(p->pPage1Disk, aBuf, nByte);
16693 aHdr[18] = a[18];
16694 aHdr[19] = a[19];
16695 recoverPutU32(&aHdr[28], dbsz);
16696 recoverPutU32(&aHdr[56], enc);
16697 recoverPutU16(&aHdr[105], pgsz-nReserve);
16698 if( pgsz==65536 ) pgsz = 1;
16699 recoverPutU16(&aHdr[16], pgsz);
16700 aHdr[20] = nReserve;
16701 for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
16702 memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
16703 }
16704 memcpy(aBuf, aHdr, sizeof(aHdr));
16705 memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
16706
16707 memcpy(p->pPage1Cache, aBuf, nByte);
16708 }else{
16709 rc = p->errCode;
16710 }
16711
16712 }
16713 pFd->pMethods = &recover_methods;
16714 }else{
16715 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
16716 }
16717 return rc;
16718 }
16719
16720 /*
16721 ** Used to make sqlite3_io_methods wrapper methods less verbose.
16722 */
16723 #define RECOVER_VFS_WRAPPER(code) \
16724 int rc = SQLITE_OK; \
16725 if( pFd->pMethods==&recover_methods ){ \
16726 pFd->pMethods = recover_g.pMethods; \
16727 rc = code; \
16728 pFd->pMethods = &recover_methods; \
16729 }else{ \
16730 rc = code; \
16731 } \
16732 return rc;
16733
16734 /*
16735 ** Methods of the wrapper VFS. All methods except for xRead() and xClose()
16736 ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
16737 ** method on the lower level VFS, then reinstall the wrapper before returning.
16738 ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
16739 */
16740 static int recoverVfsWrite(
16741 sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
16742 ){
16743 RECOVER_VFS_WRAPPER (
16744 pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
16745 );
16746 }
16747 static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
16748 RECOVER_VFS_WRAPPER (
16749 pFd->pMethods->xTruncate(pFd, size)
16750 );
16751 }
16752 static int recoverVfsSync(sqlite3_file *pFd, int flags){
16753 RECOVER_VFS_WRAPPER (
16754 pFd->pMethods->xSync(pFd, flags)
16755 );
16756 }
16757 static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
16758 RECOVER_VFS_WRAPPER (
16759 pFd->pMethods->xFileSize(pFd, pSize)
16760 );
16761 }
16762 static int recoverVfsLock(sqlite3_file *pFd, int eLock){
16763 RECOVER_VFS_WRAPPER (
16764 pFd->pMethods->xLock(pFd, eLock)
16765 );
16766 }
16767 static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
16768 RECOVER_VFS_WRAPPER (
16769 pFd->pMethods->xUnlock(pFd, eLock)
16770 );
16771 }
16772 static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
16773 RECOVER_VFS_WRAPPER (
16774 pFd->pMethods->xCheckReservedLock(pFd, pResOut)
16775 );
16776 }
16777 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
16778 RECOVER_VFS_WRAPPER (
16779 (pFd->pMethods ? pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
16780 );
16781 }
16782 static int recoverVfsSectorSize(sqlite3_file *pFd){
16783 RECOVER_VFS_WRAPPER (
16784 pFd->pMethods->xSectorSize(pFd)
16785 );
16786 }
16787 static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
16788 RECOVER_VFS_WRAPPER (
16789 pFd->pMethods->xDeviceCharacteristics(pFd)
16790 );
16791 }
16792 static int recoverVfsShmMap(
16793 sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
16794 ){
16795 RECOVER_VFS_WRAPPER (
16796 pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
16797 );
16798 }
16799 static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
16800 RECOVER_VFS_WRAPPER (
16801 pFd->pMethods->xShmLock(pFd, offset, n, flags)
16802 );
16803 }
16804 static void recoverVfsShmBarrier(sqlite3_file *pFd){
16805 if( pFd->pMethods==&recover_methods ){
16806 pFd->pMethods = recover_g.pMethods;
16807 pFd->pMethods->xShmBarrier(pFd);
16808 pFd->pMethods = &recover_methods;
16809 }else{
16810 pFd->pMethods->xShmBarrier(pFd);
16811 }
16812 }
16813 static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
16814 RECOVER_VFS_WRAPPER (
16815 pFd->pMethods->xShmUnmap(pFd, deleteFlag)
16816 );
16817 }
16818
16819 static int recoverVfsFetch(
16820 sqlite3_file *pFd,
16821 sqlite3_int64 iOff,
16822 int iAmt,
16823 void **pp
16824 ){
16825 (void)pFd;
16826 (void)iOff;
16827 (void)iAmt;
16828 *pp = 0;
16829 return SQLITE_OK;
16830 }
16831 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
16832 (void)pFd;
16833 (void)iOff;
16834 (void)p;
16835 return SQLITE_OK;
16836 }
16837
16838 /*
16839 ** Install the VFS wrapper around the file-descriptor open on the input
16840 ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
16841 ** when this function is called.
16842 */
16843 static void recoverInstallWrapper(sqlite3_recover *p){
16844 sqlite3_file *pFd = 0;
16845 assert( recover_g.pMethods==0 );
16846 recoverAssertMutexHeld();
16847 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
16848 assert( pFd==0 || pFd->pMethods!=&recover_methods );
16849 if( pFd && pFd->pMethods ){
16850 int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
16851 recover_g.pMethods = pFd->pMethods;
16852 recover_g.p = p;
16853 recover_methods.iVersion = iVersion;
16854 pFd->pMethods = &recover_methods;
16855 }
16856 }
16857
16858 /*
16859 ** Uninstall the VFS wrapper that was installed around the file-descriptor open
16860 ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
16861 ** held when this function is called.
16862 */
16863 static void recoverUninstallWrapper(sqlite3_recover *p){
16864 sqlite3_file *pFd = 0;
16865 recoverAssertMutexHeld();
16866 sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
16867 if( pFd && pFd->pMethods ){
16868 pFd->pMethods = recover_g.pMethods;
16869 recover_g.pMethods = 0;
16870 recover_g.p = 0;
16871 }
16872 }
16873
16874 /*
16875 ** This function does the work of a single sqlite3_recover_step() call. It
16876 ** is guaranteed that the handle is not in an error state when this
16877 ** function is called.
16878 */
16879 static void recoverStep(sqlite3_recover *p){
16880 assert( p && p->errCode==SQLITE_OK );
16881 switch( p->eState ){
16882 case RECOVER_STATE_INIT:
16883 /* This is the very first call to sqlite3_recover_step() on this object.
16884 */
16885 recoverSqlCallback(p, "BEGIN");
16886 recoverSqlCallback(p, "PRAGMA writable_schema = on");
16887
16888 recoverEnterMutex();
16889 recoverInstallWrapper(p);
16890
16891 /* Open the output database. And register required virtual tables and
16892 ** user functions with the new handle. */
16893 recoverOpenOutput(p);
16894
16895 /* Open transactions on both the input and output databases. */
16896 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
16897 recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
16898 recoverExec(p, p->dbIn, "BEGIN");
16899 if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
16900 recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
16901 recoverTransferSettings(p);
16902 recoverOpenRecovery(p);
16903 recoverCacheSchema(p);
16904
16905 recoverUninstallWrapper(p);
16906 recoverLeaveMutex();
16907
16908 recoverExec(p, p->dbOut, "BEGIN");
16909
16910 recoverWriteSchema1(p);
16911 p->eState = RECOVER_STATE_WRITING;
16912 break;
16913
16914 case RECOVER_STATE_WRITING: {
16915 if( p->w1.pTbls==0 ){
16916 recoverWriteDataInit(p);
16917 }
16918 if( SQLITE_DONE==recoverWriteDataStep(p) ){
16919 recoverWriteDataCleanup(p);
16920 if( p->zLostAndFound ){
16921 p->eState = RECOVER_STATE_LOSTANDFOUND1;
16922 }else{
16923 p->eState = RECOVER_STATE_SCHEMA2;
16924 }
16925 }
16926 break;
16927 }
16928
16929 case RECOVER_STATE_LOSTANDFOUND1: {
16930 if( p->laf.pUsed==0 ){
16931 recoverLostAndFound1Init(p);
16932 }
16933 if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
16934 p->eState = RECOVER_STATE_LOSTANDFOUND2;
16935 }
16936 break;
16937 }
16938 case RECOVER_STATE_LOSTANDFOUND2: {
16939 if( p->laf.pAllAndParent==0 ){
16940 recoverLostAndFound2Init(p);
16941 }
16942 if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
16943 p->eState = RECOVER_STATE_LOSTANDFOUND3;
16944 }
16945 break;
16946 }
16947
16948 case RECOVER_STATE_LOSTANDFOUND3: {
16949 if( p->laf.pInsert==0 ){
16950 recoverLostAndFound3Init(p);
16951 }
16952 if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
16953 p->eState = RECOVER_STATE_SCHEMA2;
16954 }
16955 break;
16956 }
16957
16958 case RECOVER_STATE_SCHEMA2: {
16959 int rc = SQLITE_OK;
16960
16961 recoverWriteSchema2(p);
16962 p->eState = RECOVER_STATE_DONE;
16963
16964 /* If no error has occurred, commit the write transaction on the output
16965 ** database. Regardless of whether or not an error has occurred, make
16966 ** an attempt to end the read transaction on the input database. */
16967 recoverExec(p, p->dbOut, "COMMIT");
16968 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
16969 if( p->errCode==SQLITE_OK ) p->errCode = rc;
16970
16971 recoverSqlCallback(p, "PRAGMA writable_schema = off");
16972 recoverSqlCallback(p, "COMMIT");
16973 p->eState = RECOVER_STATE_DONE;
16974 recoverFinalCleanup(p);
16975 break;
16976 };
16977
16978 case RECOVER_STATE_DONE: {
16979 /* no-op */
16980 break;
16981 };
16982 }
16983 }
16984
16985
16986 /*
16987 ** This is a worker function that does the heavy lifting for both init
16988 ** functions:
16989 **
16990 ** sqlite3_recover_init()
16991 ** sqlite3_recover_init_sql()
16992 **
16993 ** All this function does is allocate space for the recover handle and
16994 ** take copies of the input parameters. All the real work is done within
16995 ** sqlite3_recover_run().
16996 */
16997 sqlite3_recover *recoverInit(
16998 sqlite3* db,
16999 const char *zDb,
17000 const char *zUri, /* Output URI for _recover_init() */
17001 int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
17002 void *pSqlCtx /* Context arg for _recover_init_sql() */
17003 ){
17004 sqlite3_recover *pRet = 0;
17005 int nDb = 0;
17006 int nUri = 0;
17007 int nByte = 0;
17008
17009 if( zDb==0 ){ zDb = "main"; }
17010
17011 nDb = recoverStrlen(zDb);
17012 nUri = recoverStrlen(zUri);
17013
17014 nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
17015 pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
17016 if( pRet ){
17017 memset(pRet, 0, nByte);
17018 pRet->dbIn = db;
17019 pRet->zDb = (char*)&pRet[1];
17020 pRet->zUri = &pRet->zDb[nDb+1];
17021 memcpy(pRet->zDb, zDb, nDb);
17022 if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
17023 pRet->xSql = xSql;
17024 pRet->pSqlCtx = pSqlCtx;
17025 pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
17026 }
17027
17028 return pRet;
17029 }
17030
17031 /*
17032 ** Initialize a recovery handle that creates a new database containing
17033 ** the recovered data.
17034 */
17035 sqlite3_recover *sqlite3_recover_init(
17036 sqlite3* db,
17037 const char *zDb,
17038 const char *zUri
17039 ){
17040 return recoverInit(db, zDb, zUri, 0, 0);
17041 }
17042
17043 /*
17044 ** Initialize a recovery handle that returns recovered data in the
17045 ** form of SQL statements via a callback.
17046 */
17047 sqlite3_recover *sqlite3_recover_init_sql(
17048 sqlite3* db,
17049 const char *zDb,
17050 int (*xSql)(void*, const char*),
17051 void *pSqlCtx
17052 ){
17053 return recoverInit(db, zDb, 0, xSql, pSqlCtx);
17054 }
17055
17056 /*
17057 ** Return the handle error message, if any.
17058 */
17059 const char *sqlite3_recover_errmsg(sqlite3_recover *p){
17060 return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
17061 }
17062
17063 /*
17064 ** Return the handle error code.
17065 */
17066 int sqlite3_recover_errcode(sqlite3_recover *p){
17067 return p ? p->errCode : SQLITE_NOMEM;
17068 }
17069
17070 /*
17071 ** Configure the handle.
17072 */
17073 int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
17074 int rc = SQLITE_OK;
17075 if( p==0 ){
17076 rc = SQLITE_NOMEM;
17077 }else if( p->eState!=RECOVER_STATE_INIT ){
17078 rc = SQLITE_MISUSE;
17079 }else{
17080 switch( op ){
17081 case 789:
17082 /* This undocumented magic configuration option is used to set the
17083 ** name of the auxiliary database that is ATTACH-ed to the database
17084 ** connection and used to hold state information during the
17085 ** recovery process. This option is for debugging use only and
17086 ** is subject to change or removal at any time. */
17087 sqlite3_free(p->zStateDb);
17088 p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
17089 break;
17090
17091 case SQLITE_RECOVER_LOST_AND_FOUND: {
17092 const char *zArg = (const char*)pArg;
17093 sqlite3_free(p->zLostAndFound);
17094 if( zArg ){
17095 p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
17096 }else{
17097 p->zLostAndFound = 0;
17098 }
17099 break;
17100 }
17101
17102 case SQLITE_RECOVER_FREELIST_CORRUPT:
17103 p->bFreelistCorrupt = *(int*)pArg;
17104 break;
17105
17106 case SQLITE_RECOVER_ROWIDS:
17107 p->bRecoverRowid = *(int*)pArg;
17108 break;
17109
17110 case SQLITE_RECOVER_SLOWINDEXES:
17111 p->bSlowIndexes = *(int*)pArg;
17112 break;
17113
17114 default:
17115 rc = SQLITE_NOTFOUND;
17116 break;
17117 }
17118 }
17119
17120 return rc;
17121 }
17122
17123 /*
17124 ** Do a unit of work towards the recovery job. Return SQLITE_OK if
17125 ** no error has occurred but database recovery is not finished, SQLITE_DONE
17126 ** if database recovery has been successfully completed, or an SQLite
17127 ** error code if an error has occurred.
17128 */
17129 int sqlite3_recover_step(sqlite3_recover *p){
17130 if( p==0 ) return SQLITE_NOMEM;
17131 if( p->errCode==SQLITE_OK ) recoverStep(p);
17132 if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
17133 return SQLITE_DONE;
17134 }
17135 return p->errCode;
17136 }
17137
17138 /*
17139 ** Do the configured recovery operation. Return SQLITE_OK if successful, or
17140 ** else an SQLite error code.
17141 */
17142 int sqlite3_recover_run(sqlite3_recover *p){
17143 while( SQLITE_OK==sqlite3_recover_step(p) );
17144 return sqlite3_recover_errcode(p);
17145 }
17146
17147
17148 /*
17149 ** Free all resources associated with the recover handle passed as the only
17150 ** argument. The results of using a handle with any sqlite3_recover_**
17151 ** API function after it has been passed to this function are undefined.
17152 **
17153 ** A copy of the value returned by the first call made to sqlite3_recover_run()
17154 ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
17155 ** not been called on this handle.
17156 */
17157 int sqlite3_recover_finish(sqlite3_recover *p){
17158 int rc;
17159 if( p==0 ){
17160 rc = SQLITE_NOMEM;
17161 }else{
17162 recoverFinalCleanup(p);
17163 if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
17164 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
17165 if( p->errCode==SQLITE_OK ) p->errCode = rc;
17166 }
17167 rc = p->errCode;
17168 sqlite3_free(p->zErrMsg);
17169 sqlite3_free(p->zStateDb);
17170 sqlite3_free(p->zLostAndFound);
17171 sqlite3_free(p->pPage1Cache);
17172 sqlite3_free(p);
17173 }
17174 return rc;
17175 }
17176
17177 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
17178
17179 /************************* End ../ext/recover/sqlite3recover.c ********************/
17180 # endif /* SQLITE_HAVE_SQLITE3R */
17181 #endif
17182 #ifdef SQLITE_SHELL_EXTSRC
17183 # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
17184 #endif
17185
17186 #if defined(SQLITE_ENABLE_SESSION)
17187 /*
17188 ** State information for a single open session
17189 */
17190 typedef struct OpenSession OpenSession;
17191 struct OpenSession {
17192 char *zName; /* Symbolic name for this session */
17193 int nFilter; /* Number of xFilter rejection GLOB patterns */
17194 char **azFilter; /* Array of xFilter rejection GLOB patterns */
17195 sqlite3_session *p; /* The open session */
17196 };
17197 #endif
17198
17199 typedef struct ExpertInfo ExpertInfo;
17200 struct ExpertInfo {
17201 sqlite3expert *pExpert;
17202 int bVerbose;
17203 };
17204
17205 /* A single line in the EQP output */
17206 typedef struct EQPGraphRow EQPGraphRow;
17207 struct EQPGraphRow {
17208 int iEqpId; /* ID for this row */
17209 int iParentId; /* ID of the parent row */
17210 EQPGraphRow *pNext; /* Next row in sequence */
17211 char zText[1]; /* Text to display for this row */
17212 };
17213
17214 /* All EQP output is collected into an instance of the following */
17215 typedef struct EQPGraph EQPGraph;
17216 struct EQPGraph {
17217 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
17218 EQPGraphRow *pLast; /* Last element of the pRow list */
17219 char zPrefix[100]; /* Graph prefix */
17220 };
17221
17222 /* Parameters affecting columnar mode result display (defaulting together) */
17223 typedef struct ColModeOpts {
17224 int iWrap; /* In columnar modes, wrap lines reaching this limit */
17225 u8 bQuote; /* Quote results for .mode box and table */
17226 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */
17227 } ColModeOpts;
17228 #define ColModeOpts_default { 60, 0, 0 }
17229 #define ColModeOpts_default_qbox { 60, 1, 0 }
17230
17231 /*
17232 ** State information about the database connection is contained in an
17233 ** instance of the following structure.
17234 */
17235 typedef struct ShellState ShellState;
17236 struct ShellState {
17237 sqlite3 *db; /* The database */
17238 u8 autoExplain; /* Automatically turn on .explain mode */
17239 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
17240 u8 autoEQPtest; /* autoEQP is in test mode */
17241 u8 autoEQPtrace; /* autoEQP is in trace mode */
17242 u8 scanstatsOn; /* True to display scan stats before each finalize */
17243 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
17244 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
17245 u8 nEqpLevel; /* Depth of the EQP output graph */
17246 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */
17247 u8 bSafeMode; /* True to prohibit unsafe operations */
17248 u8 bSafeModePersist; /* The long-term value of bSafeMode */
17249 ColModeOpts cmOpts; /* Option values affecting columnar mode output */
17250 unsigned statsOn; /* True to display memory stats before each finalize */
17251 unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */
17252 int inputNesting; /* Track nesting level of .read and other redirects */
17253 int outCount; /* Revert to stdout when reaching zero */
17254 int cnt; /* Number of records displayed so far */
17255 int lineno; /* Line number of last line read from in */
17256 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */
17257 FILE *in; /* Read commands from this stream */
17258 FILE *out; /* Write results here */
17259 FILE *traceOut; /* Output for sqlite3_trace() */
17260 int nErr; /* Number of errors seen */
17261 int mode; /* An output mode setting */
17262 int modePrior; /* Saved mode */
17263 int cMode; /* temporary output mode for the current query */
17264 int normalMode; /* Output mode before ".explain on" */
17265 int writableSchema; /* True if PRAGMA writable_schema=ON */
17266 int showHeader; /* True to show column names in List or Column mode */
17267 int nCheck; /* Number of ".check" commands run */
17268 unsigned nProgress; /* Number of progress callbacks encountered */
17269 unsigned mxProgress; /* Maximum progress callbacks before failing */
17270 unsigned flgProgress; /* Flags for the progress callback */
17271 unsigned shellFlgs; /* Various flags */
17272 unsigned priorShFlgs; /* Saved copy of flags */
17273 sqlite3_int64 szMax; /* --maxsize argument to .open */
17274 char *zDestTable; /* Name of destination table when MODE_Insert */
17275 char *zTempFile; /* Temporary file that might need deleting */
17276 char zTestcase[30]; /* Name of current test case */
17277 char colSeparator[20]; /* Column separator character for several modes */
17278 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
17279 char colSepPrior[20]; /* Saved column separator */
17280 char rowSepPrior[20]; /* Saved row separator */
17281 int *colWidth; /* Requested width of each column in columnar modes */
17282 int *actualWidth; /* Actual width of each column */
17283 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */
17284 char nullValue[20]; /* The text to print when a NULL comes back from
17285 ** the database */
17286 char outfile[FILENAME_MAX]; /* Filename for *out */
17287 sqlite3_stmt *pStmt; /* Current statement if any. */
17288 FILE *pLog; /* Write log output here */
17289 struct AuxDb { /* Storage space for auxiliary database connections */
17290 sqlite3 *db; /* Connection pointer */
17291 const char *zDbFilename; /* Filename used to open the connection */
17292 char *zFreeOnClose; /* Free this memory allocation on close */
17293 #if defined(SQLITE_ENABLE_SESSION)
17294 int nSession; /* Number of active sessions */
17295 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
17296 #endif
17297 } aAuxDb[5], /* Array of all database connections */
17298 *pAuxDb; /* Currently active database connection */
17299 int *aiIndent; /* Array of indents used in MODE_Explain */
17300 int nIndent; /* Size of array aiIndent[] */
17301 int iIndent; /* Index of current op in aiIndent[] */
17302 char *zNonce; /* Nonce for temporary safe-mode escapes */
17303 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
17304 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
17305 #ifdef SQLITE_SHELL_FIDDLE
17306 struct {
17307 const char * zInput; /* Input string from wasm/JS proxy */
17308 const char * zPos; /* Cursor pos into zInput */
17309 const char * zDefaultDbName; /* Default name for db file */
17310 } wasm;
17311 #endif
17312 };
17313
17314 #ifdef SQLITE_SHELL_FIDDLE
17315 static ShellState shellState;
17316 #endif
17317
17318
17319 /* Allowed values for ShellState.autoEQP
17320 */
17321 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
17322 #define AUTOEQP_on 1 /* Automatic EQP is on */
17323 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */
17324 #define AUTOEQP_full 3 /* Show full EXPLAIN */
17325
17326 /* Allowed values for ShellState.openMode
17327 */
17328 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
17329 #define SHELL_OPEN_NORMAL 1 /* Normal database file */
17330 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
17331 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
17332 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
17333 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */
17334 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */
17335
17336 /* Allowed values for ShellState.eTraceType
17337 */
17338 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */
17339 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */
17340 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */
17341
17342 /* Bits in the ShellState.flgProgress variable */
17343 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */
17344 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progress
17345 ** callback limit is reached, and for each
17346 ** top-level SQL statement */
17347 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */
17348
17349 /*
17350 ** These are the allowed shellFlgs values
17351 */
17352 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
17353 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
17354 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
17355 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
17356 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
17357 #define SHFLG_CountChanges 0x00000020 /* .changes setting */
17358 #define SHFLG_Echo 0x00000040 /* .echo on/off, or --echo setting */
17359 #define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */
17360 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */
17361 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */
17362 #define SHFLG_TestingMode 0x00000400 /* allow unsafe testing features */
17363
17364 /*
17365 ** Macros for testing and setting shellFlgs
17366 */
17367 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
17368 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
17369 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
17370
17371 /*
17372 ** These are the allowed modes.
17373 */
17374 #define MODE_Line 0 /* One column per line. Blank line between records */
17375 #define MODE_Column 1 /* One record per line in neat columns */
17376 #define MODE_List 2 /* One record per line with a separator */
17377 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
17378 #define MODE_Html 4 /* Generate an XHTML table */
17379 #define MODE_Insert 5 /* Generate SQL "insert" statements */
17380 #define MODE_Quote 6 /* Quote values as for SQL */
17381 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
17382 #define MODE_Csv 8 /* Quote strings, numbers are plain */
17383 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
17384 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
17385 #define MODE_Pretty 11 /* Pretty-print schemas */
17386 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
17387 #define MODE_Json 13 /* Output JSON */
17388 #define MODE_Markdown 14 /* Markdown formatting */
17389 #define MODE_Table 15 /* MySQL-style table formatting */
17390 #define MODE_Box 16 /* Unicode box-drawing characters */
17391 #define MODE_Count 17 /* Output only a count of the rows of output */
17392 #define MODE_Off 18 /* No query output shown */
17393 #define MODE_ScanExp 19 /* Like MODE_Explain, but for ".scanstats vm" */
17394
17395 static const char *modeDescr[] = {
17396 "line",
17397 "column",
17398 "list",
17399 "semi",
17400 "html",
17401 "insert",
17402 "quote",
17403 "tcl",
17404 "csv",
17405 "explain",
17406 "ascii",
17407 "prettyprint",
17408 "eqp",
17409 "json",
17410 "markdown",
17411 "table",
17412 "box",
17413 "count",
17414 "off"
17415 };
17416
17417 /*
17418 ** These are the column/row/line separators used by the various
17419 ** import/export modes.
17420 */
17421 #define SEP_Column "|"
17422 #define SEP_Row "\n"
17423 #define SEP_Tab "\t"
17424 #define SEP_Space " "
17425 #define SEP_Comma ","
17426 #define SEP_CrLf "\r\n"
17427 #define SEP_Unit "\x1F"
17428 #define SEP_Record "\x1E"
17429
17430 /*
17431 ** Limit input nesting via .read or any other input redirect.
17432 ** It's not too expensive, so a generous allowance can be made.
17433 */
17434 #define MAX_INPUT_NESTING 25
17435
17436 /*
17437 ** A callback for the sqlite3_log() interface.
17438 */
17439 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
17440 ShellState *p = (ShellState*)pArg;
17441 if( p->pLog==0 ) return;
17442 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
17443 fflush(p->pLog);
17444 }
17445
17446 /*
17447 ** SQL function: shell_putsnl(X)
17448 **
17449 ** Write the text X to the screen (or whatever output is being directed)
17450 ** adding a newline at the end, and then return X.
17451 */
17452 static void shellPutsFunc(
17453 sqlite3_context *pCtx,
17454 int nVal,
17455 sqlite3_value **apVal
17456 ){
17457 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
17458 (void)nVal;
17459 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
17460 sqlite3_result_value(pCtx, apVal[0]);
17461 }
17462
17463 /*
17464 ** If in safe mode, print an error message described by the arguments
17465 ** and exit immediately.
17466 */
17467 static void failIfSafeMode(
17468 ShellState *p,
17469 const char *zErrMsg,
17470 ...
17471 ){
17472 if( p->bSafeMode ){
17473 va_list ap;
17474 char *zMsg;
17475 va_start(ap, zErrMsg);
17476 zMsg = sqlite3_vmprintf(zErrMsg, ap);
17477 va_end(ap);
17478 raw_printf(stderr, "line %d: ", p->lineno);
17479 utf8_printf(stderr, "%s\n", zMsg);
17480 exit(1);
17481 }
17482 }
17483
17484 /*
17485 ** SQL function: edit(VALUE)
17486 ** edit(VALUE,EDITOR)
17487 **
17488 ** These steps:
17489 **
17490 ** (1) Write VALUE into a temporary file.
17491 ** (2) Run program EDITOR on that temporary file.
17492 ** (3) Read the temporary file back and return its content as the result.
17493 ** (4) Delete the temporary file
17494 **
17495 ** If the EDITOR argument is omitted, use the value in the VISUAL
17496 ** environment variable. If still there is no EDITOR, through an error.
17497 **
17498 ** Also throw an error if the EDITOR program returns a non-zero exit code.
17499 */
17500 #ifndef SQLITE_NOHAVE_SYSTEM
17501 static void editFunc(
17502 sqlite3_context *context,
17503 int argc,
17504 sqlite3_value **argv
17505 ){
17506 const char *zEditor;
17507 char *zTempFile = 0;
17508 sqlite3 *db;
17509 char *zCmd = 0;
17510 int bBin;
17511 int rc;
17512 int hasCRNL = 0;
17513 FILE *f = 0;
17514 sqlite3_int64 sz;
17515 sqlite3_int64 x;
17516 unsigned char *p = 0;
17517
17518 if( argc==2 ){
17519 zEditor = (const char*)sqlite3_value_text(argv[1]);
17520 }else{
17521 zEditor = getenv("VISUAL");
17522 }
17523 if( zEditor==0 ){
17524 sqlite3_result_error(context, "no editor for edit()", -1);
17525 return;
17526 }
17527 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
17528 sqlite3_result_error(context, "NULL input to edit()", -1);
17529 return;
17530 }
17531 db = sqlite3_context_db_handle(context);
17532 zTempFile = 0;
17533 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
17534 if( zTempFile==0 ){
17535 sqlite3_uint64 r = 0;
17536 sqlite3_randomness(sizeof(r), &r);
17537 zTempFile = sqlite3_mprintf("temp%llx", r);
17538 if( zTempFile==0 ){
17539 sqlite3_result_error_nomem(context);
17540 return;
17541 }
17542 }
17543 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
17544 /* When writing the file to be edited, do \n to \r\n conversions on systems
17545 ** that want \r\n line endings */
17546 f = fopen(zTempFile, bBin ? "wb" : "w");
17547 if( f==0 ){
17548 sqlite3_result_error(context, "edit() cannot open temp file", -1);
17549 goto edit_func_end;
17550 }
17551 sz = sqlite3_value_bytes(argv[0]);
17552 if( bBin ){
17553 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
17554 }else{
17555 const char *z = (const char*)sqlite3_value_text(argv[0]);
17556 /* Remember whether or not the value originally contained \r\n */
17557 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
17558 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
17559 }
17560 fclose(f);
17561 f = 0;
17562 if( x!=sz ){
17563 sqlite3_result_error(context, "edit() could not write the whole file", -1);
17564 goto edit_func_end;
17565 }
17566 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
17567 if( zCmd==0 ){
17568 sqlite3_result_error_nomem(context);
17569 goto edit_func_end;
17570 }
17571 rc = system(zCmd);
17572 sqlite3_free(zCmd);
17573 if( rc ){
17574 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
17575 goto edit_func_end;
17576 }
17577 f = fopen(zTempFile, "rb");
17578 if( f==0 ){
17579 sqlite3_result_error(context,
17580 "edit() cannot reopen temp file after edit", -1);
17581 goto edit_func_end;
17582 }
17583 fseek(f, 0, SEEK_END);
17584 sz = ftell(f);
17585 rewind(f);
17586 p = sqlite3_malloc64( sz+1 );
17587 if( p==0 ){
17588 sqlite3_result_error_nomem(context);
17589 goto edit_func_end;
17590 }
17591 x = fread(p, 1, (size_t)sz, f);
17592 fclose(f);
17593 f = 0;
17594 if( x!=sz ){
17595 sqlite3_result_error(context, "could not read back the whole file", -1);
17596 goto edit_func_end;
17597 }
17598 if( bBin ){
17599 sqlite3_result_blob64(context, p, sz, sqlite3_free);
17600 }else{
17601 sqlite3_int64 i, j;
17602 if( hasCRNL ){
17603 /* If the original contains \r\n then do no conversions back to \n */
17604 }else{
17605 /* If the file did not originally contain \r\n then convert any new
17606 ** \r\n back into \n */
17607 p[sz] = 0;
17608 for(i=j=0; i<sz; i++){
17609 if( p[i]=='\r' && p[i+1]=='\n' ) i++;
17610 p[j++] = p[i];
17611 }
17612 sz = j;
17613 p[sz] = 0;
17614 }
17615 sqlite3_result_text64(context, (const char*)p, sz,
17616 sqlite3_free, SQLITE_UTF8);
17617 }
17618 p = 0;
17619
17620 edit_func_end:
17621 if( f ) fclose(f);
17622 unlink(zTempFile);
17623 sqlite3_free(zTempFile);
17624 sqlite3_free(p);
17625 }
17626 #endif /* SQLITE_NOHAVE_SYSTEM */
17627
17628 /*
17629 ** Save or restore the current output mode
17630 */
17631 static void outputModePush(ShellState *p){
17632 p->modePrior = p->mode;
17633 p->priorShFlgs = p->shellFlgs;
17634 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
17635 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
17636 }
17637 static void outputModePop(ShellState *p){
17638 p->mode = p->modePrior;
17639 p->shellFlgs = p->priorShFlgs;
17640 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
17641 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
17642 }
17643
17644 /*
17645 ** Output the given string as a hex-encoded blob (eg. X'1234' )
17646 */
17647 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
17648 int i;
17649 unsigned char *aBlob = (unsigned char*)pBlob;
17650
17651 char *zStr = sqlite3_malloc(nBlob*2 + 1);
17652 shell_check_oom(zStr);
17653
17654 for(i=0; i<nBlob; i++){
17655 static const char aHex[] = {
17656 '0', '1', '2', '3', '4', '5', '6', '7',
17657 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
17658 };
17659 zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
17660 zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
17661 }
17662 zStr[i*2] = '\0';
17663
17664 raw_printf(out,"X'%s'", zStr);
17665 sqlite3_free(zStr);
17666 }
17667
17668 /*
17669 ** Find a string that is not found anywhere in z[]. Return a pointer
17670 ** to that string.
17671 **
17672 ** Try to use zA and zB first. If both of those are already found in z[]
17673 ** then make up some string and store it in the buffer zBuf.
17674 */
17675 static const char *unused_string(
17676 const char *z, /* Result must not appear anywhere in z */
17677 const char *zA, const char *zB, /* Try these first */
17678 char *zBuf /* Space to store a generated string */
17679 ){
17680 unsigned i = 0;
17681 if( strstr(z, zA)==0 ) return zA;
17682 if( strstr(z, zB)==0 ) return zB;
17683 do{
17684 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
17685 }while( strstr(z,zBuf)!=0 );
17686 return zBuf;
17687 }
17688
17689 /*
17690 ** Output the given string as a quoted string using SQL quoting conventions.
17691 **
17692 ** See also: output_quoted_escaped_string()
17693 */
17694 static void output_quoted_string(FILE *out, const char *z){
17695 int i;
17696 char c;
17697 setBinaryMode(out, 1);
17698 if( z==0 ) return;
17699 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
17700 if( c==0 ){
17701 utf8_printf(out,"'%s'",z);
17702 }else{
17703 raw_printf(out, "'");
17704 while( *z ){
17705 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
17706 if( c=='\'' ) i++;
17707 if( i ){
17708 utf8_printf(out, "%.*s", i, z);
17709 z += i;
17710 }
17711 if( c=='\'' ){
17712 raw_printf(out, "'");
17713 continue;
17714 }
17715 if( c==0 ){
17716 break;
17717 }
17718 z++;
17719 }
17720 raw_printf(out, "'");
17721 }
17722 setTextMode(out, 1);
17723 }
17724
17725 /*
17726 ** Output the given string as a quoted string using SQL quoting conventions.
17727 ** Additionallly , escape the "\n" and "\r" characters so that they do not
17728 ** get corrupted by end-of-line translation facilities in some operating
17729 ** systems.
17730 **
17731 ** This is like output_quoted_string() but with the addition of the \r\n
17732 ** escape mechanism.
17733 */
17734 static void output_quoted_escaped_string(FILE *out, const char *z){
17735 int i;
17736 char c;
17737 setBinaryMode(out, 1);
17738 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
17739 if( c==0 ){
17740 utf8_printf(out,"'%s'",z);
17741 }else{
17742 const char *zNL = 0;
17743 const char *zCR = 0;
17744 int nNL = 0;
17745 int nCR = 0;
17746 char zBuf1[20], zBuf2[20];
17747 for(i=0; z[i]; i++){
17748 if( z[i]=='\n' ) nNL++;
17749 if( z[i]=='\r' ) nCR++;
17750 }
17751 if( nNL ){
17752 raw_printf(out, "replace(");
17753 zNL = unused_string(z, "\\n", "\\012", zBuf1);
17754 }
17755 if( nCR ){
17756 raw_printf(out, "replace(");
17757 zCR = unused_string(z, "\\r", "\\015", zBuf2);
17758 }
17759 raw_printf(out, "'");
17760 while( *z ){
17761 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
17762 if( c=='\'' ) i++;
17763 if( i ){
17764 utf8_printf(out, "%.*s", i, z);
17765 z += i;
17766 }
17767 if( c=='\'' ){
17768 raw_printf(out, "'");
17769 continue;
17770 }
17771 if( c==0 ){
17772 break;
17773 }
17774 z++;
17775 if( c=='\n' ){
17776 raw_printf(out, "%s", zNL);
17777 continue;
17778 }
17779 raw_printf(out, "%s", zCR);
17780 }
17781 raw_printf(out, "'");
17782 if( nCR ){
17783 raw_printf(out, ",'%s',char(13))", zCR);
17784 }
17785 if( nNL ){
17786 raw_printf(out, ",'%s',char(10))", zNL);
17787 }
17788 }
17789 setTextMode(out, 1);
17790 }
17791
17792 /*
17793 ** Output the given string as a quoted according to C or TCL quoting rules.
17794 */
17795 static void output_c_string(FILE *out, const char *z){
17796 unsigned int c;
17797 fputc('"', out);
17798 while( (c = *(z++))!=0 ){
17799 if( c=='\\' ){
17800 fputc(c, out);
17801 fputc(c, out);
17802 }else if( c=='"' ){
17803 fputc('\\', out);
17804 fputc('"', out);
17805 }else if( c=='\t' ){
17806 fputc('\\', out);
17807 fputc('t', out);
17808 }else if( c=='\n' ){
17809 fputc('\\', out);
17810 fputc('n', out);
17811 }else if( c=='\r' ){
17812 fputc('\\', out);
17813 fputc('r', out);
17814 }else if( !isprint(c&0xff) ){
17815 raw_printf(out, "\\%03o", c&0xff);
17816 }else{
17817 fputc(c, out);
17818 }
17819 }
17820 fputc('"', out);
17821 }
17822
17823 /*
17824 ** Output the given string as a quoted according to JSON quoting rules.
17825 */
17826 static void output_json_string(FILE *out, const char *z, i64 n){
17827 unsigned int c;
17828 if( z==0 ) z = "";
17829 if( n<0 ) n = strlen(z);
17830 fputc('"', out);
17831 while( n-- ){
17832 c = *(z++);
17833 if( c=='\\' || c=='"' ){
17834 fputc('\\', out);
17835 fputc(c, out);
17836 }else if( c<=0x1f ){
17837 fputc('\\', out);
17838 if( c=='\b' ){
17839 fputc('b', out);
17840 }else if( c=='\f' ){
17841 fputc('f', out);
17842 }else if( c=='\n' ){
17843 fputc('n', out);
17844 }else if( c=='\r' ){
17845 fputc('r', out);
17846 }else if( c=='\t' ){
17847 fputc('t', out);
17848 }else{
17849 raw_printf(out, "u%04x",c);
17850 }
17851 }else{
17852 fputc(c, out);
17853 }
17854 }
17855 fputc('"', out);
17856 }
17857
17858 /*
17859 ** Output the given string with characters that are special to
17860 ** HTML escaped.
17861 */
17862 static void output_html_string(FILE *out, const char *z){
17863 int i;
17864 if( z==0 ) z = "";
17865 while( *z ){
17866 for(i=0; z[i]
17867 && z[i]!='<'
17868 && z[i]!='&'
17869 && z[i]!='>'
17870 && z[i]!='\"'
17871 && z[i]!='\'';
17872 i++){}
17873 if( i>0 ){
17874 utf8_printf(out,"%.*s",i,z);
17875 }
17876 if( z[i]=='<' ){
17877 raw_printf(out,"&lt;");
17878 }else if( z[i]=='&' ){
17879 raw_printf(out,"&amp;");
17880 }else if( z[i]=='>' ){
17881 raw_printf(out,"&gt;");
17882 }else if( z[i]=='\"' ){
17883 raw_printf(out,"&quot;");
17884 }else if( z[i]=='\'' ){
17885 raw_printf(out,"&#39;");
17886 }else{
17887 break;
17888 }
17889 z += i + 1;
17890 }
17891 }
17892
17893 /*
17894 ** If a field contains any character identified by a 1 in the following
17895 ** array, then the string must be quoted for CSV.
17896 */
17897 static const char needCsvQuote[] = {
17898 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17899 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17900 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
17901 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17902 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17903 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17904 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17905 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
17906 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17907 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17908 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17909 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17910 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17911 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17912 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17913 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
17914 };
17915
17916 /*
17917 ** Output a single term of CSV. Actually, p->colSeparator is used for
17918 ** the separator, which may or may not be a comma. p->nullValue is
17919 ** the null value. Strings are quoted if necessary. The separator
17920 ** is only issued if bSep is true.
17921 */
17922 static void output_csv(ShellState *p, const char *z, int bSep){
17923 FILE *out = p->out;
17924 if( z==0 ){
17925 utf8_printf(out,"%s",p->nullValue);
17926 }else{
17927 unsigned i;
17928 for(i=0; z[i]; i++){
17929 if( needCsvQuote[((unsigned char*)z)[i]] ){
17930 i = 0;
17931 break;
17932 }
17933 }
17934 if( i==0 || strstr(z, p->colSeparator)!=0 ){
17935 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
17936 shell_check_oom(zQuoted);
17937 utf8_printf(out, "%s", zQuoted);
17938 sqlite3_free(zQuoted);
17939 }else{
17940 utf8_printf(out, "%s", z);
17941 }
17942 }
17943 if( bSep ){
17944 utf8_printf(p->out, "%s", p->colSeparator);
17945 }
17946 }
17947
17948 /*
17949 ** This routine runs when the user presses Ctrl-C
17950 */
17951 static void interrupt_handler(int NotUsed){
17952 UNUSED_PARAMETER(NotUsed);
17953 if( ++seenInterrupt>1 ) exit(1);
17954 if( globalDb ) sqlite3_interrupt(globalDb);
17955 }
17956
17957 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
17958 /*
17959 ** This routine runs for console events (e.g. Ctrl-C) on Win32
17960 */
17961 static BOOL WINAPI ConsoleCtrlHandler(
17962 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
17963 ){
17964 if( dwCtrlType==CTRL_C_EVENT ){
17965 interrupt_handler(0);
17966 return TRUE;
17967 }
17968 return FALSE;
17969 }
17970 #endif
17971
17972 #ifndef SQLITE_OMIT_AUTHORIZATION
17973 /*
17974 ** This authorizer runs in safe mode.
17975 */
17976 static int safeModeAuth(
17977 void *pClientData,
17978 int op,
17979 const char *zA1,
17980 const char *zA2,
17981 const char *zA3,
17982 const char *zA4
17983 ){
17984 ShellState *p = (ShellState*)pClientData;
17985 static const char *azProhibitedFunctions[] = {
17986 "edit",
17987 "fts3_tokenizer",
17988 "load_extension",
17989 "readfile",
17990 "writefile",
17991 "zipfile",
17992 "zipfile_cds",
17993 };
17994 UNUSED_PARAMETER(zA1);
17995 UNUSED_PARAMETER(zA3);
17996 UNUSED_PARAMETER(zA4);
17997 switch( op ){
17998 case SQLITE_ATTACH: {
17999 #ifndef SQLITE_SHELL_FIDDLE
18000 /* In WASM builds the filesystem is a virtual sandbox, so
18001 ** there's no harm in using ATTACH. */
18002 failIfSafeMode(p, "cannot run ATTACH in safe mode");
18003 #endif
18004 break;
18005 }
18006 case SQLITE_FUNCTION: {
18007 int i;
18008 for(i=0; i<ArraySize(azProhibitedFunctions); i++){
18009 if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
18010 failIfSafeMode(p, "cannot use the %s() function in safe mode",
18011 azProhibitedFunctions[i]);
18012 }
18013 }
18014 break;
18015 }
18016 }
18017 return SQLITE_OK;
18018 }
18019
18020 /*
18021 ** When the ".auth ON" is set, the following authorizer callback is
18022 ** invoked. It always returns SQLITE_OK.
18023 */
18024 static int shellAuth(
18025 void *pClientData,
18026 int op,
18027 const char *zA1,
18028 const char *zA2,
18029 const char *zA3,
18030 const char *zA4
18031 ){
18032 ShellState *p = (ShellState*)pClientData;
18033 static const char *azAction[] = { 0,
18034 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
18035 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
18036 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
18037 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
18038 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
18039 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
18040 "PRAGMA", "READ", "SELECT",
18041 "TRANSACTION", "UPDATE", "ATTACH",
18042 "DETACH", "ALTER_TABLE", "REINDEX",
18043 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
18044 "FUNCTION", "SAVEPOINT", "RECURSIVE"
18045 };
18046 int i;
18047 const char *az[4];
18048 az[0] = zA1;
18049 az[1] = zA2;
18050 az[2] = zA3;
18051 az[3] = zA4;
18052 utf8_printf(p->out, "authorizer: %s", azAction[op]);
18053 for(i=0; i<4; i++){
18054 raw_printf(p->out, " ");
18055 if( az[i] ){
18056 output_c_string(p->out, az[i]);
18057 }else{
18058 raw_printf(p->out, "NULL");
18059 }
18060 }
18061 raw_printf(p->out, "\n");
18062 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
18063 return SQLITE_OK;
18064 }
18065 #endif
18066
18067 /*
18068 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
18069 **
18070 ** This routine converts some CREATE TABLE statements for shadow tables
18071 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
18072 **
18073 ** If the schema statement in z[] contains a start-of-comment and if
18074 ** sqlite3_complete() returns false, try to terminate the comment before
18075 ** printing the result. https://sqlite.org/forum/forumpost/d7be961c5c
18076 */
18077 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
18078 char *zToFree = 0;
18079 if( z==0 ) return;
18080 if( zTail==0 ) return;
18081 if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
18082 const char *zOrig = z;
18083 static const char *azTerm[] = { "", "*/", "\n" };
18084 int i;
18085 for(i=0; i<ArraySize(azTerm); i++){
18086 char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
18087 shell_check_oom(zNew);
18088 if( sqlite3_complete(zNew) ){
18089 size_t n = strlen(zNew);
18090 zNew[n-1] = 0;
18091 zToFree = zNew;
18092 z = zNew;
18093 break;
18094 }
18095 sqlite3_free(zNew);
18096 }
18097 }
18098 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
18099 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
18100 }else{
18101 utf8_printf(out, "%s%s", z, zTail);
18102 }
18103 sqlite3_free(zToFree);
18104 }
18105 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
18106 char c = z[n];
18107 z[n] = 0;
18108 printSchemaLine(out, z, zTail);
18109 z[n] = c;
18110 }
18111
18112 /*
18113 ** Return true if string z[] has nothing but whitespace and comments to the
18114 ** end of the first line.
18115 */
18116 static int wsToEol(const char *z){
18117 int i;
18118 for(i=0; z[i]; i++){
18119 if( z[i]=='\n' ) return 1;
18120 if( IsSpace(z[i]) ) continue;
18121 if( z[i]=='-' && z[i+1]=='-' ) return 1;
18122 return 0;
18123 }
18124 return 1;
18125 }
18126
18127 /*
18128 ** Add a new entry to the EXPLAIN QUERY PLAN data
18129 */
18130 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
18131 EQPGraphRow *pNew;
18132 i64 nText;
18133 if( zText==0 ) return;
18134 nText = strlen(zText);
18135 if( p->autoEQPtest ){
18136 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
18137 }
18138 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
18139 shell_check_oom(pNew);
18140 pNew->iEqpId = iEqpId;
18141 pNew->iParentId = p2;
18142 memcpy(pNew->zText, zText, nText+1);
18143 pNew->pNext = 0;
18144 if( p->sGraph.pLast ){
18145 p->sGraph.pLast->pNext = pNew;
18146 }else{
18147 p->sGraph.pRow = pNew;
18148 }
18149 p->sGraph.pLast = pNew;
18150 }
18151
18152 /*
18153 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
18154 ** in p->sGraph.
18155 */
18156 static void eqp_reset(ShellState *p){
18157 EQPGraphRow *pRow, *pNext;
18158 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
18159 pNext = pRow->pNext;
18160 sqlite3_free(pRow);
18161 }
18162 memset(&p->sGraph, 0, sizeof(p->sGraph));
18163 }
18164
18165 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
18166 ** pOld, or return the first such line if pOld is NULL
18167 */
18168 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
18169 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
18170 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
18171 return pRow;
18172 }
18173
18174 /* Render a single level of the graph that has iEqpId as its parent. Called
18175 ** recursively to render sublevels.
18176 */
18177 static void eqp_render_level(ShellState *p, int iEqpId){
18178 EQPGraphRow *pRow, *pNext;
18179 i64 n = strlen(p->sGraph.zPrefix);
18180 char *z;
18181 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
18182 pNext = eqp_next_row(p, iEqpId, pRow);
18183 z = pRow->zText;
18184 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
18185 pNext ? "|--" : "`--", z);
18186 if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
18187 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
18188 eqp_render_level(p, pRow->iEqpId);
18189 p->sGraph.zPrefix[n] = 0;
18190 }
18191 }
18192 }
18193
18194 /*
18195 ** Display and reset the EXPLAIN QUERY PLAN data
18196 */
18197 static void eqp_render(ShellState *p, i64 nCycle){
18198 EQPGraphRow *pRow = p->sGraph.pRow;
18199 if( pRow ){
18200 if( pRow->zText[0]=='-' ){
18201 if( pRow->pNext==0 ){
18202 eqp_reset(p);
18203 return;
18204 }
18205 utf8_printf(p->out, "%s\n", pRow->zText+3);
18206 p->sGraph.pRow = pRow->pNext;
18207 sqlite3_free(pRow);
18208 }else if( nCycle>0 ){
18209 utf8_printf(p->out, "QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
18210 }else{
18211 utf8_printf(p->out, "QUERY PLAN\n");
18212 }
18213 p->sGraph.zPrefix[0] = 0;
18214 eqp_render_level(p, 0);
18215 eqp_reset(p);
18216 }
18217 }
18218
18219 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
18220 /*
18221 ** Progress handler callback.
18222 */
18223 static int progress_handler(void *pClientData) {
18224 ShellState *p = (ShellState*)pClientData;
18225 p->nProgress++;
18226 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
18227 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
18228 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
18229 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
18230 return 1;
18231 }
18232 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
18233 raw_printf(p->out, "Progress %u\n", p->nProgress);
18234 }
18235 return 0;
18236 }
18237 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
18238
18239 /*
18240 ** Print N dashes
18241 */
18242 static void print_dashes(FILE *out, int N){
18243 const char zDash[] = "--------------------------------------------------";
18244 const int nDash = sizeof(zDash) - 1;
18245 while( N>nDash ){
18246 fputs(zDash, out);
18247 N -= nDash;
18248 }
18249 raw_printf(out, "%.*s", N, zDash);
18250 }
18251
18252 /*
18253 ** Print a markdown or table-style row separator using ascii-art
18254 */
18255 static void print_row_separator(
18256 ShellState *p,
18257 int nArg,
18258 const char *zSep
18259 ){
18260 int i;
18261 if( nArg>0 ){
18262 fputs(zSep, p->out);
18263 print_dashes(p->out, p->actualWidth[0]+2);
18264 for(i=1; i<nArg; i++){
18265 fputs(zSep, p->out);
18266 print_dashes(p->out, p->actualWidth[i]+2);
18267 }
18268 fputs(zSep, p->out);
18269 }
18270 fputs("\n", p->out);
18271 }
18272
18273 /*
18274 ** This is the callback routine that the shell
18275 ** invokes for each row of a query result.
18276 */
18277 static int shell_callback(
18278 void *pArg,
18279 int nArg, /* Number of result columns */
18280 char **azArg, /* Text of each result column */
18281 char **azCol, /* Column names */
18282 int *aiType /* Column types. Might be NULL */
18283 ){
18284 int i;
18285 ShellState *p = (ShellState*)pArg;
18286
18287 if( azArg==0 ) return 0;
18288 switch( p->cMode ){
18289 case MODE_Count:
18290 case MODE_Off: {
18291 break;
18292 }
18293 case MODE_Line: {
18294 int w = 5;
18295 if( azArg==0 ) break;
18296 for(i=0; i<nArg; i++){
18297 int len = strlen30(azCol[i] ? azCol[i] : "");
18298 if( len>w ) w = len;
18299 }
18300 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
18301 for(i=0; i<nArg; i++){
18302 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
18303 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
18304 }
18305 break;
18306 }
18307 case MODE_ScanExp:
18308 case MODE_Explain: {
18309 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
18310 static const int aExplainMap[] = {0, 1, 2, 3, 4, 5, 6, 7 };
18311 static const int aScanExpWidth[] = {4, 6, 6, 13, 4, 4, 4, 13, 2, 13};
18312 static const int aScanExpMap[] = {0, 9, 8, 1, 2, 3, 4, 5, 6, 7 };
18313
18314 const int *aWidth = aExplainWidth;
18315 const int *aMap = aExplainMap;
18316 int nWidth = ArraySize(aExplainWidth);
18317 int iIndent = 1;
18318
18319 if( p->cMode==MODE_ScanExp ){
18320 aWidth = aScanExpWidth;
18321 aMap = aScanExpMap;
18322 nWidth = ArraySize(aScanExpWidth);
18323 iIndent = 3;
18324 }
18325 if( nArg>nWidth ) nArg = nWidth;
18326
18327 /* If this is the first row seen, print out the headers */
18328 if( p->cnt++==0 ){
18329 for(i=0; i<nArg; i++){
18330 utf8_width_print(p->out, aWidth[i], azCol[ aMap[i] ]);
18331 fputs(i==nArg-1 ? "\n" : " ", p->out);
18332 }
18333 for(i=0; i<nArg; i++){
18334 print_dashes(p->out, aWidth[i]);
18335 fputs(i==nArg-1 ? "\n" : " ", p->out);
18336 }
18337 }
18338
18339 /* If there is no data, exit early. */
18340 if( azArg==0 ) break;
18341
18342 for(i=0; i<nArg; i++){
18343 const char *zSep = " ";
18344 int w = aWidth[i];
18345 const char *zVal = azArg[ aMap[i] ];
18346 if( i==nArg-1 ) w = 0;
18347 if( zVal && strlenChar(zVal)>w ){
18348 w = strlenChar(zVal);
18349 zSep = " ";
18350 }
18351 if( i==iIndent && p->aiIndent && p->pStmt ){
18352 if( p->iIndent<p->nIndent ){
18353 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
18354 }
18355 p->iIndent++;
18356 }
18357 utf8_width_print(p->out, w, zVal ? zVal : p->nullValue);
18358 fputs(i==nArg-1 ? "\n" : zSep, p->out);
18359 }
18360 break;
18361 }
18362 case MODE_Semi: { /* .schema and .fullschema output */
18363 printSchemaLine(p->out, azArg[0], ";\n");
18364 break;
18365 }
18366 case MODE_Pretty: { /* .schema and .fullschema with --indent */
18367 char *z;
18368 int j;
18369 int nParen = 0;
18370 char cEnd = 0;
18371 char c;
18372 int nLine = 0;
18373 assert( nArg==1 );
18374 if( azArg[0]==0 ) break;
18375 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
18376 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
18377 ){
18378 utf8_printf(p->out, "%s;\n", azArg[0]);
18379 break;
18380 }
18381 z = sqlite3_mprintf("%s", azArg[0]);
18382 shell_check_oom(z);
18383 j = 0;
18384 for(i=0; IsSpace(z[i]); i++){}
18385 for(; (c = z[i])!=0; i++){
18386 if( IsSpace(c) ){
18387 if( z[j-1]=='\r' ) z[j-1] = '\n';
18388 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
18389 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
18390 j--;
18391 }
18392 z[j++] = c;
18393 }
18394 while( j>0 && IsSpace(z[j-1]) ){ j--; }
18395 z[j] = 0;
18396 if( strlen30(z)>=79 ){
18397 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
18398 if( c==cEnd ){
18399 cEnd = 0;
18400 }else if( c=='"' || c=='\'' || c=='`' ){
18401 cEnd = c;
18402 }else if( c=='[' ){
18403 cEnd = ']';
18404 }else if( c=='-' && z[i+1]=='-' ){
18405 cEnd = '\n';
18406 }else if( c=='(' ){
18407 nParen++;
18408 }else if( c==')' ){
18409 nParen--;
18410 if( nLine>0 && nParen==0 && j>0 ){
18411 printSchemaLineN(p->out, z, j, "\n");
18412 j = 0;
18413 }
18414 }
18415 z[j++] = c;
18416 if( nParen==1 && cEnd==0
18417 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
18418 ){
18419 if( c=='\n' ) j--;
18420 printSchemaLineN(p->out, z, j, "\n ");
18421 j = 0;
18422 nLine++;
18423 while( IsSpace(z[i+1]) ){ i++; }
18424 }
18425 }
18426 z[j] = 0;
18427 }
18428 printSchemaLine(p->out, z, ";\n");
18429 sqlite3_free(z);
18430 break;
18431 }
18432 case MODE_List: {
18433 if( p->cnt++==0 && p->showHeader ){
18434 for(i=0; i<nArg; i++){
18435 utf8_printf(p->out,"%s%s",azCol[i],
18436 i==nArg-1 ? p->rowSeparator : p->colSeparator);
18437 }
18438 }
18439 if( azArg==0 ) break;
18440 for(i=0; i<nArg; i++){
18441 char *z = azArg[i];
18442 if( z==0 ) z = p->nullValue;
18443 utf8_printf(p->out, "%s", z);
18444 if( i<nArg-1 ){
18445 utf8_printf(p->out, "%s", p->colSeparator);
18446 }else{
18447 utf8_printf(p->out, "%s", p->rowSeparator);
18448 }
18449 }
18450 break;
18451 }
18452 case MODE_Html: {
18453 if( p->cnt++==0 && p->showHeader ){
18454 raw_printf(p->out,"<TR>");
18455 for(i=0; i<nArg; i++){
18456 raw_printf(p->out,"<TH>");
18457 output_html_string(p->out, azCol[i]);
18458 raw_printf(p->out,"</TH>\n");
18459 }
18460 raw_printf(p->out,"</TR>\n");
18461 }
18462 if( azArg==0 ) break;
18463 raw_printf(p->out,"<TR>");
18464 for(i=0; i<nArg; i++){
18465 raw_printf(p->out,"<TD>");
18466 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
18467 raw_printf(p->out,"</TD>\n");
18468 }
18469 raw_printf(p->out,"</TR>\n");
18470 break;
18471 }
18472 case MODE_Tcl: {
18473 if( p->cnt++==0 && p->showHeader ){
18474 for(i=0; i<nArg; i++){
18475 output_c_string(p->out,azCol[i] ? azCol[i] : "");
18476 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
18477 }
18478 utf8_printf(p->out, "%s", p->rowSeparator);
18479 }
18480 if( azArg==0 ) break;
18481 for(i=0; i<nArg; i++){
18482 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
18483 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
18484 }
18485 utf8_printf(p->out, "%s", p->rowSeparator);
18486 break;
18487 }
18488 case MODE_Csv: {
18489 setBinaryMode(p->out, 1);
18490 if( p->cnt++==0 && p->showHeader ){
18491 for(i=0; i<nArg; i++){
18492 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
18493 }
18494 utf8_printf(p->out, "%s", p->rowSeparator);
18495 }
18496 if( nArg>0 ){
18497 for(i=0; i<nArg; i++){
18498 output_csv(p, azArg[i], i<nArg-1);
18499 }
18500 utf8_printf(p->out, "%s", p->rowSeparator);
18501 }
18502 setTextMode(p->out, 1);
18503 break;
18504 }
18505 case MODE_Insert: {
18506 if( azArg==0 ) break;
18507 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
18508 if( p->showHeader ){
18509 raw_printf(p->out,"(");
18510 for(i=0; i<nArg; i++){
18511 if( i>0 ) raw_printf(p->out, ",");
18512 if( quoteChar(azCol[i]) ){
18513 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
18514 shell_check_oom(z);
18515 utf8_printf(p->out, "%s", z);
18516 sqlite3_free(z);
18517 }else{
18518 raw_printf(p->out, "%s", azCol[i]);
18519 }
18520 }
18521 raw_printf(p->out,")");
18522 }
18523 p->cnt++;
18524 for(i=0; i<nArg; i++){
18525 raw_printf(p->out, i>0 ? "," : " VALUES(");
18526 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
18527 utf8_printf(p->out,"NULL");
18528 }else if( aiType && aiType[i]==SQLITE_TEXT ){
18529 if( ShellHasFlag(p, SHFLG_Newlines) ){
18530 output_quoted_string(p->out, azArg[i]);
18531 }else{
18532 output_quoted_escaped_string(p->out, azArg[i]);
18533 }
18534 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
18535 utf8_printf(p->out,"%s", azArg[i]);
18536 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
18537 char z[50];
18538 double r = sqlite3_column_double(p->pStmt, i);
18539 sqlite3_uint64 ur;
18540 memcpy(&ur,&r,sizeof(r));
18541 if( ur==0x7ff0000000000000LL ){
18542 raw_printf(p->out, "9.0e+999");
18543 }else if( ur==0xfff0000000000000LL ){
18544 raw_printf(p->out, "-9.0e+999");
18545 }else{
18546 sqlite3_int64 ir = (sqlite3_int64)r;
18547 if( r==(double)ir ){
18548 sqlite3_snprintf(50,z,"%lld.0", ir);
18549 }else{
18550 sqlite3_snprintf(50,z,"%!.20g", r);
18551 }
18552 raw_printf(p->out, "%s", z);
18553 }
18554 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
18555 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
18556 int nBlob = sqlite3_column_bytes(p->pStmt, i);
18557 output_hex_blob(p->out, pBlob, nBlob);
18558 }else if( isNumber(azArg[i], 0) ){
18559 utf8_printf(p->out,"%s", azArg[i]);
18560 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
18561 output_quoted_string(p->out, azArg[i]);
18562 }else{
18563 output_quoted_escaped_string(p->out, azArg[i]);
18564 }
18565 }
18566 raw_printf(p->out,");\n");
18567 break;
18568 }
18569 case MODE_Json: {
18570 if( azArg==0 ) break;
18571 if( p->cnt==0 ){
18572 fputs("[{", p->out);
18573 }else{
18574 fputs(",\n{", p->out);
18575 }
18576 p->cnt++;
18577 for(i=0; i<nArg; i++){
18578 output_json_string(p->out, azCol[i], -1);
18579 putc(':', p->out);
18580 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
18581 fputs("null",p->out);
18582 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
18583 char z[50];
18584 double r = sqlite3_column_double(p->pStmt, i);
18585 sqlite3_uint64 ur;
18586 memcpy(&ur,&r,sizeof(r));
18587 if( ur==0x7ff0000000000000LL ){
18588 raw_printf(p->out, "9.0e+999");
18589 }else if( ur==0xfff0000000000000LL ){
18590 raw_printf(p->out, "-9.0e+999");
18591 }else{
18592 sqlite3_snprintf(50,z,"%!.20g", r);
18593 raw_printf(p->out, "%s", z);
18594 }
18595 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
18596 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
18597 int nBlob = sqlite3_column_bytes(p->pStmt, i);
18598 output_json_string(p->out, pBlob, nBlob);
18599 }else if( aiType && aiType[i]==SQLITE_TEXT ){
18600 output_json_string(p->out, azArg[i], -1);
18601 }else{
18602 utf8_printf(p->out,"%s", azArg[i]);
18603 }
18604 if( i<nArg-1 ){
18605 putc(',', p->out);
18606 }
18607 }
18608 putc('}', p->out);
18609 break;
18610 }
18611 case MODE_Quote: {
18612 if( azArg==0 ) break;
18613 if( p->cnt==0 && p->showHeader ){
18614 for(i=0; i<nArg; i++){
18615 if( i>0 ) fputs(p->colSeparator, p->out);
18616 output_quoted_string(p->out, azCol[i]);
18617 }
18618 fputs(p->rowSeparator, p->out);
18619 }
18620 p->cnt++;
18621 for(i=0; i<nArg; i++){
18622 if( i>0 ) fputs(p->colSeparator, p->out);
18623 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
18624 utf8_printf(p->out,"NULL");
18625 }else if( aiType && aiType[i]==SQLITE_TEXT ){
18626 output_quoted_string(p->out, azArg[i]);
18627 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
18628 utf8_printf(p->out,"%s", azArg[i]);
18629 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
18630 char z[50];
18631 double r = sqlite3_column_double(p->pStmt, i);
18632 sqlite3_snprintf(50,z,"%!.20g", r);
18633 raw_printf(p->out, "%s", z);
18634 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
18635 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
18636 int nBlob = sqlite3_column_bytes(p->pStmt, i);
18637 output_hex_blob(p->out, pBlob, nBlob);
18638 }else if( isNumber(azArg[i], 0) ){
18639 utf8_printf(p->out,"%s", azArg[i]);
18640 }else{
18641 output_quoted_string(p->out, azArg[i]);
18642 }
18643 }
18644 fputs(p->rowSeparator, p->out);
18645 break;
18646 }
18647 case MODE_Ascii: {
18648 if( p->cnt++==0 && p->showHeader ){
18649 for(i=0; i<nArg; i++){
18650 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
18651 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
18652 }
18653 utf8_printf(p->out, "%s", p->rowSeparator);
18654 }
18655 if( azArg==0 ) break;
18656 for(i=0; i<nArg; i++){
18657 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
18658 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
18659 }
18660 utf8_printf(p->out, "%s", p->rowSeparator);
18661 break;
18662 }
18663 case MODE_EQP: {
18664 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
18665 break;
18666 }
18667 }
18668 return 0;
18669 }
18670
18671 /*
18672 ** This is the callback routine that the SQLite library
18673 ** invokes for each row of a query result.
18674 */
18675 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
18676 /* since we don't have type info, call the shell_callback with a NULL value */
18677 return shell_callback(pArg, nArg, azArg, azCol, NULL);
18678 }
18679
18680 /*
18681 ** This is the callback routine from sqlite3_exec() that appends all
18682 ** output onto the end of a ShellText object.
18683 */
18684 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
18685 ShellText *p = (ShellText*)pArg;
18686 int i;
18687 UNUSED_PARAMETER(az);
18688 if( azArg==0 ) return 0;
18689 if( p->n ) appendText(p, "|", 0);
18690 for(i=0; i<nArg; i++){
18691 if( i ) appendText(p, ",", 0);
18692 if( azArg[i] ) appendText(p, azArg[i], 0);
18693 }
18694 return 0;
18695 }
18696
18697 /*
18698 ** Generate an appropriate SELFTEST table in the main database.
18699 */
18700 static void createSelftestTable(ShellState *p){
18701 char *zErrMsg = 0;
18702 sqlite3_exec(p->db,
18703 "SAVEPOINT selftest_init;\n"
18704 "CREATE TABLE IF NOT EXISTS selftest(\n"
18705 " tno INTEGER PRIMARY KEY,\n" /* Test number */
18706 " op TEXT,\n" /* Operator: memo run */
18707 " cmd TEXT,\n" /* Command text */
18708 " ans TEXT\n" /* Desired answer */
18709 ");"
18710 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
18711 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
18712 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
18713 " 'memo','Tests generated by --init');\n"
18714 "INSERT INTO [_shell$self]\n"
18715 " SELECT 'run',\n"
18716 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
18717 "FROM sqlite_schema ORDER BY 2'',224))',\n"
18718 " hex(sha3_query('SELECT type,name,tbl_name,sql "
18719 "FROM sqlite_schema ORDER BY 2',224));\n"
18720 "INSERT INTO [_shell$self]\n"
18721 " SELECT 'run',"
18722 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
18723 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
18724 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
18725 " FROM (\n"
18726 " SELECT name FROM sqlite_schema\n"
18727 " WHERE type='table'\n"
18728 " AND name<>'selftest'\n"
18729 " AND coalesce(rootpage,0)>0\n"
18730 " )\n"
18731 " ORDER BY name;\n"
18732 "INSERT INTO [_shell$self]\n"
18733 " VALUES('run','PRAGMA integrity_check','ok');\n"
18734 "INSERT INTO selftest(tno,op,cmd,ans)"
18735 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
18736 "DROP TABLE [_shell$self];"
18737 ,0,0,&zErrMsg);
18738 if( zErrMsg ){
18739 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
18740 sqlite3_free(zErrMsg);
18741 }
18742 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
18743 }
18744
18745
18746 /*
18747 ** Set the destination table field of the ShellState structure to
18748 ** the name of the table given. Escape any quote characters in the
18749 ** table name.
18750 */
18751 static void set_table_name(ShellState *p, const char *zName){
18752 int i, n;
18753 char cQuote;
18754 char *z;
18755
18756 if( p->zDestTable ){
18757 free(p->zDestTable);
18758 p->zDestTable = 0;
18759 }
18760 if( zName==0 ) return;
18761 cQuote = quoteChar(zName);
18762 n = strlen30(zName);
18763 if( cQuote ) n += n+2;
18764 z = p->zDestTable = malloc( n+1 );
18765 shell_check_oom(z);
18766 n = 0;
18767 if( cQuote ) z[n++] = cQuote;
18768 for(i=0; zName[i]; i++){
18769 z[n++] = zName[i];
18770 if( zName[i]==cQuote ) z[n++] = cQuote;
18771 }
18772 if( cQuote ) z[n++] = cQuote;
18773 z[n] = 0;
18774 }
18775
18776 /*
18777 ** Maybe construct two lines of text that point out the position of a
18778 ** syntax error. Return a pointer to the text, in memory obtained from
18779 ** sqlite3_malloc(). Or, if the most recent error does not involve a
18780 ** specific token that we can point to, return an empty string.
18781 **
18782 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
18783 ** and should be released by the caller invoking sqlite3_free().
18784 */
18785 static char *shell_error_context(const char *zSql, sqlite3 *db){
18786 int iOffset;
18787 size_t len;
18788 char *zCode;
18789 char *zMsg;
18790 int i;
18791 if( db==0
18792 || zSql==0
18793 || (iOffset = sqlite3_error_offset(db))<0
18794 || iOffset>=(int)strlen(zSql)
18795 ){
18796 return sqlite3_mprintf("");
18797 }
18798 while( iOffset>50 ){
18799 iOffset--;
18800 zSql++;
18801 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
18802 }
18803 len = strlen(zSql);
18804 if( len>78 ){
18805 len = 78;
18806 while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
18807 }
18808 zCode = sqlite3_mprintf("%.*s", len, zSql);
18809 shell_check_oom(zCode);
18810 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
18811 if( iOffset<25 ){
18812 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode,iOffset,"");
18813 }else{
18814 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode,iOffset-14,"");
18815 }
18816 return zMsg;
18817 }
18818
18819
18820 /*
18821 ** Execute a query statement that will generate SQL output. Print
18822 ** the result columns, comma-separated, on a line and then add a
18823 ** semicolon terminator to the end of that line.
18824 **
18825 ** If the number of columns is 1 and that column contains text "--"
18826 ** then write the semicolon on a separate line. That way, if a
18827 ** "--" comment occurs at the end of the statement, the comment
18828 ** won't consume the semicolon terminator.
18829 */
18830 static int run_table_dump_query(
18831 ShellState *p, /* Query context */
18832 const char *zSelect /* SELECT statement to extract content */
18833 ){
18834 sqlite3_stmt *pSelect;
18835 int rc;
18836 int nResult;
18837 int i;
18838 const char *z;
18839 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
18840 if( rc!=SQLITE_OK || !pSelect ){
18841 char *zContext = shell_error_context(zSelect, p->db);
18842 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
18843 sqlite3_errmsg(p->db), zContext);
18844 sqlite3_free(zContext);
18845 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
18846 return rc;
18847 }
18848 rc = sqlite3_step(pSelect);
18849 nResult = sqlite3_column_count(pSelect);
18850 while( rc==SQLITE_ROW ){
18851 z = (const char*)sqlite3_column_text(pSelect, 0);
18852 utf8_printf(p->out, "%s", z);
18853 for(i=1; i<nResult; i++){
18854 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
18855 }
18856 if( z==0 ) z = "";
18857 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
18858 if( z[0] ){
18859 raw_printf(p->out, "\n;\n");
18860 }else{
18861 raw_printf(p->out, ";\n");
18862 }
18863 rc = sqlite3_step(pSelect);
18864 }
18865 rc = sqlite3_finalize(pSelect);
18866 if( rc!=SQLITE_OK ){
18867 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
18868 sqlite3_errmsg(p->db));
18869 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
18870 }
18871 return rc;
18872 }
18873
18874 /*
18875 ** Allocate space and save off string indicating current error.
18876 */
18877 static char *save_err_msg(
18878 sqlite3 *db, /* Database to query */
18879 const char *zPhase, /* When the error occurs */
18880 int rc, /* Error code returned from API */
18881 const char *zSql /* SQL string, or NULL */
18882 ){
18883 char *zErr;
18884 char *zContext;
18885 sqlite3_str *pStr = sqlite3_str_new(0);
18886 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
18887 if( rc>1 ){
18888 sqlite3_str_appendf(pStr, " (%d)", rc);
18889 }
18890 zContext = shell_error_context(zSql, db);
18891 if( zContext ){
18892 sqlite3_str_appendall(pStr, zContext);
18893 sqlite3_free(zContext);
18894 }
18895 zErr = sqlite3_str_finish(pStr);
18896 shell_check_oom(zErr);
18897 return zErr;
18898 }
18899
18900 #ifdef __linux__
18901 /*
18902 ** Attempt to display I/O stats on Linux using /proc/PID/io
18903 */
18904 static void displayLinuxIoStats(FILE *out){
18905 FILE *in;
18906 char z[200];
18907 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
18908 in = fopen(z, "rb");
18909 if( in==0 ) return;
18910 while( fgets(z, sizeof(z), in)!=0 ){
18911 static const struct {
18912 const char *zPattern;
18913 const char *zDesc;
18914 } aTrans[] = {
18915 { "rchar: ", "Bytes received by read():" },
18916 { "wchar: ", "Bytes sent to write():" },
18917 { "syscr: ", "Read() system calls:" },
18918 { "syscw: ", "Write() system calls:" },
18919 { "read_bytes: ", "Bytes read from storage:" },
18920 { "write_bytes: ", "Bytes written to storage:" },
18921 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
18922 };
18923 int i;
18924 for(i=0; i<ArraySize(aTrans); i++){
18925 int n = strlen30(aTrans[i].zPattern);
18926 if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
18927 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
18928 break;
18929 }
18930 }
18931 }
18932 fclose(in);
18933 }
18934 #endif
18935
18936 /*
18937 ** Display a single line of status using 64-bit values.
18938 */
18939 static void displayStatLine(
18940 ShellState *p, /* The shell context */
18941 char *zLabel, /* Label for this one line */
18942 char *zFormat, /* Format for the result */
18943 int iStatusCtrl, /* Which status to display */
18944 int bReset /* True to reset the stats */
18945 ){
18946 sqlite3_int64 iCur = -1;
18947 sqlite3_int64 iHiwtr = -1;
18948 int i, nPercent;
18949 char zLine[200];
18950 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
18951 for(i=0, nPercent=0; zFormat[i]; i++){
18952 if( zFormat[i]=='%' ) nPercent++;
18953 }
18954 if( nPercent>1 ){
18955 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
18956 }else{
18957 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
18958 }
18959 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
18960 }
18961
18962 /*
18963 ** Display memory stats.
18964 */
18965 static int display_stats(
18966 sqlite3 *db, /* Database to query */
18967 ShellState *pArg, /* Pointer to ShellState */
18968 int bReset /* True to reset the stats */
18969 ){
18970 int iCur;
18971 int iHiwtr;
18972 FILE *out;
18973 if( pArg==0 || pArg->out==0 ) return 0;
18974 out = pArg->out;
18975
18976 if( pArg->pStmt && pArg->statsOn==2 ){
18977 int nCol, i, x;
18978 sqlite3_stmt *pStmt = pArg->pStmt;
18979 char z[100];
18980 nCol = sqlite3_column_count(pStmt);
18981 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
18982 for(i=0; i<nCol; i++){
18983 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
18984 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
18985 #ifndef SQLITE_OMIT_DECLTYPE
18986 sqlite3_snprintf(30, z+x, "declared type:");
18987 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
18988 #endif
18989 #ifdef SQLITE_ENABLE_COLUMN_METADATA
18990 sqlite3_snprintf(30, z+x, "database name:");
18991 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
18992 sqlite3_snprintf(30, z+x, "table name:");
18993 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
18994 sqlite3_snprintf(30, z+x, "origin name:");
18995 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
18996 #endif
18997 }
18998 }
18999
19000 if( pArg->statsOn==3 ){
19001 if( pArg->pStmt ){
19002 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset);
19003 raw_printf(pArg->out, "VM-steps: %d\n", iCur);
19004 }
19005 return 0;
19006 }
19007
19008 displayStatLine(pArg, "Memory Used:",
19009 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
19010 displayStatLine(pArg, "Number of Outstanding Allocations:",
19011 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
19012 if( pArg->shellFlgs & SHFLG_Pagecache ){
19013 displayStatLine(pArg, "Number of Pcache Pages Used:",
19014 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
19015 }
19016 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
19017 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
19018 displayStatLine(pArg, "Largest Allocation:",
19019 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
19020 displayStatLine(pArg, "Largest Pcache Allocation:",
19021 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
19022 #ifdef YYTRACKMAXSTACKDEPTH
19023 displayStatLine(pArg, "Deepest Parser Stack:",
19024 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
19025 #endif
19026
19027 if( db ){
19028 if( pArg->shellFlgs & SHFLG_Lookaside ){
19029 iHiwtr = iCur = -1;
19030 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
19031 &iCur, &iHiwtr, bReset);
19032 raw_printf(pArg->out,
19033 "Lookaside Slots Used: %d (max %d)\n",
19034 iCur, iHiwtr);
19035 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
19036 &iCur, &iHiwtr, bReset);
19037 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
19038 iHiwtr);
19039 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
19040 &iCur, &iHiwtr, bReset);
19041 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
19042 iHiwtr);
19043 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
19044 &iCur, &iHiwtr, bReset);
19045 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
19046 iHiwtr);
19047 }
19048 iHiwtr = iCur = -1;
19049 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
19050 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
19051 iCur);
19052 iHiwtr = iCur = -1;
19053 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
19054 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
19055 iHiwtr = iCur = -1;
19056 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
19057 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
19058 iHiwtr = iCur = -1;
19059 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
19060 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
19061 iHiwtr = iCur = -1;
19062 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
19063 raw_printf(pArg->out, "Page cache spills: %d\n", iCur);
19064 iHiwtr = iCur = -1;
19065 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
19066 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
19067 iCur);
19068 iHiwtr = iCur = -1;
19069 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
19070 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
19071 iCur);
19072 }
19073
19074 if( pArg->pStmt ){
19075 int iHit, iMiss;
19076 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
19077 bReset);
19078 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
19079 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
19080 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
19081 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
19082 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
19083 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT,
19084 bReset);
19085 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS,
19086 bReset);
19087 if( iHit || iMiss ){
19088 raw_printf(pArg->out, "Bloom filter bypass taken: %d/%d\n",
19089 iHit, iHit+iMiss);
19090 }
19091 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
19092 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
19093 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
19094 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur);
19095 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
19096 raw_printf(pArg->out, "Number of times run: %d\n", iCur);
19097 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
19098 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur);
19099 }
19100
19101 #ifdef __linux__
19102 displayLinuxIoStats(pArg->out);
19103 #endif
19104
19105 /* Do not remove this machine readable comment: extra-stats-output-here */
19106
19107 return 0;
19108 }
19109
19110
19111 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
19112 static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
19113 int iPid = 0;
19114 int ret = 1;
19115 sqlite3_stmt_scanstatus_v2(p, iEntry,
19116 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
19117 );
19118 while( iPid!=0 ){
19119 int ii;
19120 for(ii=0; 1; ii++){
19121 int iId;
19122 int res;
19123 res = sqlite3_stmt_scanstatus_v2(p, ii,
19124 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
19125 );
19126 if( res ) break;
19127 if( iId==iPid ){
19128 sqlite3_stmt_scanstatus_v2(p, ii,
19129 SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
19130 );
19131 }
19132 }
19133 ret++;
19134 }
19135 return ret;
19136 }
19137 #endif
19138
19139 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
19140 static void display_explain_scanstats(
19141 sqlite3 *db, /* Database to query */
19142 ShellState *pArg /* Pointer to ShellState */
19143 ){
19144 static const int f = SQLITE_SCANSTAT_COMPLEX;
19145 sqlite3_stmt *p = pArg->pStmt;
19146 int ii = 0;
19147 i64 nTotal = 0;
19148 int nWidth = 0;
19149 eqp_reset(pArg);
19150
19151 for(ii=0; 1; ii++){
19152 const char *z = 0;
19153 int n = 0;
19154 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
19155 break;
19156 }
19157 n = strlen(z) + scanStatsHeight(p, ii)*3;
19158 if( n>nWidth ) nWidth = n;
19159 }
19160 nWidth += 4;
19161
19162 sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
19163 for(ii=0; 1; ii++){
19164 i64 nLoop = 0;
19165 i64 nRow = 0;
19166 i64 nCycle = 0;
19167 int iId = 0;
19168 int iPid = 0;
19169 const char *z = 0;
19170 const char *zName = 0;
19171 char *zText = 0;
19172 double rEst = 0.0;
19173
19174 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
19175 break;
19176 }
19177 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
19178 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
19179 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
19180 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
19181 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
19182 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
19183 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
19184
19185 zText = sqlite3_mprintf("%s", z);
19186 if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
19187 char *z = 0;
19188 if( nCycle>=0 && nTotal>0 ){
19189 z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
19190 nCycle, ((nCycle*100)+nTotal/2) / nTotal
19191 );
19192 }
19193 if( nLoop>=0 ){
19194 z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
19195 }
19196 if( nRow>=0 ){
19197 z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
19198 }
19199
19200 if( zName && pArg->scanstatsOn>1 ){
19201 double rpl = (double)nRow / (double)nLoop;
19202 z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
19203 }
19204
19205 zText = sqlite3_mprintf(
19206 "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
19207 );
19208 }
19209
19210 eqp_append(pArg, iId, iPid, zText);
19211 sqlite3_free(zText);
19212 }
19213
19214 eqp_render(pArg, nTotal);
19215 }
19216 #endif
19217
19218
19219 /*
19220 ** Parameter azArray points to a zero-terminated array of strings. zStr
19221 ** points to a single nul-terminated string. Return non-zero if zStr
19222 ** is equal, according to strcmp(), to any of the strings in the array.
19223 ** Otherwise, return zero.
19224 */
19225 static int str_in_array(const char *zStr, const char **azArray){
19226 int i;
19227 for(i=0; azArray[i]; i++){
19228 if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
19229 }
19230 return 0;
19231 }
19232
19233 /*
19234 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
19235 ** and populate the ShellState.aiIndent[] array with the number of
19236 ** spaces each opcode should be indented before it is output.
19237 **
19238 ** The indenting rules are:
19239 **
19240 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
19241 ** all opcodes that occur between the p2 jump destination and the opcode
19242 ** itself by 2 spaces.
19243 **
19244 ** * Do the previous for "Return" instructions for when P2 is positive.
19245 ** See tag-20220407a in wherecode.c and vdbe.c.
19246 **
19247 ** * For each "Goto", if the jump destination is earlier in the program
19248 ** and ends on one of:
19249 ** Yield SeekGt SeekLt RowSetRead Rewind
19250 ** or if the P1 parameter is one instead of zero,
19251 ** then indent all opcodes between the earlier instruction
19252 ** and "Goto" by 2 spaces.
19253 */
19254 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
19255 int *abYield = 0; /* True if op is an OP_Yield */
19256 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
19257 int iOp; /* Index of operation in p->aiIndent[] */
19258
19259 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
19260 "Return", 0 };
19261 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
19262 "Rewind", 0 };
19263 const char *azGoto[] = { "Goto", 0 };
19264
19265 /* The caller guarantees that the leftmost 4 columns of the statement
19266 ** passed to this function are equivalent to the leftmost 4 columns
19267 ** of EXPLAIN statement output. In practice the statement may be
19268 ** an EXPLAIN, or it may be a query on the bytecode() virtual table. */
19269 assert( sqlite3_column_count(pSql)>=4 );
19270 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
19271 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
19272 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
19273 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
19274
19275 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
19276 int i;
19277 int iAddr = sqlite3_column_int(pSql, 0);
19278 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
19279 int p1 = sqlite3_column_int(pSql, 2);
19280 int p2 = sqlite3_column_int(pSql, 3);
19281
19282 /* Assuming that p2 is an instruction address, set variable p2op to the
19283 ** index of that instruction in the aiIndent[] array. p2 and p2op may be
19284 ** different if the current instruction is part of a sub-program generated
19285 ** by an SQL trigger or foreign key. */
19286 int p2op = (p2 + (iOp-iAddr));
19287
19288 /* Grow the p->aiIndent array as required */
19289 if( iOp>=nAlloc ){
19290 nAlloc += 100;
19291 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
19292 shell_check_oom(p->aiIndent);
19293 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
19294 shell_check_oom(abYield);
19295 }
19296
19297 abYield[iOp] = str_in_array(zOp, azYield);
19298 p->aiIndent[iOp] = 0;
19299 p->nIndent = iOp+1;
19300 if( str_in_array(zOp, azNext) && p2op>0 ){
19301 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
19302 }
19303 if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
19304 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
19305 }
19306 }
19307
19308 p->iIndent = 0;
19309 sqlite3_free(abYield);
19310 sqlite3_reset(pSql);
19311 }
19312
19313 /*
19314 ** Free the array allocated by explain_data_prepare().
19315 */
19316 static void explain_data_delete(ShellState *p){
19317 sqlite3_free(p->aiIndent);
19318 p->aiIndent = 0;
19319 p->nIndent = 0;
19320 p->iIndent = 0;
19321 }
19322
19323 static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
19324
19325 /*
19326 ** Display scan stats.
19327 */
19328 static void display_scanstats(
19329 sqlite3 *db, /* Database to query */
19330 ShellState *pArg /* Pointer to ShellState */
19331 ){
19332 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
19333 UNUSED_PARAMETER(db);
19334 UNUSED_PARAMETER(pArg);
19335 #else
19336 if( pArg->scanstatsOn==3 ){
19337 const char *zSql =
19338 " SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
19339 " round(ncycle*100.0 / (sum(ncycle) OVER ()), 2)||'%' AS cycles"
19340 " FROM bytecode(?)";
19341
19342 int rc = SQLITE_OK;
19343 sqlite3_stmt *pStmt = 0;
19344 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
19345 if( rc==SQLITE_OK ){
19346 sqlite3_stmt *pSave = pArg->pStmt;
19347 pArg->pStmt = pStmt;
19348 sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
19349
19350 pArg->cnt = 0;
19351 pArg->cMode = MODE_ScanExp;
19352 explain_data_prepare(pArg, pStmt);
19353 exec_prepared_stmt(pArg, pStmt);
19354 explain_data_delete(pArg);
19355
19356 sqlite3_finalize(pStmt);
19357 pArg->pStmt = pSave;
19358 }
19359 }else{
19360 display_explain_scanstats(db, pArg);
19361 }
19362 #endif
19363 }
19364
19365 /*
19366 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
19367 */
19368 static unsigned int savedSelectTrace;
19369 static unsigned int savedWhereTrace;
19370 static void disable_debug_trace_modes(void){
19371 unsigned int zero = 0;
19372 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
19373 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
19374 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
19375 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
19376 }
19377 static void restore_debug_trace_modes(void){
19378 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
19379 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
19380 }
19381
19382 /* Create the TEMP table used to store parameter bindings */
19383 static void bind_table_init(ShellState *p){
19384 int wrSchema = 0;
19385 int defensiveMode = 0;
19386 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
19387 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
19388 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
19389 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
19390 sqlite3_exec(p->db,
19391 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
19392 " key TEXT PRIMARY KEY,\n"
19393 " value\n"
19394 ") WITHOUT ROWID;",
19395 0, 0, 0);
19396 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
19397 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
19398 }
19399
19400 /*
19401 ** Bind parameters on a prepared statement.
19402 **
19403 ** Parameter bindings are taken from a TEMP table of the form:
19404 **
19405 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
19406 ** WITHOUT ROWID;
19407 **
19408 ** No bindings occur if this table does not exist. The name of the table
19409 ** begins with "sqlite_" so that it will not collide with ordinary application
19410 ** tables. The table must be in the TEMP schema.
19411 */
19412 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
19413 int nVar;
19414 int i;
19415 int rc;
19416 sqlite3_stmt *pQ = 0;
19417
19418 nVar = sqlite3_bind_parameter_count(pStmt);
19419 if( nVar==0 ) return; /* Nothing to do */
19420 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
19421 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
19422 rc = SQLITE_NOTFOUND;
19423 pQ = 0;
19424 }else{
19425 rc = sqlite3_prepare_v2(pArg->db,
19426 "SELECT value FROM temp.sqlite_parameters"
19427 " WHERE key=?1", -1, &pQ, 0);
19428 }
19429 for(i=1; i<=nVar; i++){
19430 char zNum[30];
19431 const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
19432 if( zVar==0 ){
19433 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
19434 zVar = zNum;
19435 }
19436 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
19437 if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
19438 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
19439 #ifdef NAN
19440 }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
19441 sqlite3_bind_double(pStmt, i, NAN);
19442 #endif
19443 #ifdef INFINITY
19444 }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
19445 sqlite3_bind_double(pStmt, i, INFINITY);
19446 #endif
19447 }else{
19448 sqlite3_bind_null(pStmt, i);
19449 }
19450 sqlite3_reset(pQ);
19451 }
19452 sqlite3_finalize(pQ);
19453 }
19454
19455 /*
19456 ** UTF8 box-drawing characters. Imagine box lines like this:
19457 **
19458 ** 1
19459 ** |
19460 ** 4 --+-- 2
19461 ** |
19462 ** 3
19463 **
19464 ** Each box characters has between 2 and 4 of the lines leading from
19465 ** the center. The characters are here identified by the numbers of
19466 ** their corresponding lines.
19467 */
19468 #define BOX_24 "\342\224\200" /* U+2500 --- */
19469 #define BOX_13 "\342\224\202" /* U+2502 | */
19470 #define BOX_23 "\342\224\214" /* U+250c ,- */
19471 #define BOX_34 "\342\224\220" /* U+2510 -, */
19472 #define BOX_12 "\342\224\224" /* U+2514 '- */
19473 #define BOX_14 "\342\224\230" /* U+2518 -' */
19474 #define BOX_123 "\342\224\234" /* U+251c |- */
19475 #define BOX_134 "\342\224\244" /* U+2524 -| */
19476 #define BOX_234 "\342\224\254" /* U+252c -,- */
19477 #define BOX_124 "\342\224\264" /* U+2534 -'- */
19478 #define BOX_1234 "\342\224\274" /* U+253c -|- */
19479
19480 /* Draw horizontal line N characters long using unicode box
19481 ** characters
19482 */
19483 static void print_box_line(FILE *out, int N){
19484 const char zDash[] =
19485 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
19486 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
19487 const int nDash = sizeof(zDash) - 1;
19488 N *= 3;
19489 while( N>nDash ){
19490 utf8_printf(out, zDash);
19491 N -= nDash;
19492 }
19493 utf8_printf(out, "%.*s", N, zDash);
19494 }
19495
19496 /*
19497 ** Draw a horizontal separator for a MODE_Box table.
19498 */
19499 static void print_box_row_separator(
19500 ShellState *p,
19501 int nArg,
19502 const char *zSep1,
19503 const char *zSep2,
19504 const char *zSep3
19505 ){
19506 int i;
19507 if( nArg>0 ){
19508 utf8_printf(p->out, "%s", zSep1);
19509 print_box_line(p->out, p->actualWidth[0]+2);
19510 for(i=1; i<nArg; i++){
19511 utf8_printf(p->out, "%s", zSep2);
19512 print_box_line(p->out, p->actualWidth[i]+2);
19513 }
19514 utf8_printf(p->out, "%s", zSep3);
19515 }
19516 fputs("\n", p->out);
19517 }
19518
19519 /*
19520 ** z[] is a line of text that is to be displayed the .mode box or table or
19521 ** similar tabular formats. z[] might contain control characters such
19522 ** as \n, \t, \f, or \r.
19523 **
19524 ** Compute characters to display on the first line of z[]. Stop at the
19525 ** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained
19526 ** from malloc()) of that first line, which caller should free sometime.
19527 ** Write anything to display on the next line into *pzTail. If this is
19528 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
19529 */
19530 static char *translateForDisplayAndDup(
19531 const unsigned char *z, /* Input text to be transformed */
19532 const unsigned char **pzTail, /* OUT: Tail of the input for next line */
19533 int mxWidth, /* Max width. 0 means no limit */
19534 u8 bWordWrap /* If true, avoid breaking mid-word */
19535 ){
19536 int i; /* Input bytes consumed */
19537 int j; /* Output bytes generated */
19538 int k; /* Input bytes to be displayed */
19539 int n; /* Output column number */
19540 unsigned char *zOut; /* Output text */
19541
19542 if( z==0 ){
19543 *pzTail = 0;
19544 return 0;
19545 }
19546 if( mxWidth<0 ) mxWidth = -mxWidth;
19547 if( mxWidth==0 ) mxWidth = 1000000;
19548 i = j = n = 0;
19549 while( n<mxWidth ){
19550 if( z[i]>=' ' ){
19551 n++;
19552 do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
19553 continue;
19554 }
19555 if( z[i]=='\t' ){
19556 do{
19557 n++;
19558 j++;
19559 }while( (n&7)!=0 && n<mxWidth );
19560 i++;
19561 continue;
19562 }
19563 break;
19564 }
19565 if( n>=mxWidth && bWordWrap ){
19566 /* Perhaps try to back up to a better place to break the line */
19567 for(k=i; k>i/2; k--){
19568 if( isspace(z[k-1]) ) break;
19569 }
19570 if( k<=i/2 ){
19571 for(k=i; k>i/2; k--){
19572 if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
19573 }
19574 }
19575 if( k<=i/2 ){
19576 k = i;
19577 }else{
19578 i = k;
19579 while( z[i]==' ' ) i++;
19580 }
19581 }else{
19582 k = i;
19583 }
19584 if( n>=mxWidth && z[i]>=' ' ){
19585 *pzTail = &z[i];
19586 }else if( z[i]=='\r' && z[i+1]=='\n' ){
19587 *pzTail = z[i+2] ? &z[i+2] : 0;
19588 }else if( z[i]==0 || z[i+1]==0 ){
19589 *pzTail = 0;
19590 }else{
19591 *pzTail = &z[i+1];
19592 }
19593 zOut = malloc( j+1 );
19594 shell_check_oom(zOut);
19595 i = j = n = 0;
19596 while( i<k ){
19597 if( z[i]>=' ' ){
19598 n++;
19599 do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
19600 continue;
19601 }
19602 if( z[i]=='\t' ){
19603 do{
19604 n++;
19605 zOut[j++] = ' ';
19606 }while( (n&7)!=0 && n<mxWidth );
19607 i++;
19608 continue;
19609 }
19610 break;
19611 }
19612 zOut[j] = 0;
19613 return (char*)zOut;
19614 }
19615
19616 /* Extract the value of the i-th current column for pStmt as an SQL literal
19617 ** value. Memory is obtained from sqlite3_malloc64() and must be freed by
19618 ** the caller.
19619 */
19620 static char *quoted_column(sqlite3_stmt *pStmt, int i){
19621 switch( sqlite3_column_type(pStmt, i) ){
19622 case SQLITE_NULL: {
19623 return sqlite3_mprintf("NULL");
19624 }
19625 case SQLITE_INTEGER:
19626 case SQLITE_FLOAT: {
19627 return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
19628 }
19629 case SQLITE_TEXT: {
19630 return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
19631 }
19632 case SQLITE_BLOB: {
19633 int j;
19634 sqlite3_str *pStr = sqlite3_str_new(0);
19635 const unsigned char *a = sqlite3_column_blob(pStmt,i);
19636 int n = sqlite3_column_bytes(pStmt,i);
19637 sqlite3_str_append(pStr, "x'", 2);
19638 for(j=0; j<n; j++){
19639 sqlite3_str_appendf(pStr, "%02x", a[j]);
19640 }
19641 sqlite3_str_append(pStr, "'", 1);
19642 return sqlite3_str_finish(pStr);
19643 }
19644 }
19645 return 0; /* Not reached */
19646 }
19647
19648 /*
19649 ** Run a prepared statement and output the result in one of the
19650 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
19651 ** or MODE_Box.
19652 **
19653 ** This is different from ordinary exec_prepared_stmt() in that
19654 ** it has to run the entire query and gather the results into memory
19655 ** first, in order to determine column widths, before providing
19656 ** any output.
19657 */
19658 static void exec_prepared_stmt_columnar(
19659 ShellState *p, /* Pointer to ShellState */
19660 sqlite3_stmt *pStmt /* Statement to run */
19661 ){
19662 sqlite3_int64 nRow = 0;
19663 int nColumn = 0;
19664 char **azData = 0;
19665 sqlite3_int64 nAlloc = 0;
19666 char *abRowDiv = 0;
19667 const unsigned char *uz;
19668 const char *z;
19669 char **azQuoted = 0;
19670 int rc;
19671 sqlite3_int64 i, nData;
19672 int j, nTotal, w, n;
19673 const char *colSep = 0;
19674 const char *rowSep = 0;
19675 const unsigned char **azNextLine = 0;
19676 int bNextLine = 0;
19677 int bMultiLineRowExists = 0;
19678 int bw = p->cmOpts.bWordWrap;
19679 const char *zEmpty = "";
19680 const char *zShowNull = p->nullValue;
19681
19682 rc = sqlite3_step(pStmt);
19683 if( rc!=SQLITE_ROW ) return;
19684 nColumn = sqlite3_column_count(pStmt);
19685 nAlloc = nColumn*4;
19686 if( nAlloc<=0 ) nAlloc = 1;
19687 azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
19688 shell_check_oom(azData);
19689 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
19690 shell_check_oom(azNextLine);
19691 memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
19692 if( p->cmOpts.bQuote ){
19693 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
19694 shell_check_oom(azQuoted);
19695 memset(azQuoted, 0, nColumn*sizeof(char*) );
19696 }
19697 abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
19698 shell_check_oom(abRowDiv);
19699 if( nColumn>p->nWidth ){
19700 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
19701 shell_check_oom(p->colWidth);
19702 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
19703 p->nWidth = nColumn;
19704 p->actualWidth = &p->colWidth[nColumn];
19705 }
19706 memset(p->actualWidth, 0, nColumn*sizeof(int));
19707 for(i=0; i<nColumn; i++){
19708 w = p->colWidth[i];
19709 if( w<0 ) w = -w;
19710 p->actualWidth[i] = w;
19711 }
19712 for(i=0; i<nColumn; i++){
19713 const unsigned char *zNotUsed;
19714 int wx = p->colWidth[i];
19715 if( wx==0 ){
19716 wx = p->cmOpts.iWrap;
19717 }
19718 if( wx<0 ) wx = -wx;
19719 uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
19720 if( uz==0 ) uz = (u8*)"";
19721 azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
19722 }
19723 do{
19724 int useNextLine = bNextLine;
19725 bNextLine = 0;
19726 if( (nRow+2)*nColumn >= nAlloc ){
19727 nAlloc *= 2;
19728 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
19729 shell_check_oom(azData);
19730 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
19731 shell_check_oom(abRowDiv);
19732 }
19733 abRowDiv[nRow] = 1;
19734 nRow++;
19735 for(i=0; i<nColumn; i++){
19736 int wx = p->colWidth[i];
19737 if( wx==0 ){
19738 wx = p->cmOpts.iWrap;
19739 }
19740 if( wx<0 ) wx = -wx;
19741 if( useNextLine ){
19742 uz = azNextLine[i];
19743 if( uz==0 ) uz = (u8*)zEmpty;
19744 }else if( p->cmOpts.bQuote ){
19745 sqlite3_free(azQuoted[i]);
19746 azQuoted[i] = quoted_column(pStmt,i);
19747 uz = (const unsigned char*)azQuoted[i];
19748 }else{
19749 uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
19750 if( uz==0 ) uz = (u8*)zShowNull;
19751 }
19752 azData[nRow*nColumn + i]
19753 = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
19754 if( azNextLine[i] ){
19755 bNextLine = 1;
19756 abRowDiv[nRow-1] = 0;
19757 bMultiLineRowExists = 1;
19758 }
19759 }
19760 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
19761 nTotal = nColumn*(nRow+1);
19762 for(i=0; i<nTotal; i++){
19763 z = azData[i];
19764 if( z==0 ) z = (char*)zEmpty;
19765 n = strlenChar(z);
19766 j = i%nColumn;
19767 if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
19768 }
19769 if( seenInterrupt ) goto columnar_end;
19770 if( nColumn==0 ) goto columnar_end;
19771 switch( p->cMode ){
19772 case MODE_Column: {
19773 colSep = " ";
19774 rowSep = "\n";
19775 if( p->showHeader ){
19776 for(i=0; i<nColumn; i++){
19777 w = p->actualWidth[i];
19778 if( p->colWidth[i]<0 ) w = -w;
19779 utf8_width_print(p->out, w, azData[i]);
19780 fputs(i==nColumn-1?"\n":" ", p->out);
19781 }
19782 for(i=0; i<nColumn; i++){
19783 print_dashes(p->out, p->actualWidth[i]);
19784 fputs(i==nColumn-1?"\n":" ", p->out);
19785 }
19786 }
19787 break;
19788 }
19789 case MODE_Table: {
19790 colSep = " | ";
19791 rowSep = " |\n";
19792 print_row_separator(p, nColumn, "+");
19793 fputs("| ", p->out);
19794 for(i=0; i<nColumn; i++){
19795 w = p->actualWidth[i];
19796 n = strlenChar(azData[i]);
19797 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
19798 fputs(i==nColumn-1?" |\n":" | ", p->out);
19799 }
19800 print_row_separator(p, nColumn, "+");
19801 break;
19802 }
19803 case MODE_Markdown: {
19804 colSep = " | ";
19805 rowSep = " |\n";
19806 fputs("| ", p->out);
19807 for(i=0; i<nColumn; i++){
19808 w = p->actualWidth[i];
19809 n = strlenChar(azData[i]);
19810 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
19811 fputs(i==nColumn-1?" |\n":" | ", p->out);
19812 }
19813 print_row_separator(p, nColumn, "|");
19814 break;
19815 }
19816 case MODE_Box: {
19817 colSep = " " BOX_13 " ";
19818 rowSep = " " BOX_13 "\n";
19819 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
19820 utf8_printf(p->out, BOX_13 " ");
19821 for(i=0; i<nColumn; i++){
19822 w = p->actualWidth[i];
19823 n = strlenChar(azData[i]);
19824 utf8_printf(p->out, "%*s%s%*s%s",
19825 (w-n)/2, "", azData[i], (w-n+1)/2, "",
19826 i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
19827 }
19828 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
19829 break;
19830 }
19831 }
19832 for(i=nColumn, j=0; i<nTotal; i++, j++){
19833 if( j==0 && p->cMode!=MODE_Column ){
19834 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
19835 }
19836 z = azData[i];
19837 if( z==0 ) z = p->nullValue;
19838 w = p->actualWidth[j];
19839 if( p->colWidth[j]<0 ) w = -w;
19840 utf8_width_print(p->out, w, z);
19841 if( j==nColumn-1 ){
19842 utf8_printf(p->out, "%s", rowSep);
19843 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
19844 if( p->cMode==MODE_Table ){
19845 print_row_separator(p, nColumn, "+");
19846 }else if( p->cMode==MODE_Box ){
19847 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
19848 }else if( p->cMode==MODE_Column ){
19849 raw_printf(p->out, "\n");
19850 }
19851 }
19852 j = -1;
19853 if( seenInterrupt ) goto columnar_end;
19854 }else{
19855 utf8_printf(p->out, "%s", colSep);
19856 }
19857 }
19858 if( p->cMode==MODE_Table ){
19859 print_row_separator(p, nColumn, "+");
19860 }else if( p->cMode==MODE_Box ){
19861 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
19862 }
19863 columnar_end:
19864 if( seenInterrupt ){
19865 utf8_printf(p->out, "Interrupt\n");
19866 }
19867 nData = (nRow+1)*nColumn;
19868 for(i=0; i<nData; i++){
19869 z = azData[i];
19870 if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
19871 }
19872 sqlite3_free(azData);
19873 sqlite3_free((void*)azNextLine);
19874 sqlite3_free(abRowDiv);
19875 if( azQuoted ){
19876 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
19877 sqlite3_free(azQuoted);
19878 }
19879 }
19880
19881 /*
19882 ** Run a prepared statement
19883 */
19884 static void exec_prepared_stmt(
19885 ShellState *pArg, /* Pointer to ShellState */
19886 sqlite3_stmt *pStmt /* Statement to run */
19887 ){
19888 int rc;
19889 sqlite3_uint64 nRow = 0;
19890
19891 if( pArg->cMode==MODE_Column
19892 || pArg->cMode==MODE_Table
19893 || pArg->cMode==MODE_Box
19894 || pArg->cMode==MODE_Markdown
19895 ){
19896 exec_prepared_stmt_columnar(pArg, pStmt);
19897 return;
19898 }
19899
19900 /* perform the first step. this will tell us if we
19901 ** have a result set or not and how wide it is.
19902 */
19903 rc = sqlite3_step(pStmt);
19904 /* if we have a result set... */
19905 if( SQLITE_ROW == rc ){
19906 /* allocate space for col name ptr, value ptr, and type */
19907 int nCol = sqlite3_column_count(pStmt);
19908 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
19909 if( !pData ){
19910 shell_out_of_memory();
19911 }else{
19912 char **azCols = (char **)pData; /* Names of result columns */
19913 char **azVals = &azCols[nCol]; /* Results */
19914 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
19915 int i, x;
19916 assert(sizeof(int) <= sizeof(char *));
19917 /* save off ptrs to column names */
19918 for(i=0; i<nCol; i++){
19919 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
19920 }
19921 do{
19922 nRow++;
19923 /* extract the data and data types */
19924 for(i=0; i<nCol; i++){
19925 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
19926 if( x==SQLITE_BLOB
19927 && pArg
19928 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
19929 ){
19930 azVals[i] = "";
19931 }else{
19932 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
19933 }
19934 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
19935 rc = SQLITE_NOMEM;
19936 break; /* from for */
19937 }
19938 } /* end for */
19939
19940 /* if data and types extracted successfully... */
19941 if( SQLITE_ROW == rc ){
19942 /* call the supplied callback with the result row data */
19943 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
19944 rc = SQLITE_ABORT;
19945 }else{
19946 rc = sqlite3_step(pStmt);
19947 }
19948 }
19949 } while( SQLITE_ROW == rc );
19950 sqlite3_free(pData);
19951 if( pArg->cMode==MODE_Json ){
19952 fputs("]\n", pArg->out);
19953 }else if( pArg->cMode==MODE_Count ){
19954 char zBuf[200];
19955 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
19956 nRow, nRow!=1 ? "s" : "");
19957 printf("%s", zBuf);
19958 }
19959 }
19960 }
19961 }
19962
19963 #ifndef SQLITE_OMIT_VIRTUALTABLE
19964 /*
19965 ** This function is called to process SQL if the previous shell command
19966 ** was ".expert". It passes the SQL in the second argument directly to
19967 ** the sqlite3expert object.
19968 **
19969 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
19970 ** code. In this case, (*pzErr) may be set to point to a buffer containing
19971 ** an English language error message. It is the responsibility of the
19972 ** caller to eventually free this buffer using sqlite3_free().
19973 */
19974 static int expertHandleSQL(
19975 ShellState *pState,
19976 const char *zSql,
19977 char **pzErr
19978 ){
19979 assert( pState->expert.pExpert );
19980 assert( pzErr==0 || *pzErr==0 );
19981 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
19982 }
19983
19984 /*
19985 ** This function is called either to silently clean up the object
19986 ** created by the ".expert" command (if bCancel==1), or to generate a
19987 ** report from it and then clean it up (if bCancel==0).
19988 **
19989 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
19990 ** code. In this case, (*pzErr) may be set to point to a buffer containing
19991 ** an English language error message. It is the responsibility of the
19992 ** caller to eventually free this buffer using sqlite3_free().
19993 */
19994 static int expertFinish(
19995 ShellState *pState,
19996 int bCancel,
19997 char **pzErr
19998 ){
19999 int rc = SQLITE_OK;
20000 sqlite3expert *p = pState->expert.pExpert;
20001 assert( p );
20002 assert( bCancel || pzErr==0 || *pzErr==0 );
20003 if( bCancel==0 ){
20004 FILE *out = pState->out;
20005 int bVerbose = pState->expert.bVerbose;
20006
20007 rc = sqlite3_expert_analyze(p, pzErr);
20008 if( rc==SQLITE_OK ){
20009 int nQuery = sqlite3_expert_count(p);
20010 int i;
20011
20012 if( bVerbose ){
20013 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
20014 raw_printf(out, "-- Candidates -----------------------------\n");
20015 raw_printf(out, "%s\n", zCand);
20016 }
20017 for(i=0; i<nQuery; i++){
20018 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
20019 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
20020 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
20021 if( zIdx==0 ) zIdx = "(no new indexes)\n";
20022 if( bVerbose ){
20023 raw_printf(out, "-- Query %d --------------------------------\n",i+1);
20024 raw_printf(out, "%s\n\n", zSql);
20025 }
20026 raw_printf(out, "%s\n", zIdx);
20027 raw_printf(out, "%s\n", zEQP);
20028 }
20029 }
20030 }
20031 sqlite3_expert_destroy(p);
20032 pState->expert.pExpert = 0;
20033 return rc;
20034 }
20035
20036 /*
20037 ** Implementation of ".expert" dot command.
20038 */
20039 static int expertDotCommand(
20040 ShellState *pState, /* Current shell tool state */
20041 char **azArg, /* Array of arguments passed to dot command */
20042 int nArg /* Number of entries in azArg[] */
20043 ){
20044 int rc = SQLITE_OK;
20045 char *zErr = 0;
20046 int i;
20047 int iSample = 0;
20048
20049 assert( pState->expert.pExpert==0 );
20050 memset(&pState->expert, 0, sizeof(ExpertInfo));
20051
20052 for(i=1; rc==SQLITE_OK && i<nArg; i++){
20053 char *z = azArg[i];
20054 int n;
20055 if( z[0]=='-' && z[1]=='-' ) z++;
20056 n = strlen30(z);
20057 if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
20058 pState->expert.bVerbose = 1;
20059 }
20060 else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
20061 if( i==(nArg-1) ){
20062 raw_printf(stderr, "option requires an argument: %s\n", z);
20063 rc = SQLITE_ERROR;
20064 }else{
20065 iSample = (int)integerValue(azArg[++i]);
20066 if( iSample<0 || iSample>100 ){
20067 raw_printf(stderr, "value out of range: %s\n", azArg[i]);
20068 rc = SQLITE_ERROR;
20069 }
20070 }
20071 }
20072 else{
20073 raw_printf(stderr, "unknown option: %s\n", z);
20074 rc = SQLITE_ERROR;
20075 }
20076 }
20077
20078 if( rc==SQLITE_OK ){
20079 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
20080 if( pState->expert.pExpert==0 ){
20081 raw_printf(stderr, "sqlite3_expert_new: %s\n",
20082 zErr ? zErr : "out of memory");
20083 rc = SQLITE_ERROR;
20084 }else{
20085 sqlite3_expert_config(
20086 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
20087 );
20088 }
20089 }
20090 sqlite3_free(zErr);
20091
20092 return rc;
20093 }
20094 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
20095
20096 /*
20097 ** Execute a statement or set of statements. Print
20098 ** any result rows/columns depending on the current mode
20099 ** set via the supplied callback.
20100 **
20101 ** This is very similar to SQLite's built-in sqlite3_exec()
20102 ** function except it takes a slightly different callback
20103 ** and callback data argument.
20104 */
20105 static int shell_exec(
20106 ShellState *pArg, /* Pointer to ShellState */
20107 const char *zSql, /* SQL to be evaluated */
20108 char **pzErrMsg /* Error msg written here */
20109 ){
20110 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
20111 int rc = SQLITE_OK; /* Return Code */
20112 int rc2;
20113 const char *zLeftover; /* Tail of unprocessed SQL */
20114 sqlite3 *db = pArg->db;
20115
20116 if( pzErrMsg ){
20117 *pzErrMsg = NULL;
20118 }
20119
20120 #ifndef SQLITE_OMIT_VIRTUALTABLE
20121 if( pArg->expert.pExpert ){
20122 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
20123 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
20124 }
20125 #endif
20126
20127 while( zSql[0] && (SQLITE_OK == rc) ){
20128 static const char *zStmtSql;
20129 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
20130 if( SQLITE_OK != rc ){
20131 if( pzErrMsg ){
20132 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
20133 }
20134 }else{
20135 if( !pStmt ){
20136 /* this happens for a comment or white-space */
20137 zSql = zLeftover;
20138 while( IsSpace(zSql[0]) ) zSql++;
20139 continue;
20140 }
20141 zStmtSql = sqlite3_sql(pStmt);
20142 if( zStmtSql==0 ) zStmtSql = "";
20143 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
20144
20145 /* save off the prepared statement handle and reset row count */
20146 if( pArg ){
20147 pArg->pStmt = pStmt;
20148 pArg->cnt = 0;
20149 }
20150
20151 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
20152 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
20153 sqlite3_stmt *pExplain;
20154 int triggerEQP = 0;
20155 disable_debug_trace_modes();
20156 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
20157 if( pArg->autoEQP>=AUTOEQP_trigger ){
20158 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
20159 }
20160 pExplain = pStmt;
20161 sqlite3_reset(pExplain);
20162 rc = sqlite3_stmt_explain(pExplain, 2);
20163 if( rc==SQLITE_OK ){
20164 while( sqlite3_step(pExplain)==SQLITE_ROW ){
20165 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
20166 int iEqpId = sqlite3_column_int(pExplain, 0);
20167 int iParentId = sqlite3_column_int(pExplain, 1);
20168 if( zEQPLine==0 ) zEQPLine = "";
20169 if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
20170 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
20171 }
20172 eqp_render(pArg, 0);
20173 }
20174 if( pArg->autoEQP>=AUTOEQP_full ){
20175 /* Also do an EXPLAIN for ".eqp full" mode */
20176 sqlite3_reset(pExplain);
20177 rc = sqlite3_stmt_explain(pExplain, 1);
20178 if( rc==SQLITE_OK ){
20179 pArg->cMode = MODE_Explain;
20180 assert( sqlite3_stmt_isexplain(pExplain)==1 );
20181 explain_data_prepare(pArg, pExplain);
20182 exec_prepared_stmt(pArg, pExplain);
20183 explain_data_delete(pArg);
20184 }
20185 }
20186 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
20187 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
20188 }
20189 sqlite3_reset(pStmt);
20190 sqlite3_stmt_explain(pStmt, 0);
20191 restore_debug_trace_modes();
20192 }
20193
20194 if( pArg ){
20195 int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
20196 pArg->cMode = pArg->mode;
20197 if( pArg->autoExplain ){
20198 if( bIsExplain ){
20199 pArg->cMode = MODE_Explain;
20200 }
20201 if( sqlite3_stmt_isexplain(pStmt)==2 ){
20202 pArg->cMode = MODE_EQP;
20203 }
20204 }
20205
20206 /* If the shell is currently in ".explain" mode, gather the extra
20207 ** data required to add indents to the output.*/
20208 if( pArg->cMode==MODE_Explain && bIsExplain ){
20209 explain_data_prepare(pArg, pStmt);
20210 }
20211 }
20212
20213 bind_prepared_stmt(pArg, pStmt);
20214 exec_prepared_stmt(pArg, pStmt);
20215 explain_data_delete(pArg);
20216 eqp_render(pArg, 0);
20217
20218 /* print usage stats if stats on */
20219 if( pArg && pArg->statsOn ){
20220 display_stats(db, pArg, 0);
20221 }
20222
20223 /* print loop-counters if required */
20224 if( pArg && pArg->scanstatsOn ){
20225 display_scanstats(db, pArg);
20226 }
20227
20228 /* Finalize the statement just executed. If this fails, save a
20229 ** copy of the error message. Otherwise, set zSql to point to the
20230 ** next statement to execute. */
20231 rc2 = sqlite3_finalize(pStmt);
20232 if( rc!=SQLITE_NOMEM ) rc = rc2;
20233 if( rc==SQLITE_OK ){
20234 zSql = zLeftover;
20235 while( IsSpace(zSql[0]) ) zSql++;
20236 }else if( pzErrMsg ){
20237 *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
20238 }
20239
20240 /* clear saved stmt handle */
20241 if( pArg ){
20242 pArg->pStmt = NULL;
20243 }
20244 }
20245 } /* end while */
20246
20247 return rc;
20248 }
20249
20250 /*
20251 ** Release memory previously allocated by tableColumnList().
20252 */
20253 static void freeColumnList(char **azCol){
20254 int i;
20255 for(i=1; azCol[i]; i++){
20256 sqlite3_free(azCol[i]);
20257 }
20258 /* azCol[0] is a static string */
20259 sqlite3_free(azCol);
20260 }
20261
20262 /*
20263 ** Return a list of pointers to strings which are the names of all
20264 ** columns in table zTab. The memory to hold the names is dynamically
20265 ** allocated and must be released by the caller using a subsequent call
20266 ** to freeColumnList().
20267 **
20268 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
20269 ** value that needs to be preserved, then azCol[0] is filled in with the
20270 ** name of the rowid column.
20271 **
20272 ** The first regular column in the table is azCol[1]. The list is terminated
20273 ** by an entry with azCol[i]==0.
20274 */
20275 static char **tableColumnList(ShellState *p, const char *zTab){
20276 char **azCol = 0;
20277 sqlite3_stmt *pStmt;
20278 char *zSql;
20279 int nCol = 0;
20280 int nAlloc = 0;
20281 int nPK = 0; /* Number of PRIMARY KEY columns seen */
20282 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
20283 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
20284 int rc;
20285
20286 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
20287 shell_check_oom(zSql);
20288 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20289 sqlite3_free(zSql);
20290 if( rc ) return 0;
20291 while( sqlite3_step(pStmt)==SQLITE_ROW ){
20292 if( nCol>=nAlloc-2 ){
20293 nAlloc = nAlloc*2 + nCol + 10;
20294 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
20295 shell_check_oom(azCol);
20296 }
20297 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
20298 shell_check_oom(azCol[nCol]);
20299 if( sqlite3_column_int(pStmt, 5) ){
20300 nPK++;
20301 if( nPK==1
20302 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
20303 "INTEGER")==0
20304 ){
20305 isIPK = 1;
20306 }else{
20307 isIPK = 0;
20308 }
20309 }
20310 }
20311 sqlite3_finalize(pStmt);
20312 if( azCol==0 ) return 0;
20313 azCol[0] = 0;
20314 azCol[nCol+1] = 0;
20315
20316 /* The decision of whether or not a rowid really needs to be preserved
20317 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
20318 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
20319 ** rowids on tables where the rowid is inaccessible because there are other
20320 ** columns in the table named "rowid", "_rowid_", and "oid".
20321 */
20322 if( preserveRowid && isIPK ){
20323 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
20324 ** might be an alias for the ROWID. But it might also be a WITHOUT ROWID
20325 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
20326 ** ROWID aliases. To distinguish these cases, check to see if
20327 ** there is a "pk" entry in "PRAGMA index_list". There will be
20328 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
20329 */
20330 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
20331 " WHERE origin='pk'", zTab);
20332 shell_check_oom(zSql);
20333 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20334 sqlite3_free(zSql);
20335 if( rc ){
20336 freeColumnList(azCol);
20337 return 0;
20338 }
20339 rc = sqlite3_step(pStmt);
20340 sqlite3_finalize(pStmt);
20341 preserveRowid = rc==SQLITE_ROW;
20342 }
20343 if( preserveRowid ){
20344 /* Only preserve the rowid if we can find a name to use for the
20345 ** rowid */
20346 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
20347 int i, j;
20348 for(j=0; j<3; j++){
20349 for(i=1; i<=nCol; i++){
20350 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
20351 }
20352 if( i>nCol ){
20353 /* At this point, we know that azRowid[j] is not the name of any
20354 ** ordinary column in the table. Verify that azRowid[j] is a valid
20355 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
20356 ** tables will fail this last check */
20357 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
20358 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
20359 break;
20360 }
20361 }
20362 }
20363 return azCol;
20364 }
20365
20366 /*
20367 ** Toggle the reverse_unordered_selects setting.
20368 */
20369 static void toggleSelectOrder(sqlite3 *db){
20370 sqlite3_stmt *pStmt = 0;
20371 int iSetting = 0;
20372 char zStmt[100];
20373 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
20374 if( sqlite3_step(pStmt)==SQLITE_ROW ){
20375 iSetting = sqlite3_column_int(pStmt, 0);
20376 }
20377 sqlite3_finalize(pStmt);
20378 sqlite3_snprintf(sizeof(zStmt), zStmt,
20379 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
20380 sqlite3_exec(db, zStmt, 0, 0, 0);
20381 }
20382
20383 /*
20384 ** This is a different callback routine used for dumping the database.
20385 ** Each row received by this callback consists of a table name,
20386 ** the table type ("index" or "table") and SQL to create the table.
20387 ** This routine should print text sufficient to recreate the table.
20388 */
20389 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
20390 int rc;
20391 const char *zTable;
20392 const char *zType;
20393 const char *zSql;
20394 ShellState *p = (ShellState *)pArg;
20395 int dataOnly;
20396 int noSys;
20397
20398 UNUSED_PARAMETER(azNotUsed);
20399 if( nArg!=3 || azArg==0 ) return 0;
20400 zTable = azArg[0];
20401 zType = azArg[1];
20402 zSql = azArg[2];
20403 if( zTable==0 ) return 0;
20404 if( zType==0 ) return 0;
20405 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
20406 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
20407
20408 if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
20409 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
20410 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
20411 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
20412 }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
20413 return 0;
20414 }else if( dataOnly ){
20415 /* no-op */
20416 }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
20417 char *zIns;
20418 if( !p->writableSchema ){
20419 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
20420 p->writableSchema = 1;
20421 }
20422 zIns = sqlite3_mprintf(
20423 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
20424 "VALUES('table','%q','%q',0,'%q');",
20425 zTable, zTable, zSql);
20426 shell_check_oom(zIns);
20427 utf8_printf(p->out, "%s\n", zIns);
20428 sqlite3_free(zIns);
20429 return 0;
20430 }else{
20431 printSchemaLine(p->out, zSql, ";\n");
20432 }
20433
20434 if( cli_strcmp(zType, "table")==0 ){
20435 ShellText sSelect;
20436 ShellText sTable;
20437 char **azCol;
20438 int i;
20439 char *savedDestTable;
20440 int savedMode;
20441
20442 azCol = tableColumnList(p, zTable);
20443 if( azCol==0 ){
20444 p->nErr++;
20445 return 0;
20446 }
20447
20448 /* Always quote the table name, even if it appears to be pure ascii,
20449 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
20450 initText(&sTable);
20451 appendText(&sTable, zTable, quoteChar(zTable));
20452 /* If preserving the rowid, add a column list after the table name.
20453 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
20454 ** instead of the usual "INSERT INTO tab VALUES(...)".
20455 */
20456 if( azCol[0] ){
20457 appendText(&sTable, "(", 0);
20458 appendText(&sTable, azCol[0], 0);
20459 for(i=1; azCol[i]; i++){
20460 appendText(&sTable, ",", 0);
20461 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
20462 }
20463 appendText(&sTable, ")", 0);
20464 }
20465
20466 /* Build an appropriate SELECT statement */
20467 initText(&sSelect);
20468 appendText(&sSelect, "SELECT ", 0);
20469 if( azCol[0] ){
20470 appendText(&sSelect, azCol[0], 0);
20471 appendText(&sSelect, ",", 0);
20472 }
20473 for(i=1; azCol[i]; i++){
20474 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
20475 if( azCol[i+1] ){
20476 appendText(&sSelect, ",", 0);
20477 }
20478 }
20479 freeColumnList(azCol);
20480 appendText(&sSelect, " FROM ", 0);
20481 appendText(&sSelect, zTable, quoteChar(zTable));
20482
20483 savedDestTable = p->zDestTable;
20484 savedMode = p->mode;
20485 p->zDestTable = sTable.z;
20486 p->mode = p->cMode = MODE_Insert;
20487 rc = shell_exec(p, sSelect.z, 0);
20488 if( (rc&0xff)==SQLITE_CORRUPT ){
20489 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
20490 toggleSelectOrder(p->db);
20491 shell_exec(p, sSelect.z, 0);
20492 toggleSelectOrder(p->db);
20493 }
20494 p->zDestTable = savedDestTable;
20495 p->mode = savedMode;
20496 freeText(&sTable);
20497 freeText(&sSelect);
20498 if( rc ) p->nErr++;
20499 }
20500 return 0;
20501 }
20502
20503 /*
20504 ** Run zQuery. Use dump_callback() as the callback routine so that
20505 ** the contents of the query are output as SQL statements.
20506 **
20507 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
20508 ** "ORDER BY rowid DESC" to the end.
20509 */
20510 static int run_schema_dump_query(
20511 ShellState *p,
20512 const char *zQuery
20513 ){
20514 int rc;
20515 char *zErr = 0;
20516 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
20517 if( rc==SQLITE_CORRUPT ){
20518 char *zQ2;
20519 int len = strlen30(zQuery);
20520 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
20521 if( zErr ){
20522 utf8_printf(p->out, "/****** %s ******/\n", zErr);
20523 sqlite3_free(zErr);
20524 zErr = 0;
20525 }
20526 zQ2 = malloc( len+100 );
20527 if( zQ2==0 ) return rc;
20528 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
20529 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
20530 if( rc ){
20531 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
20532 }else{
20533 rc = SQLITE_CORRUPT;
20534 }
20535 sqlite3_free(zErr);
20536 free(zQ2);
20537 }
20538 return rc;
20539 }
20540
20541 /*
20542 ** Text of help messages.
20543 **
20544 ** The help text for each individual command begins with a line that starts
20545 ** with ".". Subsequent lines are supplemental information.
20546 **
20547 ** There must be two or more spaces between the end of the command and the
20548 ** start of the description of what that command does.
20549 */
20550 static const char *(azHelp[]) = {
20551 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
20552 && !defined(SQLITE_SHELL_FIDDLE)
20553 ".archive ... Manage SQL archives",
20554 " Each command must have exactly one of the following options:",
20555 " -c, --create Create a new archive",
20556 " -u, --update Add or update files with changed mtime",
20557 " -i, --insert Like -u but always add even if unchanged",
20558 " -r, --remove Remove files from archive",
20559 " -t, --list List contents of archive",
20560 " -x, --extract Extract files from archive",
20561 " Optional arguments:",
20562 " -v, --verbose Print each filename as it is processed",
20563 " -f FILE, --file FILE Use archive FILE (default is current db)",
20564 " -a FILE, --append FILE Open FILE using the apndvfs VFS",
20565 " -C DIR, --directory DIR Read/extract files from directory DIR",
20566 " -g, --glob Use glob matching for names in archive",
20567 " -n, --dryrun Show the SQL that would have occurred",
20568 " Examples:",
20569 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar",
20570 " .ar -tf ARCHIVE # List members of ARCHIVE",
20571 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE",
20572 " See also:",
20573 " http://sqlite.org/cli.html#sqlite_archive_support",
20574 #endif
20575 #ifndef SQLITE_OMIT_AUTHORIZATION
20576 ".auth ON|OFF Show authorizer callbacks",
20577 #endif
20578 #ifndef SQLITE_SHELL_FIDDLE
20579 ".backup ?DB? FILE Backup DB (default \"main\") to FILE",
20580 " Options:",
20581 " --append Use the appendvfs",
20582 " --async Write to FILE without journal and fsync()",
20583 #endif
20584 ".bail on|off Stop after hitting an error. Default OFF",
20585 #ifndef SQLITE_SHELL_FIDDLE
20586 ".cd DIRECTORY Change the working directory to DIRECTORY",
20587 #endif
20588 ".changes on|off Show number of rows changed by SQL",
20589 #ifndef SQLITE_SHELL_FIDDLE
20590 ".check GLOB Fail if output since .testcase does not match",
20591 ".clone NEWDB Clone data into NEWDB from the existing database",
20592 #endif
20593 ".connection [close] [#] Open or close an auxiliary database connection",
20594 #if defined(_WIN32) || defined(WIN32)
20595 ".crnl on|off Translate \\n to \\r\\n. Default ON",
20596 #endif
20597 ".databases List names and files of attached databases",
20598 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
20599 #if SQLITE_SHELL_HAVE_RECOVER
20600 ".dbinfo ?DB? Show status information about the database",
20601 #endif
20602 ".dump ?OBJECTS? Render database content as SQL",
20603 " Options:",
20604 " --data-only Output only INSERT statements",
20605 " --newlines Allow unescaped newline characters in output",
20606 " --nosys Omit system tables (ex: \"sqlite_stat1\")",
20607 " --preserve-rowids Include ROWID values in the output",
20608 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
20609 " Additional LIKE patterns can be given in subsequent arguments",
20610 ".echo on|off Turn command echo on or off",
20611 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN",
20612 " Other Modes:",
20613 #ifdef SQLITE_DEBUG
20614 " test Show raw EXPLAIN QUERY PLAN output",
20615 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"",
20616 #endif
20617 " trigger Like \"full\" but also show trigger bytecode",
20618 #ifndef SQLITE_SHELL_FIDDLE
20619 ".excel Display the output of next command in spreadsheet",
20620 " --bom Put a UTF8 byte-order mark on intermediate file",
20621 #endif
20622 #ifndef SQLITE_SHELL_FIDDLE
20623 ".exit ?CODE? Exit this program with return-code CODE",
20624 #endif
20625 ".expert EXPERIMENTAL. Suggest indexes for queries",
20626 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto",
20627 ".filectrl CMD ... Run various sqlite3_file_control() operations",
20628 " --schema SCHEMA Use SCHEMA instead of \"main\"",
20629 " --help Show CMD details",
20630 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables",
20631 ".headers on|off Turn display of headers on or off",
20632 ".help ?-all? ?PATTERN? Show help text for PATTERN",
20633 #ifndef SQLITE_SHELL_FIDDLE
20634 ".import FILE TABLE Import data from FILE into TABLE",
20635 " Options:",
20636 " --ascii Use \\037 and \\036 as column and row separators",
20637 " --csv Use , and \\n as column and row separators",
20638 " --skip N Skip the first N rows of input",
20639 " --schema S Target table to be S.TABLE",
20640 " -v \"Verbose\" - increase auxiliary output",
20641 " Notes:",
20642 " * If TABLE does not exist, it is created. The first row of input",
20643 " determines the column names.",
20644 " * If neither --csv or --ascii are used, the input mode is derived",
20645 " from the \".mode\" output mode",
20646 " * If FILE begins with \"|\" then it is a command that generates the",
20647 " input text.",
20648 #endif
20649 #ifndef SQLITE_OMIT_TEST_CONTROL
20650 ",imposter INDEX TABLE Create imposter table TABLE on index INDEX",
20651 #endif
20652 ".indexes ?TABLE? Show names of indexes",
20653 " If TABLE is specified, only show indexes for",
20654 " tables matching TABLE using the LIKE operator.",
20655 #ifdef SQLITE_ENABLE_IOTRACE
20656 ",iotrace FILE Enable I/O diagnostic logging to FILE",
20657 #endif
20658 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT",
20659 ".lint OPTIONS Report potential schema issues.",
20660 " Options:",
20661 " fkey-indexes Find missing foreign key indexes",
20662 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
20663 ".load FILE ?ENTRY? Load an extension library",
20664 #endif
20665 #if !defined(SQLITE_SHELL_FIDDLE)
20666 ".log FILE|on|off Turn logging on or off. FILE can be stderr/stdout",
20667 #else
20668 ".log on|off Turn logging on or off.",
20669 #endif
20670 ".mode MODE ?OPTIONS? Set output mode",
20671 " MODE is one of:",
20672 " ascii Columns/rows delimited by 0x1F and 0x1E",
20673 " box Tables using unicode box-drawing characters",
20674 " csv Comma-separated values",
20675 " column Output in columns. (See .width)",
20676 " html HTML <table> code",
20677 " insert SQL insert statements for TABLE",
20678 " json Results in a JSON array",
20679 " line One value per line",
20680 " list Values delimited by \"|\"",
20681 " markdown Markdown table format",
20682 " qbox Shorthand for \"box --wrap 60 --quote\"",
20683 " quote Escape answers as for SQL",
20684 " table ASCII-art table",
20685 " tabs Tab-separated values",
20686 " tcl TCL list elements",
20687 " OPTIONS: (for columnar modes or insert mode):",
20688 " --wrap N Wrap output lines to no longer than N characters",
20689 " --wordwrap B Wrap or not at word boundaries per B (on/off)",
20690 " --ww Shorthand for \"--wordwrap 1\"",
20691 " --quote Quote output text as SQL literals",
20692 " --noquote Do not quote output text",
20693 " TABLE The name of SQL table used for \"insert\" mode",
20694 #ifndef SQLITE_SHELL_FIDDLE
20695 ".nonce STRING Suspend safe mode for one command if nonce matches",
20696 #endif
20697 ".nullvalue STRING Use STRING in place of NULL values",
20698 #ifndef SQLITE_SHELL_FIDDLE
20699 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE",
20700 " If FILE begins with '|' then open as a pipe",
20701 " --bom Put a UTF8 byte-order mark at the beginning",
20702 " -e Send output to the system text editor",
20703 " -x Send output as CSV to a spreadsheet (same as \".excel\")",
20704 /* Note that .open is (partially) available in WASM builds but is
20705 ** currently only intended to be used by the fiddle tool, not
20706 ** end users, so is "undocumented." */
20707 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE",
20708 " Options:",
20709 " --append Use appendvfs to append database to the end of FILE",
20710 #endif
20711 #ifndef SQLITE_OMIT_DESERIALIZE
20712 " --deserialize Load into memory using sqlite3_deserialize()",
20713 " --hexdb Load the output of \"dbtotxt\" as an in-memory db",
20714 " --maxsize N Maximum size for --hexdb or --deserialized database",
20715 #endif
20716 " --new Initialize FILE to an empty database",
20717 " --nofollow Do not follow symbolic links",
20718 " --readonly Open FILE readonly",
20719 " --zip FILE is a ZIP archive",
20720 #ifndef SQLITE_SHELL_FIDDLE
20721 ".output ?FILE? Send output to FILE or stdout if FILE is omitted",
20722 " If FILE begins with '|' then open it as a pipe.",
20723 " Options:",
20724 " --bom Prefix output with a UTF8 byte-order mark",
20725 " -e Send output to the system text editor",
20726 " -x Send output as CSV to a spreadsheet",
20727 #endif
20728 ".parameter CMD ... Manage SQL parameter bindings",
20729 " clear Erase all bindings",
20730 " init Initialize the TEMP table that holds bindings",
20731 " list List the current parameter bindings",
20732 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE",
20733 " PARAMETER should start with one of: $ : @ ?",
20734 " unset PARAMETER Remove PARAMETER from the binding table",
20735 ".print STRING... Print literal STRING",
20736 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
20737 ".progress N Invoke progress handler after every N opcodes",
20738 " --limit N Interrupt after N progress callbacks",
20739 " --once Do no more than one progress interrupt",
20740 " --quiet|-q No output except at interrupts",
20741 " --reset Reset the count for each input and interrupt",
20742 #endif
20743 ".prompt MAIN CONTINUE Replace the standard prompts",
20744 #ifndef SQLITE_SHELL_FIDDLE
20745 ".quit Stop interpreting input stream, exit if primary.",
20746 ".read FILE Read input from FILE or command output",
20747 " If FILE begins with \"|\", it is a command that generates the input.",
20748 #endif
20749 #if SQLITE_SHELL_HAVE_RECOVER
20750 ".recover Recover as much data as possible from corrupt db.",
20751 " --ignore-freelist Ignore pages that appear to be on db freelist",
20752 " --lost-and-found TABLE Alternative name for the lost-and-found table",
20753 " --no-rowids Do not attempt to recover rowid values",
20754 " that are not also INTEGER PRIMARY KEYs",
20755 #endif
20756 #ifndef SQLITE_SHELL_FIDDLE
20757 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE",
20758 ".save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)",
20759 #endif
20760 ".scanstats on|off|est Turn sqlite3_stmt_scanstatus() metrics on or off",
20761 ".schema ?PATTERN? Show the CREATE statements matching PATTERN",
20762 " Options:",
20763 " --indent Try to pretty-print the schema",
20764 " --nosys Omit objects whose names start with \"sqlite_\"",
20765 ",selftest ?OPTIONS? Run tests defined in the SELFTEST table",
20766 " Options:",
20767 " --init Create a new SELFTEST table",
20768 " -v Verbose output",
20769 ".separator COL ?ROW? Change the column and row separators",
20770 #if defined(SQLITE_ENABLE_SESSION)
20771 ".session ?NAME? CMD ... Create or control sessions",
20772 " Subcommands:",
20773 " attach TABLE Attach TABLE",
20774 " changeset FILE Write a changeset into FILE",
20775 " close Close one session",
20776 " enable ?BOOLEAN? Set or query the enable bit",
20777 " filter GLOB... Reject tables matching GLOBs",
20778 " indirect ?BOOLEAN? Mark or query the indirect status",
20779 " isempty Query whether the session is empty",
20780 " list List currently open session names",
20781 " open DB NAME Open a new session on DB",
20782 " patchset FILE Write a patchset into FILE",
20783 " If ?NAME? is omitted, the first defined session is used.",
20784 #endif
20785 ".sha3sum ... Compute a SHA3 hash of database content",
20786 " Options:",
20787 " --schema Also hash the sqlite_schema table",
20788 " --sha3-224 Use the sha3-224 algorithm",
20789 " --sha3-256 Use the sha3-256 algorithm (default)",
20790 " --sha3-384 Use the sha3-384 algorithm",
20791 " --sha3-512 Use the sha3-512 algorithm",
20792 " Any other argument is a LIKE pattern for tables to hash",
20793 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
20794 ".shell CMD ARGS... Run CMD ARGS... in a system shell",
20795 #endif
20796 ".show Show the current values for various settings",
20797 ".stats ?ARG? Show stats or turn stats on or off",
20798 " off Turn off automatic stat display",
20799 " on Turn on automatic stat display",
20800 " stmt Show statement stats",
20801 " vmstep Show the virtual machine step count only",
20802 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
20803 ".system CMD ARGS... Run CMD ARGS... in a system shell",
20804 #endif
20805 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE",
20806 #ifndef SQLITE_SHELL_FIDDLE
20807 ",testcase NAME Begin redirecting output to 'testcase-out.txt'",
20808 #endif
20809 ",testctrl CMD ... Run various sqlite3_test_control() operations",
20810 " Run \".testctrl\" with no arguments for details",
20811 ".timeout MS Try opening locked tables for MS milliseconds",
20812 ".timer on|off Turn SQL timer on or off",
20813 #ifndef SQLITE_OMIT_TRACE
20814 ".trace ?OPTIONS? Output each SQL statement as it is run",
20815 " FILE Send output to FILE",
20816 " stdout Send output to stdout",
20817 " stderr Send output to stderr",
20818 " off Disable tracing",
20819 " --expanded Expand query parameters",
20820 #ifdef SQLITE_ENABLE_NORMALIZE
20821 " --normalized Normal the SQL statements",
20822 #endif
20823 " --plain Show SQL as it is input",
20824 " --stmt Trace statement execution (SQLITE_TRACE_STMT)",
20825 " --profile Profile statements (SQLITE_TRACE_PROFILE)",
20826 " --row Trace each row (SQLITE_TRACE_ROW)",
20827 " --close Trace connection close (SQLITE_TRACE_CLOSE)",
20828 #endif /* SQLITE_OMIT_TRACE */
20829 #ifdef SQLITE_DEBUG
20830 ".unmodule NAME ... Unregister virtual table modules",
20831 " --allexcept Unregister everything except those named",
20832 #endif
20833 ".version Show source, library and compiler versions",
20834 ".vfsinfo ?AUX? Information about the top-level VFS",
20835 ".vfslist List all available VFSes",
20836 ".vfsname ?AUX? Print the name of the VFS stack",
20837 ".width NUM1 NUM2 ... Set minimum column widths for columnar output",
20838 " Negative values right-justify",
20839 };
20840
20841 /*
20842 ** Output help text.
20843 **
20844 ** zPattern describes the set of commands for which help text is provided.
20845 ** If zPattern is NULL, then show all commands, but only give a one-line
20846 ** description of each.
20847 **
20848 ** Return the number of matches.
20849 */
20850 static int showHelp(FILE *out, const char *zPattern){
20851 int i = 0;
20852 int j = 0;
20853 int n = 0;
20854 char *zPat;
20855 if( zPattern==0
20856 || zPattern[0]=='0'
20857 || cli_strcmp(zPattern,"-a")==0
20858 || cli_strcmp(zPattern,"-all")==0
20859 || cli_strcmp(zPattern,"--all")==0
20860 ){
20861 enum HelpWanted { HW_NoCull = 0, HW_SummaryOnly = 1, HW_Undoc = 2 };
20862 enum HelpHave { HH_Undoc = 2, HH_Summary = 1, HH_More = 0 };
20863 /* Show all or most commands
20864 ** *zPattern==0 => summary of documented commands only
20865 ** *zPattern=='0' => whole help for undocumented commands
20866 ** Otherwise => whole help for documented commands
20867 */
20868 enum HelpWanted hw = HW_SummaryOnly;
20869 enum HelpHave hh = HH_More;
20870 if( zPattern!=0 ){
20871 hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull;
20872 }
20873 for(i=0; i<ArraySize(azHelp); i++){
20874 switch( azHelp[i][0] ){
20875 case ',':
20876 hh = HH_Summary|HH_Undoc;
20877 break;
20878 case '.':
20879 hh = HH_Summary;
20880 break;
20881 default:
20882 hh &= ~HH_Summary;
20883 break;
20884 }
20885 if( ((hw^hh)&HH_Undoc)==0 ){
20886 if( (hh&HH_Summary)!=0 ){
20887 utf8_printf(out, ".%s\n", azHelp[i]+1);
20888 ++n;
20889 }else if( (hw&HW_SummaryOnly)==0 ){
20890 utf8_printf(out, "%s\n", azHelp[i]);
20891 }
20892 }
20893 }
20894 }else{
20895 /* Seek documented commands for which zPattern is an exact prefix */
20896 zPat = sqlite3_mprintf(".%s*", zPattern);
20897 shell_check_oom(zPat);
20898 for(i=0; i<ArraySize(azHelp); i++){
20899 if( sqlite3_strglob(zPat, azHelp[i])==0 ){
20900 utf8_printf(out, "%s\n", azHelp[i]);
20901 j = i+1;
20902 n++;
20903 }
20904 }
20905 sqlite3_free(zPat);
20906 if( n ){
20907 if( n==1 ){
20908 /* when zPattern is a prefix of exactly one command, then include
20909 ** the details of that command, which should begin at offset j */
20910 while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
20911 utf8_printf(out, "%s\n", azHelp[j]);
20912 j++;
20913 }
20914 }
20915 return n;
20916 }
20917 /* Look for documented commands that contain zPattern anywhere.
20918 ** Show complete text of all documented commands that match. */
20919 zPat = sqlite3_mprintf("%%%s%%", zPattern);
20920 shell_check_oom(zPat);
20921 for(i=0; i<ArraySize(azHelp); i++){
20922 if( azHelp[i][0]==',' ){
20923 while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
20924 continue;
20925 }
20926 if( azHelp[i][0]=='.' ) j = i;
20927 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
20928 utf8_printf(out, "%s\n", azHelp[j]);
20929 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
20930 j++;
20931 utf8_printf(out, "%s\n", azHelp[j]);
20932 }
20933 i = j;
20934 n++;
20935 }
20936 }
20937 sqlite3_free(zPat);
20938 }
20939 return n;
20940 }
20941
20942 /* Forward reference */
20943 static int process_input(ShellState *p);
20944
20945 /*
20946 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
20947 ** and return a pointer to the buffer. The caller is responsible for freeing
20948 ** the memory.
20949 **
20950 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
20951 ** read.
20952 **
20953 ** For convenience, a nul-terminator byte is always appended to the data read
20954 ** from the file before the buffer is returned. This byte is not included in
20955 ** the final value of (*pnByte), if applicable.
20956 **
20957 ** NULL is returned if any error is encountered. The final value of *pnByte
20958 ** is undefined in this case.
20959 */
20960 static char *readFile(const char *zName, int *pnByte){
20961 FILE *in = fopen(zName, "rb");
20962 long nIn;
20963 size_t nRead;
20964 char *pBuf;
20965 int rc;
20966 if( in==0 ) return 0;
20967 rc = fseek(in, 0, SEEK_END);
20968 if( rc!=0 ){
20969 raw_printf(stderr, "Error: '%s' not seekable\n", zName);
20970 fclose(in);
20971 return 0;
20972 }
20973 nIn = ftell(in);
20974 rewind(in);
20975 pBuf = sqlite3_malloc64( nIn+1 );
20976 if( pBuf==0 ){
20977 raw_printf(stderr, "Error: out of memory\n");
20978 fclose(in);
20979 return 0;
20980 }
20981 nRead = fread(pBuf, nIn, 1, in);
20982 fclose(in);
20983 if( nRead!=1 ){
20984 sqlite3_free(pBuf);
20985 raw_printf(stderr, "Error: cannot read '%s'\n", zName);
20986 return 0;
20987 }
20988 pBuf[nIn] = 0;
20989 if( pnByte ) *pnByte = nIn;
20990 return pBuf;
20991 }
20992
20993 #if defined(SQLITE_ENABLE_SESSION)
20994 /*
20995 ** Close a single OpenSession object and release all of its associated
20996 ** resources.
20997 */
20998 static void session_close(OpenSession *pSession){
20999 int i;
21000 sqlite3session_delete(pSession->p);
21001 sqlite3_free(pSession->zName);
21002 for(i=0; i<pSession->nFilter; i++){
21003 sqlite3_free(pSession->azFilter[i]);
21004 }
21005 sqlite3_free(pSession->azFilter);
21006 memset(pSession, 0, sizeof(OpenSession));
21007 }
21008 #endif
21009
21010 /*
21011 ** Close all OpenSession objects and release all associated resources.
21012 */
21013 #if defined(SQLITE_ENABLE_SESSION)
21014 static void session_close_all(ShellState *p, int i){
21015 int j;
21016 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
21017 for(j=0; j<pAuxDb->nSession; j++){
21018 session_close(&pAuxDb->aSession[j]);
21019 }
21020 pAuxDb->nSession = 0;
21021 }
21022 #else
21023 # define session_close_all(X,Y)
21024 #endif
21025
21026 /*
21027 ** Implementation of the xFilter function for an open session. Omit
21028 ** any tables named by ".session filter" but let all other table through.
21029 */
21030 #if defined(SQLITE_ENABLE_SESSION)
21031 static int session_filter(void *pCtx, const char *zTab){
21032 OpenSession *pSession = (OpenSession*)pCtx;
21033 int i;
21034 for(i=0; i<pSession->nFilter; i++){
21035 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
21036 }
21037 return 1;
21038 }
21039 #endif
21040
21041 /*
21042 ** Try to deduce the type of file for zName based on its content. Return
21043 ** one of the SHELL_OPEN_* constants.
21044 **
21045 ** If the file does not exist or is empty but its name looks like a ZIP
21046 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
21047 ** Otherwise, assume an ordinary database regardless of the filename if
21048 ** the type cannot be determined from content.
21049 */
21050 int deduceDatabaseType(const char *zName, int dfltZip){
21051 FILE *f = fopen(zName, "rb");
21052 size_t n;
21053 int rc = SHELL_OPEN_UNSPEC;
21054 char zBuf[100];
21055 if( f==0 ){
21056 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
21057 return SHELL_OPEN_ZIPFILE;
21058 }else{
21059 return SHELL_OPEN_NORMAL;
21060 }
21061 }
21062 n = fread(zBuf, 16, 1, f);
21063 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
21064 fclose(f);
21065 return SHELL_OPEN_NORMAL;
21066 }
21067 fseek(f, -25, SEEK_END);
21068 n = fread(zBuf, 25, 1, f);
21069 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
21070 rc = SHELL_OPEN_APPENDVFS;
21071 }else{
21072 fseek(f, -22, SEEK_END);
21073 n = fread(zBuf, 22, 1, f);
21074 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
21075 && zBuf[3]==0x06 ){
21076 rc = SHELL_OPEN_ZIPFILE;
21077 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
21078 rc = SHELL_OPEN_ZIPFILE;
21079 }
21080 }
21081 fclose(f);
21082 return rc;
21083 }
21084
21085 #ifndef SQLITE_OMIT_DESERIALIZE
21086 /*
21087 ** Reconstruct an in-memory database using the output from the "dbtotxt"
21088 ** program. Read content from the file in p->aAuxDb[].zDbFilename.
21089 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
21090 */
21091 static unsigned char *readHexDb(ShellState *p, int *pnData){
21092 unsigned char *a = 0;
21093 int nLine;
21094 int n = 0;
21095 int pgsz = 0;
21096 int iOffset = 0;
21097 int j, k;
21098 int rc;
21099 FILE *in;
21100 const char *zDbFilename = p->pAuxDb->zDbFilename;
21101 unsigned int x[16];
21102 char zLine[1000];
21103 if( zDbFilename ){
21104 in = fopen(zDbFilename, "r");
21105 if( in==0 ){
21106 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
21107 return 0;
21108 }
21109 nLine = 0;
21110 }else{
21111 in = p->in;
21112 nLine = p->lineno;
21113 if( in==0 ) in = stdin;
21114 }
21115 *pnData = 0;
21116 nLine++;
21117 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
21118 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
21119 if( rc!=2 ) goto readHexDb_error;
21120 if( n<0 ) goto readHexDb_error;
21121 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
21122 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */
21123 a = sqlite3_malloc( n ? n : 1 );
21124 shell_check_oom(a);
21125 memset(a, 0, n);
21126 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
21127 utf8_printf(stderr, "invalid pagesize\n");
21128 goto readHexDb_error;
21129 }
21130 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
21131 rc = sscanf(zLine, "| page %d offset %d", &j, &k);
21132 if( rc==2 ){
21133 iOffset = k;
21134 continue;
21135 }
21136 if( cli_strncmp(zLine, "| end ", 6)==0 ){
21137 break;
21138 }
21139 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
21140 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
21141 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
21142 if( rc==17 ){
21143 k = iOffset+j;
21144 if( k+16<=n && k>=0 ){
21145 int ii;
21146 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
21147 }
21148 }
21149 }
21150 *pnData = n;
21151 if( in!=p->in ){
21152 fclose(in);
21153 }else{
21154 p->lineno = nLine;
21155 }
21156 return a;
21157
21158 readHexDb_error:
21159 if( in!=p->in ){
21160 fclose(in);
21161 }else{
21162 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
21163 nLine++;
21164 if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
21165 }
21166 p->lineno = nLine;
21167 }
21168 sqlite3_free(a);
21169 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
21170 return 0;
21171 }
21172 #endif /* SQLITE_OMIT_DESERIALIZE */
21173
21174 /*
21175 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
21176 */
21177 static void shellUSleepFunc(
21178 sqlite3_context *context,
21179 int argcUnused,
21180 sqlite3_value **argv
21181 ){
21182 int sleep = sqlite3_value_int(argv[0]);
21183 (void)argcUnused;
21184 sqlite3_sleep(sleep/1000);
21185 sqlite3_result_int(context, sleep);
21186 }
21187
21188 /* Flags for open_db().
21189 **
21190 ** The default behavior of open_db() is to exit(1) if the database fails to
21191 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
21192 ** but still returns without calling exit.
21193 **
21194 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
21195 ** ZIP archive if the file does not exist or is empty and its name matches
21196 ** the *.zip pattern.
21197 */
21198 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */
21199 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */
21200
21201 /*
21202 ** Make sure the database is open. If it is not, then open it. If
21203 ** the database fails to open, print an error message and exit.
21204 */
21205 static void open_db(ShellState *p, int openFlags){
21206 if( p->db==0 ){
21207 const char *zDbFilename = p->pAuxDb->zDbFilename;
21208 if( p->openMode==SHELL_OPEN_UNSPEC ){
21209 if( zDbFilename==0 || zDbFilename[0]==0 ){
21210 p->openMode = SHELL_OPEN_NORMAL;
21211 }else{
21212 p->openMode = (u8)deduceDatabaseType(zDbFilename,
21213 (openFlags & OPEN_DB_ZIPFILE)!=0);
21214 }
21215 }
21216 switch( p->openMode ){
21217 case SHELL_OPEN_APPENDVFS: {
21218 sqlite3_open_v2(zDbFilename, &p->db,
21219 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
21220 break;
21221 }
21222 case SHELL_OPEN_HEXDB:
21223 case SHELL_OPEN_DESERIALIZE: {
21224 sqlite3_open(0, &p->db);
21225 break;
21226 }
21227 case SHELL_OPEN_ZIPFILE: {
21228 sqlite3_open(":memory:", &p->db);
21229 break;
21230 }
21231 case SHELL_OPEN_READONLY: {
21232 sqlite3_open_v2(zDbFilename, &p->db,
21233 SQLITE_OPEN_READONLY|p->openFlags, 0);
21234 break;
21235 }
21236 case SHELL_OPEN_UNSPEC:
21237 case SHELL_OPEN_NORMAL: {
21238 sqlite3_open_v2(zDbFilename, &p->db,
21239 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
21240 break;
21241 }
21242 }
21243 globalDb = p->db;
21244 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
21245 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
21246 zDbFilename, sqlite3_errmsg(p->db));
21247 if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
21248 exit(1);
21249 }
21250 sqlite3_close(p->db);
21251 sqlite3_open(":memory:", &p->db);
21252 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
21253 utf8_printf(stderr,
21254 "Also: unable to open substitute in-memory database.\n"
21255 );
21256 exit(1);
21257 }else{
21258 utf8_printf(stderr,
21259 "Notice: using substitute in-memory database instead of \"%s\"\n",
21260 zDbFilename);
21261 }
21262 }
21263 sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
21264
21265 /* Reflect the use or absence of --unsafe-testing invocation. */
21266 {
21267 int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
21268 sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0);
21269 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0);
21270 }
21271
21272 #ifndef SQLITE_OMIT_LOAD_EXTENSION
21273 sqlite3_enable_load_extension(p->db, 1);
21274 #endif
21275 sqlite3_shathree_init(p->db, 0, 0);
21276 sqlite3_uint_init(p->db, 0, 0);
21277 sqlite3_decimal_init(p->db, 0, 0);
21278 sqlite3_base64_init(p->db, 0, 0);
21279 sqlite3_base85_init(p->db, 0, 0);
21280 sqlite3_regexp_init(p->db, 0, 0);
21281 sqlite3_ieee_init(p->db, 0, 0);
21282 sqlite3_series_init(p->db, 0, 0);
21283 #ifndef SQLITE_SHELL_FIDDLE
21284 sqlite3_fileio_init(p->db, 0, 0);
21285 sqlite3_completion_init(p->db, 0, 0);
21286 #endif
21287 #ifdef SQLITE_HAVE_ZLIB
21288 if( !p->bSafeModePersist ){
21289 sqlite3_zipfile_init(p->db, 0, 0);
21290 sqlite3_sqlar_init(p->db, 0, 0);
21291 }
21292 #endif
21293 #ifdef SQLITE_SHELL_EXTFUNCS
21294 /* Create a preprocessing mechanism for extensions to make
21295 * their own provisions for being built into the shell.
21296 * This is a short-span macro. See further below for usage.
21297 */
21298 #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
21299 #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
21300 /* Let custom-included extensions get their ..._init() called.
21301 * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
21302 * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
21303 * initialization routine to be called.
21304 */
21305 {
21306 int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
21307 /* Let custom-included extensions expose their functionality.
21308 * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
21309 * the SQL functions, virtual tables, collating sequences or
21310 * VFS's implemented by the extension to be registered.
21311 */
21312 if( irc==SQLITE_OK
21313 || irc==SQLITE_OK_LOAD_PERMANENTLY ){
21314 SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
21315 }
21316 #undef SHELL_SUB_MACRO
21317 #undef SHELL_SUBMACRO
21318 }
21319 #endif
21320
21321 sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0,
21322 shellStrtod, 0, 0);
21323 sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0,
21324 shellDtostr, 0, 0);
21325 sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0,
21326 shellDtostr, 0, 0);
21327 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
21328 shellAddSchemaName, 0, 0);
21329 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
21330 shellModuleSchema, 0, 0);
21331 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
21332 shellPutsFunc, 0, 0);
21333 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
21334 shellUSleepFunc, 0, 0);
21335 #ifndef SQLITE_NOHAVE_SYSTEM
21336 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
21337 editFunc, 0, 0);
21338 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
21339 editFunc, 0, 0);
21340 #endif
21341
21342 if( p->openMode==SHELL_OPEN_ZIPFILE ){
21343 char *zSql = sqlite3_mprintf(
21344 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
21345 shell_check_oom(zSql);
21346 sqlite3_exec(p->db, zSql, 0, 0, 0);
21347 sqlite3_free(zSql);
21348 }
21349 #ifndef SQLITE_OMIT_DESERIALIZE
21350 else
21351 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
21352 int rc;
21353 int nData = 0;
21354 unsigned char *aData;
21355 if( p->openMode==SHELL_OPEN_DESERIALIZE ){
21356 aData = (unsigned char*)readFile(zDbFilename, &nData);
21357 }else{
21358 aData = readHexDb(p, &nData);
21359 }
21360 if( aData==0 ){
21361 return;
21362 }
21363 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
21364 SQLITE_DESERIALIZE_RESIZEABLE |
21365 SQLITE_DESERIALIZE_FREEONCLOSE);
21366 if( rc ){
21367 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
21368 }
21369 if( p->szMax>0 ){
21370 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
21371 }
21372 }
21373 #endif
21374 }
21375 if( p->db!=0 ){
21376 if( p->bSafeModePersist ){
21377 sqlite3_set_authorizer(p->db, safeModeAuth, p);
21378 }
21379 sqlite3_db_config(
21380 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
21381 );
21382 }
21383 }
21384
21385 /*
21386 ** Attempt to close the database connection. Report errors.
21387 */
21388 void close_db(sqlite3 *db){
21389 int rc = sqlite3_close(db);
21390 if( rc ){
21391 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
21392 rc, sqlite3_errmsg(db));
21393 }
21394 }
21395
21396 #if HAVE_READLINE || HAVE_EDITLINE
21397 /*
21398 ** Readline completion callbacks
21399 */
21400 static char *readline_completion_generator(const char *text, int state){
21401 static sqlite3_stmt *pStmt = 0;
21402 char *zRet;
21403 if( state==0 ){
21404 char *zSql;
21405 sqlite3_finalize(pStmt);
21406 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
21407 " FROM completion(%Q) ORDER BY 1", text);
21408 shell_check_oom(zSql);
21409 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
21410 sqlite3_free(zSql);
21411 }
21412 if( sqlite3_step(pStmt)==SQLITE_ROW ){
21413 const char *z = (const char*)sqlite3_column_text(pStmt,0);
21414 zRet = z ? strdup(z) : 0;
21415 }else{
21416 sqlite3_finalize(pStmt);
21417 pStmt = 0;
21418 zRet = 0;
21419 }
21420 return zRet;
21421 }
21422 static char **readline_completion(const char *zText, int iStart, int iEnd){
21423 (void)iStart;
21424 (void)iEnd;
21425 rl_attempted_completion_over = 1;
21426 return rl_completion_matches(zText, readline_completion_generator);
21427 }
21428
21429 #elif HAVE_LINENOISE
21430 /*
21431 ** Linenoise completion callback
21432 */
21433 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
21434 i64 nLine = strlen(zLine);
21435 i64 i, iStart;
21436 sqlite3_stmt *pStmt = 0;
21437 char *zSql;
21438 char zBuf[1000];
21439
21440 if( nLine>(i64)sizeof(zBuf)-30 ) return;
21441 if( zLine[0]=='.' || zLine[0]=='#') return;
21442 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
21443 if( i==nLine-1 ) return;
21444 iStart = i+1;
21445 memcpy(zBuf, zLine, iStart);
21446 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
21447 " FROM completion(%Q,%Q) ORDER BY 1",
21448 &zLine[iStart], zLine);
21449 shell_check_oom(zSql);
21450 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
21451 sqlite3_free(zSql);
21452 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
21453 while( sqlite3_step(pStmt)==SQLITE_ROW ){
21454 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
21455 int nCompletion = sqlite3_column_bytes(pStmt, 0);
21456 if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
21457 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
21458 linenoiseAddCompletion(lc, zBuf);
21459 }
21460 }
21461 sqlite3_finalize(pStmt);
21462 }
21463 #endif
21464
21465 /*
21466 ** Do C-language style dequoting.
21467 **
21468 ** \a -> alarm
21469 ** \b -> backspace
21470 ** \t -> tab
21471 ** \n -> newline
21472 ** \v -> vertical tab
21473 ** \f -> form feed
21474 ** \r -> carriage return
21475 ** \s -> space
21476 ** \" -> "
21477 ** \' -> '
21478 ** \\ -> backslash
21479 ** \NNN -> ascii character NNN in octal
21480 ** \xHH -> ascii character HH in hexadecimal
21481 */
21482 static void resolve_backslashes(char *z){
21483 int i, j;
21484 char c;
21485 while( *z && *z!='\\' ) z++;
21486 for(i=j=0; (c = z[i])!=0; i++, j++){
21487 if( c=='\\' && z[i+1]!=0 ){
21488 c = z[++i];
21489 if( c=='a' ){
21490 c = '\a';
21491 }else if( c=='b' ){
21492 c = '\b';
21493 }else if( c=='t' ){
21494 c = '\t';
21495 }else if( c=='n' ){
21496 c = '\n';
21497 }else if( c=='v' ){
21498 c = '\v';
21499 }else if( c=='f' ){
21500 c = '\f';
21501 }else if( c=='r' ){
21502 c = '\r';
21503 }else if( c=='"' ){
21504 c = '"';
21505 }else if( c=='\'' ){
21506 c = '\'';
21507 }else if( c=='\\' ){
21508 c = '\\';
21509 }else if( c=='x' ){
21510 int nhd = 0, hdv;
21511 u8 hv = 0;
21512 while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
21513 hv = (u8)((hv<<4)|hdv);
21514 ++nhd;
21515 }
21516 i += nhd;
21517 c = (u8)hv;
21518 }else if( c>='0' && c<='7' ){
21519 c -= '0';
21520 if( z[i+1]>='0' && z[i+1]<='7' ){
21521 i++;
21522 c = (c<<3) + z[i] - '0';
21523 if( z[i+1]>='0' && z[i+1]<='7' ){
21524 i++;
21525 c = (c<<3) + z[i] - '0';
21526 }
21527 }
21528 }
21529 }
21530 z[j] = c;
21531 }
21532 if( j<i ) z[j] = 0;
21533 }
21534
21535 /*
21536 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
21537 ** for TRUE and FALSE. Return the integer value if appropriate.
21538 */
21539 static int booleanValue(const char *zArg){
21540 int i;
21541 if( zArg[0]=='0' && zArg[1]=='x' ){
21542 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
21543 }else{
21544 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
21545 }
21546 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
21547 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
21548 return 1;
21549 }
21550 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
21551 return 0;
21552 }
21553 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
21554 zArg);
21555 return 0;
21556 }
21557
21558 /*
21559 ** Set or clear a shell flag according to a boolean value.
21560 */
21561 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
21562 if( booleanValue(zArg) ){
21563 ShellSetFlag(p, mFlag);
21564 }else{
21565 ShellClearFlag(p, mFlag);
21566 }
21567 }
21568
21569 /*
21570 ** Close an output file, assuming it is not stderr or stdout
21571 */
21572 static void output_file_close(FILE *f){
21573 if( f && f!=stdout && f!=stderr ) fclose(f);
21574 }
21575
21576 /*
21577 ** Try to open an output file. The names "stdout" and "stderr" are
21578 ** recognized and do the right thing. NULL is returned if the output
21579 ** filename is "off".
21580 */
21581 static FILE *output_file_open(const char *zFile, int bTextMode){
21582 FILE *f;
21583 if( cli_strcmp(zFile,"stdout")==0 ){
21584 f = stdout;
21585 }else if( cli_strcmp(zFile, "stderr")==0 ){
21586 f = stderr;
21587 }else if( cli_strcmp(zFile, "off")==0 ){
21588 f = 0;
21589 }else{
21590 f = fopen(zFile, bTextMode ? "w" : "wb");
21591 if( f==0 ){
21592 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
21593 }
21594 }
21595 return f;
21596 }
21597
21598 #ifndef SQLITE_OMIT_TRACE
21599 /*
21600 ** A routine for handling output from sqlite3_trace().
21601 */
21602 static int sql_trace_callback(
21603 unsigned mType, /* The trace type */
21604 void *pArg, /* The ShellState pointer */
21605 void *pP, /* Usually a pointer to sqlite_stmt */
21606 void *pX /* Auxiliary output */
21607 ){
21608 ShellState *p = (ShellState*)pArg;
21609 sqlite3_stmt *pStmt;
21610 const char *zSql;
21611 i64 nSql;
21612 if( p->traceOut==0 ) return 0;
21613 if( mType==SQLITE_TRACE_CLOSE ){
21614 utf8_printf(p->traceOut, "-- closing database connection\n");
21615 return 0;
21616 }
21617 if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
21618 zSql = (const char*)pX;
21619 }else{
21620 pStmt = (sqlite3_stmt*)pP;
21621 switch( p->eTraceType ){
21622 case SHELL_TRACE_EXPANDED: {
21623 zSql = sqlite3_expanded_sql(pStmt);
21624 break;
21625 }
21626 #ifdef SQLITE_ENABLE_NORMALIZE
21627 case SHELL_TRACE_NORMALIZED: {
21628 zSql = sqlite3_normalized_sql(pStmt);
21629 break;
21630 }
21631 #endif
21632 default: {
21633 zSql = sqlite3_sql(pStmt);
21634 break;
21635 }
21636 }
21637 }
21638 if( zSql==0 ) return 0;
21639 nSql = strlen(zSql);
21640 if( nSql>1000000000 ) nSql = 1000000000;
21641 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
21642 switch( mType ){
21643 case SQLITE_TRACE_ROW:
21644 case SQLITE_TRACE_STMT: {
21645 utf8_printf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
21646 break;
21647 }
21648 case SQLITE_TRACE_PROFILE: {
21649 sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
21650 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
21651 break;
21652 }
21653 }
21654 return 0;
21655 }
21656 #endif
21657
21658 /*
21659 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
21660 ** a useful spot to set a debugger breakpoint.
21661 **
21662 ** This routine does not do anything practical. The code are there simply
21663 ** to prevent the compiler from optimizing this routine out.
21664 */
21665 static void test_breakpoint(void){
21666 static unsigned int nCall = 0;
21667 if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
21668 }
21669
21670 /*
21671 ** An object used to read a CSV and other files for import.
21672 */
21673 typedef struct ImportCtx ImportCtx;
21674 struct ImportCtx {
21675 const char *zFile; /* Name of the input file */
21676 FILE *in; /* Read the CSV text from this input stream */
21677 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */
21678 char *z; /* Accumulated text for a field */
21679 int n; /* Number of bytes in z */
21680 int nAlloc; /* Space allocated for z[] */
21681 int nLine; /* Current line number */
21682 int nRow; /* Number of rows imported */
21683 int nErr; /* Number of errors encountered */
21684 int bNotFirst; /* True if one or more bytes already read */
21685 int cTerm; /* Character that terminated the most recent field */
21686 int cColSep; /* The column separator character. (Usually ",") */
21687 int cRowSep; /* The row separator character. (Usually "\n") */
21688 };
21689
21690 /* Clean up resourced used by an ImportCtx */
21691 static void import_cleanup(ImportCtx *p){
21692 if( p->in!=0 && p->xCloser!=0 ){
21693 p->xCloser(p->in);
21694 p->in = 0;
21695 }
21696 sqlite3_free(p->z);
21697 p->z = 0;
21698 }
21699
21700 /* Append a single byte to z[] */
21701 static void import_append_char(ImportCtx *p, int c){
21702 if( p->n+1>=p->nAlloc ){
21703 p->nAlloc += p->nAlloc + 100;
21704 p->z = sqlite3_realloc64(p->z, p->nAlloc);
21705 shell_check_oom(p->z);
21706 }
21707 p->z[p->n++] = (char)c;
21708 }
21709
21710 /* Read a single field of CSV text. Compatible with rfc4180 and extended
21711 ** with the option of having a separator other than ",".
21712 **
21713 ** + Input comes from p->in.
21714 ** + Store results in p->z of length p->n. Space to hold p->z comes
21715 ** from sqlite3_malloc64().
21716 ** + Use p->cSep as the column separator. The default is ",".
21717 ** + Use p->rSep as the row separator. The default is "\n".
21718 ** + Keep track of the line number in p->nLine.
21719 ** + Store the character that terminates the field in p->cTerm. Store
21720 ** EOF on end-of-file.
21721 ** + Report syntax errors on stderr
21722 */
21723 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
21724 int c;
21725 int cSep = (u8)p->cColSep;
21726 int rSep = (u8)p->cRowSep;
21727 p->n = 0;
21728 c = fgetc(p->in);
21729 if( c==EOF || seenInterrupt ){
21730 p->cTerm = EOF;
21731 return 0;
21732 }
21733 if( c=='"' ){
21734 int pc, ppc;
21735 int startLine = p->nLine;
21736 int cQuote = c;
21737 pc = ppc = 0;
21738 while( 1 ){
21739 c = fgetc(p->in);
21740 if( c==rSep ) p->nLine++;
21741 if( c==cQuote ){
21742 if( pc==cQuote ){
21743 pc = 0;
21744 continue;
21745 }
21746 }
21747 if( (c==cSep && pc==cQuote)
21748 || (c==rSep && pc==cQuote)
21749 || (c==rSep && pc=='\r' && ppc==cQuote)
21750 || (c==EOF && pc==cQuote)
21751 ){
21752 do{ p->n--; }while( p->z[p->n]!=cQuote );
21753 p->cTerm = c;
21754 break;
21755 }
21756 if( pc==cQuote && c!='\r' ){
21757 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
21758 p->zFile, p->nLine, cQuote);
21759 }
21760 if( c==EOF ){
21761 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
21762 p->zFile, startLine, cQuote);
21763 p->cTerm = c;
21764 break;
21765 }
21766 import_append_char(p, c);
21767 ppc = pc;
21768 pc = c;
21769 }
21770 }else{
21771 /* If this is the first field being parsed and it begins with the
21772 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
21773 if( (c&0xff)==0xef && p->bNotFirst==0 ){
21774 import_append_char(p, c);
21775 c = fgetc(p->in);
21776 if( (c&0xff)==0xbb ){
21777 import_append_char(p, c);
21778 c = fgetc(p->in);
21779 if( (c&0xff)==0xbf ){
21780 p->bNotFirst = 1;
21781 p->n = 0;
21782 return csv_read_one_field(p);
21783 }
21784 }
21785 }
21786 while( c!=EOF && c!=cSep && c!=rSep ){
21787 import_append_char(p, c);
21788 c = fgetc(p->in);
21789 }
21790 if( c==rSep ){
21791 p->nLine++;
21792 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
21793 }
21794 p->cTerm = c;
21795 }
21796 if( p->z ) p->z[p->n] = 0;
21797 p->bNotFirst = 1;
21798 return p->z;
21799 }
21800
21801 /* Read a single field of ASCII delimited text.
21802 **
21803 ** + Input comes from p->in.
21804 ** + Store results in p->z of length p->n. Space to hold p->z comes
21805 ** from sqlite3_malloc64().
21806 ** + Use p->cSep as the column separator. The default is "\x1F".
21807 ** + Use p->rSep as the row separator. The default is "\x1E".
21808 ** + Keep track of the row number in p->nLine.
21809 ** + Store the character that terminates the field in p->cTerm. Store
21810 ** EOF on end-of-file.
21811 ** + Report syntax errors on stderr
21812 */
21813 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
21814 int c;
21815 int cSep = (u8)p->cColSep;
21816 int rSep = (u8)p->cRowSep;
21817 p->n = 0;
21818 c = fgetc(p->in);
21819 if( c==EOF || seenInterrupt ){
21820 p->cTerm = EOF;
21821 return 0;
21822 }
21823 while( c!=EOF && c!=cSep && c!=rSep ){
21824 import_append_char(p, c);
21825 c = fgetc(p->in);
21826 }
21827 if( c==rSep ){
21828 p->nLine++;
21829 }
21830 p->cTerm = c;
21831 if( p->z ) p->z[p->n] = 0;
21832 return p->z;
21833 }
21834
21835 /*
21836 ** Try to transfer data for table zTable. If an error is seen while
21837 ** moving forward, try to go backwards. The backwards movement won't
21838 ** work for WITHOUT ROWID tables.
21839 */
21840 static void tryToCloneData(
21841 ShellState *p,
21842 sqlite3 *newDb,
21843 const char *zTable
21844 ){
21845 sqlite3_stmt *pQuery = 0;
21846 sqlite3_stmt *pInsert = 0;
21847 char *zQuery = 0;
21848 char *zInsert = 0;
21849 int rc;
21850 int i, j, n;
21851 int nTable = strlen30(zTable);
21852 int k = 0;
21853 int cnt = 0;
21854 const int spinRate = 10000;
21855
21856 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
21857 shell_check_oom(zQuery);
21858 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
21859 if( rc ){
21860 utf8_printf(stderr, "Error %d: %s on [%s]\n",
21861 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
21862 zQuery);
21863 goto end_data_xfer;
21864 }
21865 n = sqlite3_column_count(pQuery);
21866 zInsert = sqlite3_malloc64(200 + nTable + n*3);
21867 shell_check_oom(zInsert);
21868 sqlite3_snprintf(200+nTable,zInsert,
21869 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
21870 i = strlen30(zInsert);
21871 for(j=1; j<n; j++){
21872 memcpy(zInsert+i, ",?", 2);
21873 i += 2;
21874 }
21875 memcpy(zInsert+i, ");", 3);
21876 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
21877 if( rc ){
21878 utf8_printf(stderr, "Error %d: %s on [%s]\n",
21879 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
21880 zInsert);
21881 goto end_data_xfer;
21882 }
21883 for(k=0; k<2; k++){
21884 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
21885 for(i=0; i<n; i++){
21886 switch( sqlite3_column_type(pQuery, i) ){
21887 case SQLITE_NULL: {
21888 sqlite3_bind_null(pInsert, i+1);
21889 break;
21890 }
21891 case SQLITE_INTEGER: {
21892 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
21893 break;
21894 }
21895 case SQLITE_FLOAT: {
21896 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
21897 break;
21898 }
21899 case SQLITE_TEXT: {
21900 sqlite3_bind_text(pInsert, i+1,
21901 (const char*)sqlite3_column_text(pQuery,i),
21902 -1, SQLITE_STATIC);
21903 break;
21904 }
21905 case SQLITE_BLOB: {
21906 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
21907 sqlite3_column_bytes(pQuery,i),
21908 SQLITE_STATIC);
21909 break;
21910 }
21911 }
21912 } /* End for */
21913 rc = sqlite3_step(pInsert);
21914 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
21915 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
21916 sqlite3_errmsg(newDb));
21917 }
21918 sqlite3_reset(pInsert);
21919 cnt++;
21920 if( (cnt%spinRate)==0 ){
21921 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
21922 fflush(stdout);
21923 }
21924 } /* End while */
21925 if( rc==SQLITE_DONE ) break;
21926 sqlite3_finalize(pQuery);
21927 sqlite3_free(zQuery);
21928 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
21929 zTable);
21930 shell_check_oom(zQuery);
21931 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
21932 if( rc ){
21933 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
21934 break;
21935 }
21936 } /* End for(k=0...) */
21937
21938 end_data_xfer:
21939 sqlite3_finalize(pQuery);
21940 sqlite3_finalize(pInsert);
21941 sqlite3_free(zQuery);
21942 sqlite3_free(zInsert);
21943 }
21944
21945
21946 /*
21947 ** Try to transfer all rows of the schema that match zWhere. For
21948 ** each row, invoke xForEach() on the object defined by that row.
21949 ** If an error is encountered while moving forward through the
21950 ** sqlite_schema table, try again moving backwards.
21951 */
21952 static void tryToCloneSchema(
21953 ShellState *p,
21954 sqlite3 *newDb,
21955 const char *zWhere,
21956 void (*xForEach)(ShellState*,sqlite3*,const char*)
21957 ){
21958 sqlite3_stmt *pQuery = 0;
21959 char *zQuery = 0;
21960 int rc;
21961 const unsigned char *zName;
21962 const unsigned char *zSql;
21963 char *zErrMsg = 0;
21964
21965 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
21966 " WHERE %s ORDER BY rowid ASC", zWhere);
21967 shell_check_oom(zQuery);
21968 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
21969 if( rc ){
21970 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
21971 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
21972 zQuery);
21973 goto end_schema_xfer;
21974 }
21975 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
21976 zName = sqlite3_column_text(pQuery, 0);
21977 zSql = sqlite3_column_text(pQuery, 1);
21978 if( zName==0 || zSql==0 ) continue;
21979 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
21980 printf("%s... ", zName); fflush(stdout);
21981 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
21982 if( zErrMsg ){
21983 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
21984 sqlite3_free(zErrMsg);
21985 zErrMsg = 0;
21986 }
21987 }
21988 if( xForEach ){
21989 xForEach(p, newDb, (const char*)zName);
21990 }
21991 printf("done\n");
21992 }
21993 if( rc!=SQLITE_DONE ){
21994 sqlite3_finalize(pQuery);
21995 sqlite3_free(zQuery);
21996 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
21997 " WHERE %s ORDER BY rowid DESC", zWhere);
21998 shell_check_oom(zQuery);
21999 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
22000 if( rc ){
22001 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
22002 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
22003 zQuery);
22004 goto end_schema_xfer;
22005 }
22006 while( sqlite3_step(pQuery)==SQLITE_ROW ){
22007 zName = sqlite3_column_text(pQuery, 0);
22008 zSql = sqlite3_column_text(pQuery, 1);
22009 if( zName==0 || zSql==0 ) continue;
22010 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
22011 printf("%s... ", zName); fflush(stdout);
22012 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
22013 if( zErrMsg ){
22014 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
22015 sqlite3_free(zErrMsg);
22016 zErrMsg = 0;
22017 }
22018 if( xForEach ){
22019 xForEach(p, newDb, (const char*)zName);
22020 }
22021 printf("done\n");
22022 }
22023 }
22024 end_schema_xfer:
22025 sqlite3_finalize(pQuery);
22026 sqlite3_free(zQuery);
22027 }
22028
22029 /*
22030 ** Open a new database file named "zNewDb". Try to recover as much information
22031 ** as possible out of the main database (which might be corrupt) and write it
22032 ** into zNewDb.
22033 */
22034 static void tryToClone(ShellState *p, const char *zNewDb){
22035 int rc;
22036 sqlite3 *newDb = 0;
22037 if( access(zNewDb,0)==0 ){
22038 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
22039 return;
22040 }
22041 rc = sqlite3_open(zNewDb, &newDb);
22042 if( rc ){
22043 utf8_printf(stderr, "Cannot create output database: %s\n",
22044 sqlite3_errmsg(newDb));
22045 }else{
22046 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
22047 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
22048 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
22049 tryToCloneSchema(p, newDb, "type!='table'", 0);
22050 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
22051 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
22052 }
22053 close_db(newDb);
22054 }
22055
22056 /*
22057 ** Change the output file back to stdout.
22058 **
22059 ** If the p->doXdgOpen flag is set, that means the output was being
22060 ** redirected to a temporary file named by p->zTempFile. In that case,
22061 ** launch start/open/xdg-open on that temporary file.
22062 */
22063 static void output_reset(ShellState *p){
22064 if( p->outfile[0]=='|' ){
22065 #ifndef SQLITE_OMIT_POPEN
22066 pclose(p->out);
22067 #endif
22068 }else{
22069 output_file_close(p->out);
22070 #ifndef SQLITE_NOHAVE_SYSTEM
22071 if( p->doXdgOpen ){
22072 const char *zXdgOpenCmd =
22073 #if defined(_WIN32)
22074 "start";
22075 #elif defined(__APPLE__)
22076 "open";
22077 #else
22078 "xdg-open";
22079 #endif
22080 char *zCmd;
22081 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
22082 if( system(zCmd) ){
22083 utf8_printf(stderr, "Failed: [%s]\n", zCmd);
22084 }else{
22085 /* Give the start/open/xdg-open command some time to get
22086 ** going before we continue, and potential delete the
22087 ** p->zTempFile data file out from under it */
22088 sqlite3_sleep(2000);
22089 }
22090 sqlite3_free(zCmd);
22091 outputModePop(p);
22092 p->doXdgOpen = 0;
22093 }
22094 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
22095 }
22096 p->outfile[0] = 0;
22097 p->out = stdout;
22098 }
22099
22100 /*
22101 ** Run an SQL command and return the single integer result.
22102 */
22103 static int db_int(sqlite3 *db, const char *zSql){
22104 sqlite3_stmt *pStmt;
22105 int res = 0;
22106 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
22107 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
22108 res = sqlite3_column_int(pStmt,0);
22109 }
22110 sqlite3_finalize(pStmt);
22111 return res;
22112 }
22113
22114 #if SQLITE_SHELL_HAVE_RECOVER
22115 /*
22116 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
22117 */
22118 static unsigned int get2byteInt(unsigned char *a){
22119 return (a[0]<<8) + a[1];
22120 }
22121 static unsigned int get4byteInt(unsigned char *a){
22122 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
22123 }
22124
22125 /*
22126 ** Implementation of the ".dbinfo" command.
22127 **
22128 ** Return 1 on error, 2 to exit, and 0 otherwise.
22129 */
22130 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
22131 static const struct { const char *zName; int ofst; } aField[] = {
22132 { "file change counter:", 24 },
22133 { "database page count:", 28 },
22134 { "freelist page count:", 36 },
22135 { "schema cookie:", 40 },
22136 { "schema format:", 44 },
22137 { "default cache size:", 48 },
22138 { "autovacuum top root:", 52 },
22139 { "incremental vacuum:", 64 },
22140 { "text encoding:", 56 },
22141 { "user version:", 60 },
22142 { "application id:", 68 },
22143 { "software version:", 96 },
22144 };
22145 static const struct { const char *zName; const char *zSql; } aQuery[] = {
22146 { "number of tables:",
22147 "SELECT count(*) FROM %s WHERE type='table'" },
22148 { "number of indexes:",
22149 "SELECT count(*) FROM %s WHERE type='index'" },
22150 { "number of triggers:",
22151 "SELECT count(*) FROM %s WHERE type='trigger'" },
22152 { "number of views:",
22153 "SELECT count(*) FROM %s WHERE type='view'" },
22154 { "schema size:",
22155 "SELECT total(length(sql)) FROM %s" },
22156 };
22157 int i, rc;
22158 unsigned iDataVersion;
22159 char *zSchemaTab;
22160 char *zDb = nArg>=2 ? azArg[1] : "main";
22161 sqlite3_stmt *pStmt = 0;
22162 unsigned char aHdr[100];
22163 open_db(p, 0);
22164 if( p->db==0 ) return 1;
22165 rc = sqlite3_prepare_v2(p->db,
22166 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
22167 -1, &pStmt, 0);
22168 if( rc ){
22169 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
22170 sqlite3_finalize(pStmt);
22171 return 1;
22172 }
22173 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
22174 if( sqlite3_step(pStmt)==SQLITE_ROW
22175 && sqlite3_column_bytes(pStmt,0)>100
22176 ){
22177 const u8 *pb = sqlite3_column_blob(pStmt,0);
22178 shell_check_oom(pb);
22179 memcpy(aHdr, pb, 100);
22180 sqlite3_finalize(pStmt);
22181 }else{
22182 raw_printf(stderr, "unable to read database header\n");
22183 sqlite3_finalize(pStmt);
22184 return 1;
22185 }
22186 i = get2byteInt(aHdr+16);
22187 if( i==1 ) i = 65536;
22188 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
22189 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
22190 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
22191 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
22192 for(i=0; i<ArraySize(aField); i++){
22193 int ofst = aField[i].ofst;
22194 unsigned int val = get4byteInt(aHdr + ofst);
22195 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
22196 switch( ofst ){
22197 case 56: {
22198 if( val==1 ) raw_printf(p->out, " (utf8)");
22199 if( val==2 ) raw_printf(p->out, " (utf16le)");
22200 if( val==3 ) raw_printf(p->out, " (utf16be)");
22201 }
22202 }
22203 raw_printf(p->out, "\n");
22204 }
22205 if( zDb==0 ){
22206 zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
22207 }else if( cli_strcmp(zDb,"temp")==0 ){
22208 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
22209 }else{
22210 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
22211 }
22212 for(i=0; i<ArraySize(aQuery); i++){
22213 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
22214 int val = db_int(p->db, zSql);
22215 sqlite3_free(zSql);
22216 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
22217 }
22218 sqlite3_free(zSchemaTab);
22219 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
22220 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
22221 return 0;
22222 }
22223 #endif /* SQLITE_SHELL_HAVE_RECOVER */
22224
22225 /*
22226 ** Print the current sqlite3_errmsg() value to stderr and return 1.
22227 */
22228 static int shellDatabaseError(sqlite3 *db){
22229 const char *zErr = sqlite3_errmsg(db);
22230 utf8_printf(stderr, "Error: %s\n", zErr);
22231 return 1;
22232 }
22233
22234 /*
22235 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
22236 ** if they match and FALSE (0) if they do not match.
22237 **
22238 ** Globbing rules:
22239 **
22240 ** '*' Matches any sequence of zero or more characters.
22241 **
22242 ** '?' Matches exactly one character.
22243 **
22244 ** [...] Matches one character from the enclosed list of
22245 ** characters.
22246 **
22247 ** [^...] Matches one character not in the enclosed list.
22248 **
22249 ** '#' Matches any sequence of one or more digits with an
22250 ** optional + or - sign in front
22251 **
22252 ** ' ' Any span of whitespace matches any other span of
22253 ** whitespace.
22254 **
22255 ** Extra whitespace at the end of z[] is ignored.
22256 */
22257 static int testcase_glob(const char *zGlob, const char *z){
22258 int c, c2;
22259 int invert;
22260 int seen;
22261
22262 while( (c = (*(zGlob++)))!=0 ){
22263 if( IsSpace(c) ){
22264 if( !IsSpace(*z) ) return 0;
22265 while( IsSpace(*zGlob) ) zGlob++;
22266 while( IsSpace(*z) ) z++;
22267 }else if( c=='*' ){
22268 while( (c=(*(zGlob++))) == '*' || c=='?' ){
22269 if( c=='?' && (*(z++))==0 ) return 0;
22270 }
22271 if( c==0 ){
22272 return 1;
22273 }else if( c=='[' ){
22274 while( *z && testcase_glob(zGlob-1,z)==0 ){
22275 z++;
22276 }
22277 return (*z)!=0;
22278 }
22279 while( (c2 = (*(z++)))!=0 ){
22280 while( c2!=c ){
22281 c2 = *(z++);
22282 if( c2==0 ) return 0;
22283 }
22284 if( testcase_glob(zGlob,z) ) return 1;
22285 }
22286 return 0;
22287 }else if( c=='?' ){
22288 if( (*(z++))==0 ) return 0;
22289 }else if( c=='[' ){
22290 int prior_c = 0;
22291 seen = 0;
22292 invert = 0;
22293 c = *(z++);
22294 if( c==0 ) return 0;
22295 c2 = *(zGlob++);
22296 if( c2=='^' ){
22297 invert = 1;
22298 c2 = *(zGlob++);
22299 }
22300 if( c2==']' ){
22301 if( c==']' ) seen = 1;
22302 c2 = *(zGlob++);
22303 }
22304 while( c2 && c2!=']' ){
22305 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
22306 c2 = *(zGlob++);
22307 if( c>=prior_c && c<=c2 ) seen = 1;
22308 prior_c = 0;
22309 }else{
22310 if( c==c2 ){
22311 seen = 1;
22312 }
22313 prior_c = c2;
22314 }
22315 c2 = *(zGlob++);
22316 }
22317 if( c2==0 || (seen ^ invert)==0 ) return 0;
22318 }else if( c=='#' ){
22319 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
22320 if( !IsDigit(z[0]) ) return 0;
22321 z++;
22322 while( IsDigit(z[0]) ){ z++; }
22323 }else{
22324 if( c!=(*(z++)) ) return 0;
22325 }
22326 }
22327 while( IsSpace(*z) ){ z++; }
22328 return *z==0;
22329 }
22330
22331
22332 /*
22333 ** Compare the string as a command-line option with either one or two
22334 ** initial "-" characters.
22335 */
22336 static int optionMatch(const char *zStr, const char *zOpt){
22337 if( zStr[0]!='-' ) return 0;
22338 zStr++;
22339 if( zStr[0]=='-' ) zStr++;
22340 return cli_strcmp(zStr, zOpt)==0;
22341 }
22342
22343 /*
22344 ** Delete a file.
22345 */
22346 int shellDeleteFile(const char *zFilename){
22347 int rc;
22348 #ifdef _WIN32
22349 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
22350 rc = _wunlink(z);
22351 sqlite3_free(z);
22352 #else
22353 rc = unlink(zFilename);
22354 #endif
22355 return rc;
22356 }
22357
22358 /*
22359 ** Try to delete the temporary file (if there is one) and free the
22360 ** memory used to hold the name of the temp file.
22361 */
22362 static void clearTempFile(ShellState *p){
22363 if( p->zTempFile==0 ) return;
22364 if( p->doXdgOpen ) return;
22365 if( shellDeleteFile(p->zTempFile) ) return;
22366 sqlite3_free(p->zTempFile);
22367 p->zTempFile = 0;
22368 }
22369
22370 /*
22371 ** Create a new temp file name with the given suffix.
22372 */
22373 static void newTempFile(ShellState *p, const char *zSuffix){
22374 clearTempFile(p);
22375 sqlite3_free(p->zTempFile);
22376 p->zTempFile = 0;
22377 if( p->db ){
22378 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
22379 }
22380 if( p->zTempFile==0 ){
22381 /* If p->db is an in-memory database then the TEMPFILENAME file-control
22382 ** will not work and we will need to fallback to guessing */
22383 char *zTemp;
22384 sqlite3_uint64 r;
22385 sqlite3_randomness(sizeof(r), &r);
22386 zTemp = getenv("TEMP");
22387 if( zTemp==0 ) zTemp = getenv("TMP");
22388 if( zTemp==0 ){
22389 #ifdef _WIN32
22390 zTemp = "\\tmp";
22391 #else
22392 zTemp = "/tmp";
22393 #endif
22394 }
22395 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
22396 }else{
22397 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
22398 }
22399 shell_check_oom(p->zTempFile);
22400 }
22401
22402
22403 /*
22404 ** The implementation of SQL scalar function fkey_collate_clause(), used
22405 ** by the ".lint fkey-indexes" command. This scalar function is always
22406 ** called with four arguments - the parent table name, the parent column name,
22407 ** the child table name and the child column name.
22408 **
22409 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
22410 **
22411 ** If either of the named tables or columns do not exist, this function
22412 ** returns an empty string. An empty string is also returned if both tables
22413 ** and columns exist but have the same default collation sequence. Or,
22414 ** if both exist but the default collation sequences are different, this
22415 ** function returns the string " COLLATE <parent-collation>", where
22416 ** <parent-collation> is the default collation sequence of the parent column.
22417 */
22418 static void shellFkeyCollateClause(
22419 sqlite3_context *pCtx,
22420 int nVal,
22421 sqlite3_value **apVal
22422 ){
22423 sqlite3 *db = sqlite3_context_db_handle(pCtx);
22424 const char *zParent;
22425 const char *zParentCol;
22426 const char *zParentSeq;
22427 const char *zChild;
22428 const char *zChildCol;
22429 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
22430 int rc;
22431
22432 assert( nVal==4 );
22433 zParent = (const char*)sqlite3_value_text(apVal[0]);
22434 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
22435 zChild = (const char*)sqlite3_value_text(apVal[2]);
22436 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
22437
22438 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
22439 rc = sqlite3_table_column_metadata(
22440 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
22441 );
22442 if( rc==SQLITE_OK ){
22443 rc = sqlite3_table_column_metadata(
22444 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
22445 );
22446 }
22447
22448 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
22449 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
22450 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
22451 sqlite3_free(z);
22452 }
22453 }
22454
22455
22456 /*
22457 ** The implementation of dot-command ".lint fkey-indexes".
22458 */
22459 static int lintFkeyIndexes(
22460 ShellState *pState, /* Current shell tool state */
22461 char **azArg, /* Array of arguments passed to dot command */
22462 int nArg /* Number of entries in azArg[] */
22463 ){
22464 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
22465 FILE *out = pState->out; /* Stream to write non-error output to */
22466 int bVerbose = 0; /* If -verbose is present */
22467 int bGroupByParent = 0; /* If -groupbyparent is present */
22468 int i; /* To iterate through azArg[] */
22469 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
22470 int rc; /* Return code */
22471 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
22472
22473 /*
22474 ** This SELECT statement returns one row for each foreign key constraint
22475 ** in the schema of the main database. The column values are:
22476 **
22477 ** 0. The text of an SQL statement similar to:
22478 **
22479 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
22480 **
22481 ** This SELECT is similar to the one that the foreign keys implementation
22482 ** needs to run internally on child tables. If there is an index that can
22483 ** be used to optimize this query, then it can also be used by the FK
22484 ** implementation to optimize DELETE or UPDATE statements on the parent
22485 ** table.
22486 **
22487 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
22488 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
22489 ** contains an index that can be used to optimize the query.
22490 **
22491 ** 2. Human readable text that describes the child table and columns. e.g.
22492 **
22493 ** "child_table(child_key1, child_key2)"
22494 **
22495 ** 3. Human readable text that describes the parent table and columns. e.g.
22496 **
22497 ** "parent_table(parent_key1, parent_key2)"
22498 **
22499 ** 4. A full CREATE INDEX statement for an index that could be used to
22500 ** optimize DELETE or UPDATE statements on the parent table. e.g.
22501 **
22502 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
22503 **
22504 ** 5. The name of the parent table.
22505 **
22506 ** These six values are used by the C logic below to generate the report.
22507 */
22508 const char *zSql =
22509 "SELECT "
22510 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
22511 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
22512 " || fkey_collate_clause("
22513 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
22514 ", "
22515 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('"
22516 " || group_concat('*=?', ' AND ') || ')'"
22517 ", "
22518 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
22519 ", "
22520 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
22521 ", "
22522 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
22523 " || ' ON ' || quote(s.name) || '('"
22524 " || group_concat(quote(f.[from]) ||"
22525 " fkey_collate_clause("
22526 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
22527 " || ');'"
22528 ", "
22529 " f.[table] "
22530 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
22531 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
22532 "GROUP BY s.name, f.id "
22533 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
22534 ;
22535 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
22536
22537 for(i=2; i<nArg; i++){
22538 int n = strlen30(azArg[i]);
22539 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
22540 bVerbose = 1;
22541 }
22542 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
22543 bGroupByParent = 1;
22544 zIndent = " ";
22545 }
22546 else{
22547 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
22548 azArg[0], azArg[1]
22549 );
22550 return SQLITE_ERROR;
22551 }
22552 }
22553
22554 /* Register the fkey_collate_clause() SQL function */
22555 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
22556 0, shellFkeyCollateClause, 0, 0
22557 );
22558
22559
22560 if( rc==SQLITE_OK ){
22561 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
22562 }
22563 if( rc==SQLITE_OK ){
22564 sqlite3_bind_int(pSql, 1, bGroupByParent);
22565 }
22566
22567 if( rc==SQLITE_OK ){
22568 int rc2;
22569 char *zPrev = 0;
22570 while( SQLITE_ROW==sqlite3_step(pSql) ){
22571 int res = -1;
22572 sqlite3_stmt *pExplain = 0;
22573 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
22574 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
22575 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
22576 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
22577 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
22578 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
22579
22580 if( zEQP==0 ) continue;
22581 if( zGlob==0 ) continue;
22582 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
22583 if( rc!=SQLITE_OK ) break;
22584 if( SQLITE_ROW==sqlite3_step(pExplain) ){
22585 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
22586 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan)
22587 || 0==sqlite3_strglob(zGlobIPK, zPlan));
22588 }
22589 rc = sqlite3_finalize(pExplain);
22590 if( rc!=SQLITE_OK ) break;
22591
22592 if( res<0 ){
22593 raw_printf(stderr, "Error: internal error");
22594 break;
22595 }else{
22596 if( bGroupByParent
22597 && (bVerbose || res==0)
22598 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
22599 ){
22600 raw_printf(out, "-- Parent table %s\n", zParent);
22601 sqlite3_free(zPrev);
22602 zPrev = sqlite3_mprintf("%s", zParent);
22603 }
22604
22605 if( res==0 ){
22606 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
22607 }else if( bVerbose ){
22608 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
22609 zIndent, zFrom, zTarget
22610 );
22611 }
22612 }
22613 }
22614 sqlite3_free(zPrev);
22615
22616 if( rc!=SQLITE_OK ){
22617 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
22618 }
22619
22620 rc2 = sqlite3_finalize(pSql);
22621 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
22622 rc = rc2;
22623 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
22624 }
22625 }else{
22626 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
22627 }
22628
22629 return rc;
22630 }
22631
22632 /*
22633 ** Implementation of ".lint" dot command.
22634 */
22635 static int lintDotCommand(
22636 ShellState *pState, /* Current shell tool state */
22637 char **azArg, /* Array of arguments passed to dot command */
22638 int nArg /* Number of entries in azArg[] */
22639 ){
22640 int n;
22641 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
22642 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
22643 return lintFkeyIndexes(pState, azArg, nArg);
22644
22645 usage:
22646 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
22647 raw_printf(stderr, "Where sub-commands are:\n");
22648 raw_printf(stderr, " fkey-indexes\n");
22649 return SQLITE_ERROR;
22650 }
22651
22652 #if !defined SQLITE_OMIT_VIRTUALTABLE
22653 static void shellPrepare(
22654 sqlite3 *db,
22655 int *pRc,
22656 const char *zSql,
22657 sqlite3_stmt **ppStmt
22658 ){
22659 *ppStmt = 0;
22660 if( *pRc==SQLITE_OK ){
22661 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
22662 if( rc!=SQLITE_OK ){
22663 raw_printf(stderr, "sql error: %s (%d)\n",
22664 sqlite3_errmsg(db), sqlite3_errcode(db)
22665 );
22666 *pRc = rc;
22667 }
22668 }
22669 }
22670
22671 /*
22672 ** Create a prepared statement using printf-style arguments for the SQL.
22673 **
22674 ** This routine is could be marked "static". But it is not always used,
22675 ** depending on compile-time options. By omitting the "static", we avoid
22676 ** nuisance compiler warnings about "defined but not used".
22677 */
22678 void shellPreparePrintf(
22679 sqlite3 *db,
22680 int *pRc,
22681 sqlite3_stmt **ppStmt,
22682 const char *zFmt,
22683 ...
22684 ){
22685 *ppStmt = 0;
22686 if( *pRc==SQLITE_OK ){
22687 va_list ap;
22688 char *z;
22689 va_start(ap, zFmt);
22690 z = sqlite3_vmprintf(zFmt, ap);
22691 va_end(ap);
22692 if( z==0 ){
22693 *pRc = SQLITE_NOMEM;
22694 }else{
22695 shellPrepare(db, pRc, z, ppStmt);
22696 sqlite3_free(z);
22697 }
22698 }
22699 }
22700
22701 /* Finalize the prepared statement created using shellPreparePrintf().
22702 **
22703 ** This routine is could be marked "static". But it is not always used,
22704 ** depending on compile-time options. By omitting the "static", we avoid
22705 ** nuisance compiler warnings about "defined but not used".
22706 */
22707 void shellFinalize(
22708 int *pRc,
22709 sqlite3_stmt *pStmt
22710 ){
22711 if( pStmt ){
22712 sqlite3 *db = sqlite3_db_handle(pStmt);
22713 int rc = sqlite3_finalize(pStmt);
22714 if( *pRc==SQLITE_OK ){
22715 if( rc!=SQLITE_OK ){
22716 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
22717 }
22718 *pRc = rc;
22719 }
22720 }
22721 }
22722
22723 /* Reset the prepared statement created using shellPreparePrintf().
22724 **
22725 ** This routine is could be marked "static". But it is not always used,
22726 ** depending on compile-time options. By omitting the "static", we avoid
22727 ** nuisance compiler warnings about "defined but not used".
22728 */
22729 void shellReset(
22730 int *pRc,
22731 sqlite3_stmt *pStmt
22732 ){
22733 int rc = sqlite3_reset(pStmt);
22734 if( *pRc==SQLITE_OK ){
22735 if( rc!=SQLITE_OK ){
22736 sqlite3 *db = sqlite3_db_handle(pStmt);
22737 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
22738 }
22739 *pRc = rc;
22740 }
22741 }
22742 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
22743
22744 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
22745 /******************************************************************************
22746 ** The ".archive" or ".ar" command.
22747 */
22748 /*
22749 ** Structure representing a single ".ar" command.
22750 */
22751 typedef struct ArCommand ArCommand;
22752 struct ArCommand {
22753 u8 eCmd; /* An AR_CMD_* value */
22754 u8 bVerbose; /* True if --verbose */
22755 u8 bZip; /* True if the archive is a ZIP */
22756 u8 bDryRun; /* True if --dry-run */
22757 u8 bAppend; /* True if --append */
22758 u8 bGlob; /* True if --glob */
22759 u8 fromCmdLine; /* Run from -A instead of .archive */
22760 int nArg; /* Number of command arguments */
22761 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
22762 const char *zFile; /* --file argument, or NULL */
22763 const char *zDir; /* --directory argument, or NULL */
22764 char **azArg; /* Array of command arguments */
22765 ShellState *p; /* Shell state */
22766 sqlite3 *db; /* Database containing the archive */
22767 };
22768
22769 /*
22770 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
22771 */
22772 static int arUsage(FILE *f){
22773 showHelp(f,"archive");
22774 return SQLITE_ERROR;
22775 }
22776
22777 /*
22778 ** Print an error message for the .ar command to stderr and return
22779 ** SQLITE_ERROR.
22780 */
22781 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
22782 va_list ap;
22783 char *z;
22784 va_start(ap, zFmt);
22785 z = sqlite3_vmprintf(zFmt, ap);
22786 va_end(ap);
22787 utf8_printf(stderr, "Error: %s\n", z);
22788 if( pAr->fromCmdLine ){
22789 utf8_printf(stderr, "Use \"-A\" for more help\n");
22790 }else{
22791 utf8_printf(stderr, "Use \".archive --help\" for more help\n");
22792 }
22793 sqlite3_free(z);
22794 return SQLITE_ERROR;
22795 }
22796
22797 /*
22798 ** Values for ArCommand.eCmd.
22799 */
22800 #define AR_CMD_CREATE 1
22801 #define AR_CMD_UPDATE 2
22802 #define AR_CMD_INSERT 3
22803 #define AR_CMD_EXTRACT 4
22804 #define AR_CMD_LIST 5
22805 #define AR_CMD_HELP 6
22806 #define AR_CMD_REMOVE 7
22807
22808 /*
22809 ** Other (non-command) switches.
22810 */
22811 #define AR_SWITCH_VERBOSE 8
22812 #define AR_SWITCH_FILE 9
22813 #define AR_SWITCH_DIRECTORY 10
22814 #define AR_SWITCH_APPEND 11
22815 #define AR_SWITCH_DRYRUN 12
22816 #define AR_SWITCH_GLOB 13
22817
22818 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
22819 switch( eSwitch ){
22820 case AR_CMD_CREATE:
22821 case AR_CMD_EXTRACT:
22822 case AR_CMD_LIST:
22823 case AR_CMD_REMOVE:
22824 case AR_CMD_UPDATE:
22825 case AR_CMD_INSERT:
22826 case AR_CMD_HELP:
22827 if( pAr->eCmd ){
22828 return arErrorMsg(pAr, "multiple command options");
22829 }
22830 pAr->eCmd = eSwitch;
22831 break;
22832
22833 case AR_SWITCH_DRYRUN:
22834 pAr->bDryRun = 1;
22835 break;
22836 case AR_SWITCH_GLOB:
22837 pAr->bGlob = 1;
22838 break;
22839 case AR_SWITCH_VERBOSE:
22840 pAr->bVerbose = 1;
22841 break;
22842 case AR_SWITCH_APPEND:
22843 pAr->bAppend = 1;
22844 deliberate_fall_through;
22845 case AR_SWITCH_FILE:
22846 pAr->zFile = zArg;
22847 break;
22848 case AR_SWITCH_DIRECTORY:
22849 pAr->zDir = zArg;
22850 break;
22851 }
22852
22853 return SQLITE_OK;
22854 }
22855
22856 /*
22857 ** Parse the command line for an ".ar" command. The results are written into
22858 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
22859 ** successfully, otherwise an error message is written to stderr and
22860 ** SQLITE_ERROR returned.
22861 */
22862 static int arParseCommand(
22863 char **azArg, /* Array of arguments passed to dot command */
22864 int nArg, /* Number of entries in azArg[] */
22865 ArCommand *pAr /* Populate this object */
22866 ){
22867 struct ArSwitch {
22868 const char *zLong;
22869 char cShort;
22870 u8 eSwitch;
22871 u8 bArg;
22872 } aSwitch[] = {
22873 { "create", 'c', AR_CMD_CREATE, 0 },
22874 { "extract", 'x', AR_CMD_EXTRACT, 0 },
22875 { "insert", 'i', AR_CMD_INSERT, 0 },
22876 { "list", 't', AR_CMD_LIST, 0 },
22877 { "remove", 'r', AR_CMD_REMOVE, 0 },
22878 { "update", 'u', AR_CMD_UPDATE, 0 },
22879 { "help", 'h', AR_CMD_HELP, 0 },
22880 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
22881 { "file", 'f', AR_SWITCH_FILE, 1 },
22882 { "append", 'a', AR_SWITCH_APPEND, 1 },
22883 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
22884 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
22885 { "glob", 'g', AR_SWITCH_GLOB, 0 },
22886 };
22887 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
22888 struct ArSwitch *pEnd = &aSwitch[nSwitch];
22889
22890 if( nArg<=1 ){
22891 utf8_printf(stderr, "Wrong number of arguments. Usage:\n");
22892 return arUsage(stderr);
22893 }else{
22894 char *z = azArg[1];
22895 if( z[0]!='-' ){
22896 /* Traditional style [tar] invocation */
22897 int i;
22898 int iArg = 2;
22899 for(i=0; z[i]; i++){
22900 const char *zArg = 0;
22901 struct ArSwitch *pOpt;
22902 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
22903 if( z[i]==pOpt->cShort ) break;
22904 }
22905 if( pOpt==pEnd ){
22906 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
22907 }
22908 if( pOpt->bArg ){
22909 if( iArg>=nArg ){
22910 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
22911 }
22912 zArg = azArg[iArg++];
22913 }
22914 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
22915 }
22916 pAr->nArg = nArg-iArg;
22917 if( pAr->nArg>0 ){
22918 pAr->azArg = &azArg[iArg];
22919 }
22920 }else{
22921 /* Non-traditional invocation */
22922 int iArg;
22923 for(iArg=1; iArg<nArg; iArg++){
22924 int n;
22925 z = azArg[iArg];
22926 if( z[0]!='-' ){
22927 /* All remaining command line words are command arguments. */
22928 pAr->azArg = &azArg[iArg];
22929 pAr->nArg = nArg-iArg;
22930 break;
22931 }
22932 n = strlen30(z);
22933
22934 if( z[1]!='-' ){
22935 int i;
22936 /* One or more short options */
22937 for(i=1; i<n; i++){
22938 const char *zArg = 0;
22939 struct ArSwitch *pOpt;
22940 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
22941 if( z[i]==pOpt->cShort ) break;
22942 }
22943 if( pOpt==pEnd ){
22944 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
22945 }
22946 if( pOpt->bArg ){
22947 if( i<(n-1) ){
22948 zArg = &z[i+1];
22949 i = n;
22950 }else{
22951 if( iArg>=(nArg-1) ){
22952 return arErrorMsg(pAr, "option requires an argument: %c",
22953 z[i]);
22954 }
22955 zArg = azArg[++iArg];
22956 }
22957 }
22958 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
22959 }
22960 }else if( z[2]=='\0' ){
22961 /* A -- option, indicating that all remaining command line words
22962 ** are command arguments. */
22963 pAr->azArg = &azArg[iArg+1];
22964 pAr->nArg = nArg-iArg-1;
22965 break;
22966 }else{
22967 /* A long option */
22968 const char *zArg = 0; /* Argument for option, if any */
22969 struct ArSwitch *pMatch = 0; /* Matching option */
22970 struct ArSwitch *pOpt; /* Iterator */
22971 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
22972 const char *zLong = pOpt->zLong;
22973 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
22974 if( pMatch ){
22975 return arErrorMsg(pAr, "ambiguous option: %s",z);
22976 }else{
22977 pMatch = pOpt;
22978 }
22979 }
22980 }
22981
22982 if( pMatch==0 ){
22983 return arErrorMsg(pAr, "unrecognized option: %s", z);
22984 }
22985 if( pMatch->bArg ){
22986 if( iArg>=(nArg-1) ){
22987 return arErrorMsg(pAr, "option requires an argument: %s", z);
22988 }
22989 zArg = azArg[++iArg];
22990 }
22991 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
22992 }
22993 }
22994 }
22995 }
22996 if( pAr->eCmd==0 ){
22997 utf8_printf(stderr, "Required argument missing. Usage:\n");
22998 return arUsage(stderr);
22999 }
23000 return SQLITE_OK;
23001 }
23002
23003 /*
23004 ** This function assumes that all arguments within the ArCommand.azArg[]
23005 ** array refer to archive members, as for the --extract, --list or --remove
23006 ** commands. It checks that each of them are "present". If any specified
23007 ** file is not present in the archive, an error is printed to stderr and an
23008 ** error code returned. Otherwise, if all specified arguments are present
23009 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
23010 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
23011 ** when pAr->bGlob is true.
23012 **
23013 ** This function strips any trailing '/' characters from each argument.
23014 ** This is consistent with the way the [tar] command seems to work on
23015 ** Linux.
23016 */
23017 static int arCheckEntries(ArCommand *pAr){
23018 int rc = SQLITE_OK;
23019 if( pAr->nArg ){
23020 int i, j;
23021 sqlite3_stmt *pTest = 0;
23022 const char *zSel = (pAr->bGlob)
23023 ? "SELECT name FROM %s WHERE glob($name,name)"
23024 : "SELECT name FROM %s WHERE name=$name";
23025
23026 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
23027 j = sqlite3_bind_parameter_index(pTest, "$name");
23028 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
23029 char *z = pAr->azArg[i];
23030 int n = strlen30(z);
23031 int bOk = 0;
23032 while( n>0 && z[n-1]=='/' ) n--;
23033 z[n] = '\0';
23034 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
23035 if( SQLITE_ROW==sqlite3_step(pTest) ){
23036 bOk = 1;
23037 }
23038 shellReset(&rc, pTest);
23039 if( rc==SQLITE_OK && bOk==0 ){
23040 utf8_printf(stderr, "not found in archive: %s\n", z);
23041 rc = SQLITE_ERROR;
23042 }
23043 }
23044 shellFinalize(&rc, pTest);
23045 }
23046 return rc;
23047 }
23048
23049 /*
23050 ** Format a WHERE clause that can be used against the "sqlar" table to
23051 ** identify all archive members that match the command arguments held
23052 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
23053 ** The caller is responsible for eventually calling sqlite3_free() on
23054 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
23055 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
23056 */
23057 static void arWhereClause(
23058 int *pRc,
23059 ArCommand *pAr,
23060 char **pzWhere /* OUT: New WHERE clause */
23061 ){
23062 char *zWhere = 0;
23063 const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
23064 if( *pRc==SQLITE_OK ){
23065 if( pAr->nArg==0 ){
23066 zWhere = sqlite3_mprintf("1");
23067 }else{
23068 int i;
23069 const char *zSep = "";
23070 for(i=0; i<pAr->nArg; i++){
23071 const char *z = pAr->azArg[i];
23072 zWhere = sqlite3_mprintf(
23073 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
23074 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
23075 );
23076 if( zWhere==0 ){
23077 *pRc = SQLITE_NOMEM;
23078 break;
23079 }
23080 zSep = " OR ";
23081 }
23082 }
23083 }
23084 *pzWhere = zWhere;
23085 }
23086
23087 /*
23088 ** Implementation of .ar "lisT" command.
23089 */
23090 static int arListCommand(ArCommand *pAr){
23091 const char *zSql = "SELECT %s FROM %s WHERE %s";
23092 const char *azCols[] = {
23093 "name",
23094 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
23095 };
23096
23097 char *zWhere = 0;
23098 sqlite3_stmt *pSql = 0;
23099 int rc;
23100
23101 rc = arCheckEntries(pAr);
23102 arWhereClause(&rc, pAr, &zWhere);
23103
23104 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
23105 pAr->zSrcTable, zWhere);
23106 if( pAr->bDryRun ){
23107 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
23108 }else{
23109 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
23110 if( pAr->bVerbose ){
23111 utf8_printf(pAr->p->out, "%s % 10d %s %s\n",
23112 sqlite3_column_text(pSql, 0),
23113 sqlite3_column_int(pSql, 1),
23114 sqlite3_column_text(pSql, 2),
23115 sqlite3_column_text(pSql, 3)
23116 );
23117 }else{
23118 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
23119 }
23120 }
23121 }
23122 shellFinalize(&rc, pSql);
23123 sqlite3_free(zWhere);
23124 return rc;
23125 }
23126
23127
23128 /*
23129 ** Implementation of .ar "Remove" command.
23130 */
23131 static int arRemoveCommand(ArCommand *pAr){
23132 int rc = 0;
23133 char *zSql = 0;
23134 char *zWhere = 0;
23135
23136 if( pAr->nArg ){
23137 /* Verify that args actually exist within the archive before proceeding.
23138 ** And formulate a WHERE clause to match them. */
23139 rc = arCheckEntries(pAr);
23140 arWhereClause(&rc, pAr, &zWhere);
23141 }
23142 if( rc==SQLITE_OK ){
23143 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
23144 pAr->zSrcTable, zWhere);
23145 if( pAr->bDryRun ){
23146 utf8_printf(pAr->p->out, "%s\n", zSql);
23147 }else{
23148 char *zErr = 0;
23149 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
23150 if( rc==SQLITE_OK ){
23151 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
23152 if( rc!=SQLITE_OK ){
23153 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
23154 }else{
23155 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
23156 }
23157 }
23158 if( zErr ){
23159 utf8_printf(stdout, "ERROR: %s\n", zErr);
23160 sqlite3_free(zErr);
23161 }
23162 }
23163 }
23164 sqlite3_free(zWhere);
23165 sqlite3_free(zSql);
23166 return rc;
23167 }
23168
23169 /*
23170 ** Implementation of .ar "eXtract" command.
23171 */
23172 static int arExtractCommand(ArCommand *pAr){
23173 const char *zSql1 =
23174 "SELECT "
23175 " ($dir || name),"
23176 " writefile(($dir || name), %s, mode, mtime) "
23177 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
23178 " AND name NOT GLOB '*..[/\\]*'";
23179
23180 const char *azExtraArg[] = {
23181 "sqlar_uncompress(data, sz)",
23182 "data"
23183 };
23184
23185 sqlite3_stmt *pSql = 0;
23186 int rc = SQLITE_OK;
23187 char *zDir = 0;
23188 char *zWhere = 0;
23189 int i, j;
23190
23191 /* If arguments are specified, check that they actually exist within
23192 ** the archive before proceeding. And formulate a WHERE clause to
23193 ** match them. */
23194 rc = arCheckEntries(pAr);
23195 arWhereClause(&rc, pAr, &zWhere);
23196
23197 if( rc==SQLITE_OK ){
23198 if( pAr->zDir ){
23199 zDir = sqlite3_mprintf("%s/", pAr->zDir);
23200 }else{
23201 zDir = sqlite3_mprintf("");
23202 }
23203 if( zDir==0 ) rc = SQLITE_NOMEM;
23204 }
23205
23206 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
23207 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
23208 );
23209
23210 if( rc==SQLITE_OK ){
23211 j = sqlite3_bind_parameter_index(pSql, "$dir");
23212 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
23213
23214 /* Run the SELECT statement twice. The first time, writefile() is called
23215 ** for all archive members that should be extracted. The second time,
23216 ** only for the directories. This is because the timestamps for
23217 ** extracted directories must be reset after they are populated (as
23218 ** populating them changes the timestamp). */
23219 for(i=0; i<2; i++){
23220 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
23221 sqlite3_bind_int(pSql, j, i);
23222 if( pAr->bDryRun ){
23223 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
23224 }else{
23225 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
23226 if( i==0 && pAr->bVerbose ){
23227 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
23228 }
23229 }
23230 }
23231 shellReset(&rc, pSql);
23232 }
23233 shellFinalize(&rc, pSql);
23234 }
23235
23236 sqlite3_free(zDir);
23237 sqlite3_free(zWhere);
23238 return rc;
23239 }
23240
23241 /*
23242 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
23243 */
23244 static int arExecSql(ArCommand *pAr, const char *zSql){
23245 int rc;
23246 if( pAr->bDryRun ){
23247 utf8_printf(pAr->p->out, "%s\n", zSql);
23248 rc = SQLITE_OK;
23249 }else{
23250 char *zErr = 0;
23251 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
23252 if( zErr ){
23253 utf8_printf(stdout, "ERROR: %s\n", zErr);
23254 sqlite3_free(zErr);
23255 }
23256 }
23257 return rc;
23258 }
23259
23260
23261 /*
23262 ** Implementation of .ar "create", "insert", and "update" commands.
23263 **
23264 ** create -> Create a new SQL archive
23265 ** insert -> Insert or reinsert all files listed
23266 ** update -> Insert files that have changed or that were not
23267 ** previously in the archive
23268 **
23269 ** Create the "sqlar" table in the database if it does not already exist.
23270 ** Then add each file in the azFile[] array to the archive. Directories
23271 ** are added recursively. If argument bVerbose is non-zero, a message is
23272 ** printed on stdout for each file archived.
23273 **
23274 ** The create command is the same as update, except that it drops
23275 ** any existing "sqlar" table before beginning. The "insert" command
23276 ** always overwrites every file named on the command-line, where as
23277 ** "update" only overwrites if the size or mtime or mode has changed.
23278 */
23279 static int arCreateOrUpdateCommand(
23280 ArCommand *pAr, /* Command arguments and options */
23281 int bUpdate, /* true for a --create. */
23282 int bOnlyIfChanged /* Only update if file has changed */
23283 ){
23284 const char *zCreate =
23285 "CREATE TABLE IF NOT EXISTS sqlar(\n"
23286 " name TEXT PRIMARY KEY, -- name of the file\n"
23287 " mode INT, -- access permissions\n"
23288 " mtime INT, -- last modification time\n"
23289 " sz INT, -- original file size\n"
23290 " data BLOB -- compressed content\n"
23291 ")";
23292 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
23293 const char *zInsertFmt[2] = {
23294 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
23295 " SELECT\n"
23296 " %s,\n"
23297 " mode,\n"
23298 " mtime,\n"
23299 " CASE substr(lsmode(mode),1,1)\n"
23300 " WHEN '-' THEN length(data)\n"
23301 " WHEN 'd' THEN 0\n"
23302 " ELSE -1 END,\n"
23303 " sqlar_compress(data)\n"
23304 " FROM fsdir(%Q,%Q) AS disk\n"
23305 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
23306 ,
23307 "REPLACE INTO %s(name,mode,mtime,data)\n"
23308 " SELECT\n"
23309 " %s,\n"
23310 " mode,\n"
23311 " mtime,\n"
23312 " data\n"
23313 " FROM fsdir(%Q,%Q) AS disk\n"
23314 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
23315 };
23316 int i; /* For iterating through azFile[] */
23317 int rc; /* Return code */
23318 const char *zTab = 0; /* SQL table into which to insert */
23319 char *zSql;
23320 char zTemp[50];
23321 char *zExists = 0;
23322
23323 arExecSql(pAr, "PRAGMA page_size=512");
23324 rc = arExecSql(pAr, "SAVEPOINT ar;");
23325 if( rc!=SQLITE_OK ) return rc;
23326 zTemp[0] = 0;
23327 if( pAr->bZip ){
23328 /* Initialize the zipfile virtual table, if necessary */
23329 if( pAr->zFile ){
23330 sqlite3_uint64 r;
23331 sqlite3_randomness(sizeof(r),&r);
23332 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
23333 zTab = zTemp;
23334 zSql = sqlite3_mprintf(
23335 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
23336 zTab, pAr->zFile
23337 );
23338 rc = arExecSql(pAr, zSql);
23339 sqlite3_free(zSql);
23340 }else{
23341 zTab = "zip";
23342 }
23343 }else{
23344 /* Initialize the table for an SQLAR */
23345 zTab = "sqlar";
23346 if( bUpdate==0 ){
23347 rc = arExecSql(pAr, zDrop);
23348 if( rc!=SQLITE_OK ) goto end_ar_transaction;
23349 }
23350 rc = arExecSql(pAr, zCreate);
23351 }
23352 if( bOnlyIfChanged ){
23353 zExists = sqlite3_mprintf(
23354 " AND NOT EXISTS("
23355 "SELECT 1 FROM %s AS mem"
23356 " WHERE mem.name=disk.name"
23357 " AND mem.mtime=disk.mtime"
23358 " AND mem.mode=disk.mode)", zTab);
23359 }else{
23360 zExists = sqlite3_mprintf("");
23361 }
23362 if( zExists==0 ) rc = SQLITE_NOMEM;
23363 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
23364 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
23365 pAr->bVerbose ? "shell_putsnl(name)" : "name",
23366 pAr->azArg[i], pAr->zDir, zExists);
23367 rc = arExecSql(pAr, zSql2);
23368 sqlite3_free(zSql2);
23369 }
23370 end_ar_transaction:
23371 if( rc!=SQLITE_OK ){
23372 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
23373 }else{
23374 rc = arExecSql(pAr, "RELEASE ar;");
23375 if( pAr->bZip && pAr->zFile ){
23376 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
23377 arExecSql(pAr, zSql);
23378 sqlite3_free(zSql);
23379 }
23380 }
23381 sqlite3_free(zExists);
23382 return rc;
23383 }
23384
23385 /*
23386 ** Implementation of ".ar" dot command.
23387 */
23388 static int arDotCommand(
23389 ShellState *pState, /* Current shell tool state */
23390 int fromCmdLine, /* True if -A command-line option, not .ar cmd */
23391 char **azArg, /* Array of arguments passed to dot command */
23392 int nArg /* Number of entries in azArg[] */
23393 ){
23394 ArCommand cmd;
23395 int rc;
23396 memset(&cmd, 0, sizeof(cmd));
23397 cmd.fromCmdLine = fromCmdLine;
23398 rc = arParseCommand(azArg, nArg, &cmd);
23399 if( rc==SQLITE_OK ){
23400 int eDbType = SHELL_OPEN_UNSPEC;
23401 cmd.p = pState;
23402 cmd.db = pState->db;
23403 if( cmd.zFile ){
23404 eDbType = deduceDatabaseType(cmd.zFile, 1);
23405 }else{
23406 eDbType = pState->openMode;
23407 }
23408 if( eDbType==SHELL_OPEN_ZIPFILE ){
23409 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
23410 if( cmd.zFile==0 ){
23411 cmd.zSrcTable = sqlite3_mprintf("zip");
23412 }else{
23413 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
23414 }
23415 }
23416 cmd.bZip = 1;
23417 }else if( cmd.zFile ){
23418 int flags;
23419 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
23420 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
23421 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
23422 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
23423 }else{
23424 flags = SQLITE_OPEN_READONLY;
23425 }
23426 cmd.db = 0;
23427 if( cmd.bDryRun ){
23428 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
23429 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
23430 }
23431 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
23432 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
23433 if( rc!=SQLITE_OK ){
23434 utf8_printf(stderr, "cannot open file: %s (%s)\n",
23435 cmd.zFile, sqlite3_errmsg(cmd.db)
23436 );
23437 goto end_ar_command;
23438 }
23439 sqlite3_fileio_init(cmd.db, 0, 0);
23440 sqlite3_sqlar_init(cmd.db, 0, 0);
23441 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
23442 shellPutsFunc, 0, 0);
23443
23444 }
23445 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
23446 if( cmd.eCmd!=AR_CMD_CREATE
23447 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
23448 ){
23449 utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
23450 rc = SQLITE_ERROR;
23451 goto end_ar_command;
23452 }
23453 cmd.zSrcTable = sqlite3_mprintf("sqlar");
23454 }
23455
23456 switch( cmd.eCmd ){
23457 case AR_CMD_CREATE:
23458 rc = arCreateOrUpdateCommand(&cmd, 0, 0);
23459 break;
23460
23461 case AR_CMD_EXTRACT:
23462 rc = arExtractCommand(&cmd);
23463 break;
23464
23465 case AR_CMD_LIST:
23466 rc = arListCommand(&cmd);
23467 break;
23468
23469 case AR_CMD_HELP:
23470 arUsage(pState->out);
23471 break;
23472
23473 case AR_CMD_INSERT:
23474 rc = arCreateOrUpdateCommand(&cmd, 1, 0);
23475 break;
23476
23477 case AR_CMD_REMOVE:
23478 rc = arRemoveCommand(&cmd);
23479 break;
23480
23481 default:
23482 assert( cmd.eCmd==AR_CMD_UPDATE );
23483 rc = arCreateOrUpdateCommand(&cmd, 1, 1);
23484 break;
23485 }
23486 }
23487 end_ar_command:
23488 if( cmd.db!=pState->db ){
23489 close_db(cmd.db);
23490 }
23491 sqlite3_free(cmd.zSrcTable);
23492
23493 return rc;
23494 }
23495 /* End of the ".archive" or ".ar" command logic
23496 *******************************************************************************/
23497 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
23498
23499 #if SQLITE_SHELL_HAVE_RECOVER
23500
23501 /*
23502 ** This function is used as a callback by the recover extension. Simply
23503 ** print the supplied SQL statement to stdout.
23504 */
23505 static int recoverSqlCb(void *pCtx, const char *zSql){
23506 ShellState *pState = (ShellState*)pCtx;
23507 utf8_printf(pState->out, "%s;\n", zSql);
23508 return SQLITE_OK;
23509 }
23510
23511 /*
23512 ** This function is called to recover data from the database. A script
23513 ** to construct a new database containing all recovered data is output
23514 ** on stream pState->out.
23515 */
23516 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
23517 int rc = SQLITE_OK;
23518 const char *zRecoveryDb = ""; /* Name of "recovery" database. Debug only */
23519 const char *zLAF = "lost_and_found";
23520 int bFreelist = 1; /* 0 if --ignore-freelist is specified */
23521 int bRowids = 1; /* 0 if --no-rowids */
23522 sqlite3_recover *p = 0;
23523 int i = 0;
23524
23525 for(i=1; i<nArg; i++){
23526 char *z = azArg[i];
23527 int n;
23528 if( z[0]=='-' && z[1]=='-' ) z++;
23529 n = strlen30(z);
23530 if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
23531 bFreelist = 0;
23532 }else
23533 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
23534 /* This option determines the name of the ATTACH-ed database used
23535 ** internally by the recovery extension. The default is "" which
23536 ** means to use a temporary database that is automatically deleted
23537 ** when closed. This option is undocumented and might disappear at
23538 ** any moment. */
23539 i++;
23540 zRecoveryDb = azArg[i];
23541 }else
23542 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
23543 i++;
23544 zLAF = azArg[i];
23545 }else
23546 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
23547 bRowids = 0;
23548 }
23549 else{
23550 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
23551 showHelp(pState->out, azArg[0]);
23552 return 1;
23553 }
23554 }
23555
23556 p = sqlite3_recover_init_sql(
23557 pState->db, "main", recoverSqlCb, (void*)pState
23558 );
23559
23560 sqlite3_recover_config(p, 789, (void*)zRecoveryDb); /* Debug use only */
23561 sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
23562 sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
23563 sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
23564
23565 sqlite3_recover_run(p);
23566 if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
23567 const char *zErr = sqlite3_recover_errmsg(p);
23568 int errCode = sqlite3_recover_errcode(p);
23569 raw_printf(stderr, "sql error: %s (%d)\n", zErr, errCode);
23570 }
23571 rc = sqlite3_recover_finish(p);
23572 return rc;
23573 }
23574 #endif /* SQLITE_SHELL_HAVE_RECOVER */
23575
23576
23577 /*
23578 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
23579 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
23580 * close db and set it to 0, and return the columns spec, to later
23581 * be sqlite3_free()'ed by the caller.
23582 * The return is 0 when either:
23583 * (a) The db was not initialized and zCol==0 (There are no columns.)
23584 * (b) zCol!=0 (Column was added, db initialized as needed.)
23585 * The 3rd argument, pRenamed, references an out parameter. If the
23586 * pointer is non-zero, its referent will be set to a summary of renames
23587 * done if renaming was necessary, or set to 0 if none was done. The out
23588 * string (if any) must be sqlite3_free()'ed by the caller.
23589 */
23590 #ifdef SHELL_DEBUG
23591 #define rc_err_oom_die(rc) \
23592 if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
23593 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
23594 fprintf(stderr,"E:%d\n",rc), assert(0)
23595 #else
23596 static void rc_err_oom_die(int rc){
23597 if( rc==SQLITE_NOMEM ) shell_check_oom(0);
23598 assert(rc==SQLITE_OK||rc==SQLITE_DONE);
23599 }
23600 #endif
23601
23602 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
23603 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
23604 #else /* Otherwise, memory is faster/better for the transient DB. */
23605 static const char *zCOL_DB = ":memory:";
23606 #endif
23607
23608 /* Define character (as C string) to separate generated column ordinal
23609 * from protected part of incoming column names. This defaults to "_"
23610 * so that incoming column identifiers that did not need not be quoted
23611 * remain usable without being quoted. It must be one character.
23612 */
23613 #ifndef SHELL_AUTOCOLUMN_SEP
23614 # define AUTOCOLUMN_SEP "_"
23615 #else
23616 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
23617 #endif
23618
23619 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
23620 /* Queries and D{D,M}L used here */
23621 static const char * const zTabMake = "\
23622 CREATE TABLE ColNames(\
23623 cpos INTEGER PRIMARY KEY,\
23624 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
23625 CREATE VIEW RepeatedNames AS \
23626 SELECT DISTINCT t.name FROM ColNames t \
23627 WHERE t.name COLLATE NOCASE IN (\
23628 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
23629 );\
23630 ";
23631 static const char * const zTabFill = "\
23632 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
23633 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
23634 ";
23635 static const char * const zHasDupes = "\
23636 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
23637 <count(name) FROM ColNames\
23638 ";
23639 #ifdef SHELL_COLUMN_RENAME_CLEAN
23640 static const char * const zDedoctor = "\
23641 UPDATE ColNames SET chop=iif(\
23642 (substring(name,nlen,1) BETWEEN '0' AND '9')\
23643 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
23644 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
23645 0\
23646 )\
23647 ";
23648 #endif
23649 static const char * const zSetReps = "\
23650 UPDATE ColNames AS t SET reps=\
23651 (SELECT count(*) FROM ColNames d \
23652 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
23653 COLLATE NOCASE\
23654 )\
23655 ";
23656 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
23657 static const char * const zColDigits = "\
23658 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
23659 ";
23660 #else
23661 /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
23662 static const char * const zColDigits = "\
23663 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
23664 WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
23665 ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
23666 ";
23667 #endif
23668 static const char * const zRenameRank =
23669 #ifdef SHELL_COLUMN_RENAME_CLEAN
23670 "UPDATE ColNames AS t SET suff="
23671 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
23672 #else /* ...RENAME_MINIMAL_ONE_PASS */
23673 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
23674 " SELECT 0 AS nlz"
23675 " UNION"
23676 " SELECT nlz+1 AS nlz FROM Lzn"
23677 " WHERE EXISTS("
23678 " SELECT 1"
23679 " FROM ColNames t, ColNames o"
23680 " WHERE"
23681 " iif(t.name IN (SELECT * FROM RepeatedNames),"
23682 " printf('%s"AUTOCOLUMN_SEP"%s',"
23683 " t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
23684 " t.name"
23685 " )"
23686 " ="
23687 " iif(o.name IN (SELECT * FROM RepeatedNames),"
23688 " printf('%s"AUTOCOLUMN_SEP"%s',"
23689 " o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
23690 " o.name"
23691 " )"
23692 " COLLATE NOCASE"
23693 " AND o.cpos<>t.cpos"
23694 " GROUP BY t.cpos"
23695 " )"
23696 ") UPDATE Colnames AS t SET"
23697 " chop = 0," /* No chopping, never touch incoming names. */
23698 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
23699 " printf('"AUTOCOLUMN_SEP"%s', substring("
23700 " printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
23701 " ''"
23702 " )"
23703 #endif
23704 ;
23705 static const char * const zCollectVar = "\
23706 SELECT\
23707 '('||x'0a'\
23708 || group_concat(\
23709 cname||' TEXT',\
23710 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
23711 ||')' AS ColsSpec \
23712 FROM (\
23713 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
23714 FROM ColNames ORDER BY cpos\
23715 )";
23716 static const char * const zRenamesDone =
23717 "SELECT group_concat("
23718 " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
23719 " ','||x'0a')"
23720 "FROM ColNames WHERE suff<>'' OR chop!=0"
23721 ;
23722 int rc;
23723 sqlite3_stmt *pStmt = 0;
23724 assert(pDb!=0);
23725 if( zColNew ){
23726 /* Add initial or additional column. Init db if necessary. */
23727 if( *pDb==0 ){
23728 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
23729 #ifdef SHELL_COLFIX_DB
23730 if(*zCOL_DB!=':')
23731 sqlite3_exec(*pDb,"drop table if exists ColNames;"
23732 "drop view if exists RepeatedNames;",0,0,0);
23733 #endif
23734 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
23735 rc_err_oom_die(rc);
23736 }
23737 assert(*pDb!=0);
23738 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
23739 rc_err_oom_die(rc);
23740 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
23741 rc_err_oom_die(rc);
23742 rc = sqlite3_step(pStmt);
23743 rc_err_oom_die(rc);
23744 sqlite3_finalize(pStmt);
23745 return 0;
23746 }else if( *pDb==0 ){
23747 return 0;
23748 }else{
23749 /* Formulate the columns spec, close the DB, zero *pDb. */
23750 char *zColsSpec = 0;
23751 int hasDupes = db_int(*pDb, zHasDupes);
23752 int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
23753 if( hasDupes ){
23754 #ifdef SHELL_COLUMN_RENAME_CLEAN
23755 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
23756 rc_err_oom_die(rc);
23757 #endif
23758 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
23759 rc_err_oom_die(rc);
23760 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
23761 rc_err_oom_die(rc);
23762 sqlite3_bind_int(pStmt, 1, nDigits);
23763 rc = sqlite3_step(pStmt);
23764 sqlite3_finalize(pStmt);
23765 if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
23766 }
23767 assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
23768 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
23769 rc_err_oom_die(rc);
23770 rc = sqlite3_step(pStmt);
23771 if( rc==SQLITE_ROW ){
23772 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
23773 }else{
23774 zColsSpec = 0;
23775 }
23776 if( pzRenamed!=0 ){
23777 if( !hasDupes ) *pzRenamed = 0;
23778 else{
23779 sqlite3_finalize(pStmt);
23780 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
23781 && SQLITE_ROW==sqlite3_step(pStmt) ){
23782 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
23783 }else
23784 *pzRenamed = 0;
23785 }
23786 }
23787 sqlite3_finalize(pStmt);
23788 sqlite3_close(*pDb);
23789 *pDb = 0;
23790 return zColsSpec;
23791 }
23792 }
23793
23794 /*
23795 ** If an input line begins with "." then invoke this routine to
23796 ** process that line.
23797 **
23798 ** Return 1 on error, 2 to exit, and 0 otherwise.
23799 */
23800 static int do_meta_command(char *zLine, ShellState *p){
23801 int h = 1;
23802 int nArg = 0;
23803 int n, c;
23804 int rc = 0;
23805 char *azArg[52];
23806
23807 #ifndef SQLITE_OMIT_VIRTUALTABLE
23808 if( p->expert.pExpert ){
23809 expertFinish(p, 1, 0);
23810 }
23811 #endif
23812
23813 /* Parse the input line into tokens.
23814 */
23815 while( zLine[h] && nArg<ArraySize(azArg)-1 ){
23816 while( IsSpace(zLine[h]) ){ h++; }
23817 if( zLine[h]==0 ) break;
23818 if( zLine[h]=='\'' || zLine[h]=='"' ){
23819 int delim = zLine[h++];
23820 azArg[nArg++] = &zLine[h];
23821 while( zLine[h] && zLine[h]!=delim ){
23822 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
23823 h++;
23824 }
23825 if( zLine[h]==delim ){
23826 zLine[h++] = 0;
23827 }
23828 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
23829 }else{
23830 azArg[nArg++] = &zLine[h];
23831 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
23832 if( zLine[h] ) zLine[h++] = 0;
23833 resolve_backslashes(azArg[nArg-1]);
23834 }
23835 }
23836 azArg[nArg] = 0;
23837
23838 /* Process the input line.
23839 */
23840 if( nArg==0 ) return 0; /* no tokens, no error */
23841 n = strlen30(azArg[0]);
23842 c = azArg[0][0];
23843 clearTempFile(p);
23844
23845 #ifndef SQLITE_OMIT_AUTHORIZATION
23846 if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
23847 if( nArg!=2 ){
23848 raw_printf(stderr, "Usage: .auth ON|OFF\n");
23849 rc = 1;
23850 goto meta_command_exit;
23851 }
23852 open_db(p, 0);
23853 if( booleanValue(azArg[1]) ){
23854 sqlite3_set_authorizer(p->db, shellAuth, p);
23855 }else if( p->bSafeModePersist ){
23856 sqlite3_set_authorizer(p->db, safeModeAuth, p);
23857 }else{
23858 sqlite3_set_authorizer(p->db, 0, 0);
23859 }
23860 }else
23861 #endif
23862
23863 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
23864 && !defined(SQLITE_SHELL_FIDDLE)
23865 if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
23866 open_db(p, 0);
23867 failIfSafeMode(p, "cannot run .archive in safe mode");
23868 rc = arDotCommand(p, 0, azArg, nArg);
23869 }else
23870 #endif
23871
23872 #ifndef SQLITE_SHELL_FIDDLE
23873 if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
23874 || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
23875 ){
23876 const char *zDestFile = 0;
23877 const char *zDb = 0;
23878 sqlite3 *pDest;
23879 sqlite3_backup *pBackup;
23880 int j;
23881 int bAsync = 0;
23882 const char *zVfs = 0;
23883 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
23884 for(j=1; j<nArg; j++){
23885 const char *z = azArg[j];
23886 if( z[0]=='-' ){
23887 if( z[1]=='-' ) z++;
23888 if( cli_strcmp(z, "-append")==0 ){
23889 zVfs = "apndvfs";
23890 }else
23891 if( cli_strcmp(z, "-async")==0 ){
23892 bAsync = 1;
23893 }else
23894 {
23895 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
23896 return 1;
23897 }
23898 }else if( zDestFile==0 ){
23899 zDestFile = azArg[j];
23900 }else if( zDb==0 ){
23901 zDb = zDestFile;
23902 zDestFile = azArg[j];
23903 }else{
23904 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
23905 return 1;
23906 }
23907 }
23908 if( zDestFile==0 ){
23909 raw_printf(stderr, "missing FILENAME argument on .backup\n");
23910 return 1;
23911 }
23912 if( zDb==0 ) zDb = "main";
23913 rc = sqlite3_open_v2(zDestFile, &pDest,
23914 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
23915 if( rc!=SQLITE_OK ){
23916 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
23917 close_db(pDest);
23918 return 1;
23919 }
23920 if( bAsync ){
23921 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
23922 0, 0, 0);
23923 }
23924 open_db(p, 0);
23925 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
23926 if( pBackup==0 ){
23927 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
23928 close_db(pDest);
23929 return 1;
23930 }
23931 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
23932 sqlite3_backup_finish(pBackup);
23933 if( rc==SQLITE_DONE ){
23934 rc = 0;
23935 }else{
23936 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
23937 rc = 1;
23938 }
23939 close_db(pDest);
23940 }else
23941 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
23942
23943 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
23944 if( nArg==2 ){
23945 bail_on_error = booleanValue(azArg[1]);
23946 }else{
23947 raw_printf(stderr, "Usage: .bail on|off\n");
23948 rc = 1;
23949 }
23950 }else
23951
23952 /* Undocumented. Legacy only. See "crnl" below */
23953 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
23954 if( nArg==2 ){
23955 if( booleanValue(azArg[1]) ){
23956 setBinaryMode(p->out, 1);
23957 }else{
23958 setTextMode(p->out, 1);
23959 }
23960 }else{
23961 raw_printf(stderr, "The \".binary\" command is deprecated."
23962 " Use \".crnl\" instead.\n");
23963 raw_printf(stderr, "Usage: .binary on|off\n");
23964 rc = 1;
23965 }
23966 }else
23967
23968 /* The undocumented ".breakpoint" command causes a call to the no-op
23969 ** routine named test_breakpoint().
23970 */
23971 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
23972 test_breakpoint();
23973 }else
23974
23975 #ifndef SQLITE_SHELL_FIDDLE
23976 if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
23977 failIfSafeMode(p, "cannot run .cd in safe mode");
23978 if( nArg==2 ){
23979 #if defined(_WIN32) || defined(WIN32)
23980 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
23981 rc = !SetCurrentDirectoryW(z);
23982 sqlite3_free(z);
23983 #else
23984 rc = chdir(azArg[1]);
23985 #endif
23986 if( rc ){
23987 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
23988 rc = 1;
23989 }
23990 }else{
23991 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
23992 rc = 1;
23993 }
23994 }else
23995 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
23996
23997 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
23998 if( nArg==2 ){
23999 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
24000 }else{
24001 raw_printf(stderr, "Usage: .changes on|off\n");
24002 rc = 1;
24003 }
24004 }else
24005
24006 #ifndef SQLITE_SHELL_FIDDLE
24007 /* Cancel output redirection, if it is currently set (by .testcase)
24008 ** Then read the content of the testcase-out.txt file and compare against
24009 ** azArg[1]. If there are differences, report an error and exit.
24010 */
24011 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
24012 char *zRes = 0;
24013 output_reset(p);
24014 if( nArg!=2 ){
24015 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
24016 rc = 2;
24017 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
24018 rc = 2;
24019 }else if( testcase_glob(azArg[1],zRes)==0 ){
24020 utf8_printf(stderr,
24021 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
24022 p->zTestcase, azArg[1], zRes);
24023 rc = 1;
24024 }else{
24025 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
24026 p->nCheck++;
24027 }
24028 sqlite3_free(zRes);
24029 }else
24030 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24031
24032 #ifndef SQLITE_SHELL_FIDDLE
24033 if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
24034 failIfSafeMode(p, "cannot run .clone in safe mode");
24035 if( nArg==2 ){
24036 tryToClone(p, azArg[1]);
24037 }else{
24038 raw_printf(stderr, "Usage: .clone FILENAME\n");
24039 rc = 1;
24040 }
24041 }else
24042 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24043
24044 if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
24045 if( nArg==1 ){
24046 /* List available connections */
24047 int i;
24048 for(i=0; i<ArraySize(p->aAuxDb); i++){
24049 const char *zFile = p->aAuxDb[i].zDbFilename;
24050 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
24051 zFile = "(not open)";
24052 }else if( zFile==0 ){
24053 zFile = "(memory)";
24054 }else if( zFile[0]==0 ){
24055 zFile = "(temporary-file)";
24056 }
24057 if( p->pAuxDb == &p->aAuxDb[i] ){
24058 utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
24059 }else if( p->aAuxDb[i].db!=0 ){
24060 utf8_printf(stdout, " %d: %s\n", i, zFile);
24061 }
24062 }
24063 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
24064 int i = azArg[1][0] - '0';
24065 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
24066 p->pAuxDb->db = p->db;
24067 p->pAuxDb = &p->aAuxDb[i];
24068 globalDb = p->db = p->pAuxDb->db;
24069 p->pAuxDb->db = 0;
24070 }
24071 }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
24072 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
24073 int i = azArg[2][0] - '0';
24074 if( i<0 || i>=ArraySize(p->aAuxDb) ){
24075 /* No-op */
24076 }else if( p->pAuxDb == &p->aAuxDb[i] ){
24077 raw_printf(stderr, "cannot close the active database connection\n");
24078 rc = 1;
24079 }else if( p->aAuxDb[i].db ){
24080 session_close_all(p, i);
24081 close_db(p->aAuxDb[i].db);
24082 p->aAuxDb[i].db = 0;
24083 }
24084 }else{
24085 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
24086 rc = 1;
24087 }
24088 }else
24089
24090 if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
24091 if( nArg==2 ){
24092 if( booleanValue(azArg[1]) ){
24093 setTextMode(p->out, 1);
24094 }else{
24095 setBinaryMode(p->out, 1);
24096 }
24097 }else{
24098 #if !defined(_WIN32) && !defined(WIN32)
24099 raw_printf(stderr, "The \".crnl\" is a no-op on non-Windows machines.\n");
24100 #endif
24101 raw_printf(stderr, "Usage: .crnl on|off\n");
24102 rc = 1;
24103 }
24104 }else
24105
24106 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
24107 char **azName = 0;
24108 int nName = 0;
24109 sqlite3_stmt *pStmt;
24110 int i;
24111 open_db(p, 0);
24112 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
24113 if( rc ){
24114 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
24115 rc = 1;
24116 }else{
24117 while( sqlite3_step(pStmt)==SQLITE_ROW ){
24118 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
24119 const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
24120 if( zSchema==0 || zFile==0 ) continue;
24121 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
24122 shell_check_oom(azName);
24123 azName[nName*2] = strdup(zSchema);
24124 azName[nName*2+1] = strdup(zFile);
24125 nName++;
24126 }
24127 }
24128 sqlite3_finalize(pStmt);
24129 for(i=0; i<nName; i++){
24130 int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
24131 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
24132 const char *z = azName[i*2+1];
24133 utf8_printf(p->out, "%s: %s %s%s\n",
24134 azName[i*2],
24135 z && z[0] ? z : "\"\"",
24136 bRdonly ? "r/o" : "r/w",
24137 eTxn==SQLITE_TXN_NONE ? "" :
24138 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
24139 free(azName[i*2]);
24140 free(azName[i*2+1]);
24141 }
24142 sqlite3_free(azName);
24143 }else
24144
24145 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
24146 static const struct DbConfigChoices {
24147 const char *zName;
24148 int op;
24149 } aDbConfig[] = {
24150 { "defensive", SQLITE_DBCONFIG_DEFENSIVE },
24151 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
24152 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
24153 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
24154 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
24155 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
24156 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
24157 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
24158 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
24159 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
24160 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
24161 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
24162 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
24163 { "reverse_scanorder", SQLITE_DBCONFIG_REVERSE_SCANORDER },
24164 { "stmt_scanstatus", SQLITE_DBCONFIG_STMT_SCANSTATUS },
24165 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
24166 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
24167 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
24168 };
24169 int ii, v;
24170 open_db(p, 0);
24171 for(ii=0; ii<ArraySize(aDbConfig); ii++){
24172 if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
24173 if( nArg>=3 ){
24174 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
24175 }
24176 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
24177 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
24178 if( nArg>1 ) break;
24179 }
24180 if( nArg>1 && ii==ArraySize(aDbConfig) ){
24181 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
24182 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
24183 }
24184 }else
24185
24186 #if SQLITE_SHELL_HAVE_RECOVER
24187 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
24188 rc = shell_dbinfo_command(p, nArg, azArg);
24189 }else
24190
24191 if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
24192 open_db(p, 0);
24193 rc = recoverDatabaseCmd(p, nArg, azArg);
24194 }else
24195 #endif /* SQLITE_SHELL_HAVE_RECOVER */
24196
24197 if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
24198 char *zLike = 0;
24199 char *zSql;
24200 int i;
24201 int savedShowHeader = p->showHeader;
24202 int savedShellFlags = p->shellFlgs;
24203 ShellClearFlag(p,
24204 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
24205 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
24206 for(i=1; i<nArg; i++){
24207 if( azArg[i][0]=='-' ){
24208 const char *z = azArg[i]+1;
24209 if( z[0]=='-' ) z++;
24210 if( cli_strcmp(z,"preserve-rowids")==0 ){
24211 #ifdef SQLITE_OMIT_VIRTUALTABLE
24212 raw_printf(stderr, "The --preserve-rowids option is not compatible"
24213 " with SQLITE_OMIT_VIRTUALTABLE\n");
24214 rc = 1;
24215 sqlite3_free(zLike);
24216 goto meta_command_exit;
24217 #else
24218 ShellSetFlag(p, SHFLG_PreserveRowid);
24219 #endif
24220 }else
24221 if( cli_strcmp(z,"newlines")==0 ){
24222 ShellSetFlag(p, SHFLG_Newlines);
24223 }else
24224 if( cli_strcmp(z,"data-only")==0 ){
24225 ShellSetFlag(p, SHFLG_DumpDataOnly);
24226 }else
24227 if( cli_strcmp(z,"nosys")==0 ){
24228 ShellSetFlag(p, SHFLG_DumpNoSys);
24229 }else
24230 {
24231 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
24232 rc = 1;
24233 sqlite3_free(zLike);
24234 goto meta_command_exit;
24235 }
24236 }else{
24237 /* azArg[i] contains a LIKE pattern. This ".dump" request should
24238 ** only dump data for tables for which either the table name matches
24239 ** the LIKE pattern, or the table appears to be a shadow table of
24240 ** a virtual table for which the name matches the LIKE pattern.
24241 */
24242 char *zExpr = sqlite3_mprintf(
24243 "name LIKE %Q ESCAPE '\\' OR EXISTS ("
24244 " SELECT 1 FROM sqlite_schema WHERE "
24245 " name LIKE %Q ESCAPE '\\' AND"
24246 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
24247 " substr(o.name, 1, length(name)+1) == (name||'_')"
24248 ")", azArg[i], azArg[i]
24249 );
24250
24251 if( zLike ){
24252 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
24253 }else{
24254 zLike = zExpr;
24255 }
24256 }
24257 }
24258
24259 open_db(p, 0);
24260
24261 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
24262 /* When playing back a "dump", the content might appear in an order
24263 ** which causes immediate foreign key constraints to be violated.
24264 ** So disable foreign-key constraint enforcement to prevent problems. */
24265 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
24266 raw_printf(p->out, "BEGIN TRANSACTION;\n");
24267 }
24268 p->writableSchema = 0;
24269 p->showHeader = 0;
24270 /* Set writable_schema=ON since doing so forces SQLite to initialize
24271 ** as much of the schema as it can even if the sqlite_schema table is
24272 ** corrupt. */
24273 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
24274 p->nErr = 0;
24275 if( zLike==0 ) zLike = sqlite3_mprintf("true");
24276 zSql = sqlite3_mprintf(
24277 "SELECT name, type, sql FROM sqlite_schema AS o "
24278 "WHERE (%s) AND type=='table'"
24279 " AND sql NOT NULL"
24280 " ORDER BY tbl_name='sqlite_sequence', rowid",
24281 zLike
24282 );
24283 run_schema_dump_query(p,zSql);
24284 sqlite3_free(zSql);
24285 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
24286 zSql = sqlite3_mprintf(
24287 "SELECT sql FROM sqlite_schema AS o "
24288 "WHERE (%s) AND sql NOT NULL"
24289 " AND type IN ('index','trigger','view')",
24290 zLike
24291 );
24292 run_table_dump_query(p, zSql);
24293 sqlite3_free(zSql);
24294 }
24295 sqlite3_free(zLike);
24296 if( p->writableSchema ){
24297 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
24298 p->writableSchema = 0;
24299 }
24300 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
24301 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
24302 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
24303 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
24304 }
24305 p->showHeader = savedShowHeader;
24306 p->shellFlgs = savedShellFlags;
24307 }else
24308
24309 if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
24310 if( nArg==2 ){
24311 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
24312 }else{
24313 raw_printf(stderr, "Usage: .echo on|off\n");
24314 rc = 1;
24315 }
24316 }else
24317
24318 if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
24319 if( nArg==2 ){
24320 p->autoEQPtest = 0;
24321 if( p->autoEQPtrace ){
24322 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
24323 p->autoEQPtrace = 0;
24324 }
24325 if( cli_strcmp(azArg[1],"full")==0 ){
24326 p->autoEQP = AUTOEQP_full;
24327 }else if( cli_strcmp(azArg[1],"trigger")==0 ){
24328 p->autoEQP = AUTOEQP_trigger;
24329 #ifdef SQLITE_DEBUG
24330 }else if( cli_strcmp(azArg[1],"test")==0 ){
24331 p->autoEQP = AUTOEQP_on;
24332 p->autoEQPtest = 1;
24333 }else if( cli_strcmp(azArg[1],"trace")==0 ){
24334 p->autoEQP = AUTOEQP_full;
24335 p->autoEQPtrace = 1;
24336 open_db(p, 0);
24337 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
24338 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
24339 #endif
24340 }else{
24341 p->autoEQP = (u8)booleanValue(azArg[1]);
24342 }
24343 }else{
24344 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
24345 rc = 1;
24346 }
24347 }else
24348
24349 #ifndef SQLITE_SHELL_FIDDLE
24350 if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
24351 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
24352 rc = 2;
24353 }else
24354 #endif
24355
24356 /* The ".explain" command is automatic now. It is largely pointless. It
24357 ** retained purely for backwards compatibility */
24358 if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
24359 int val = 1;
24360 if( nArg>=2 ){
24361 if( cli_strcmp(azArg[1],"auto")==0 ){
24362 val = 99;
24363 }else{
24364 val = booleanValue(azArg[1]);
24365 }
24366 }
24367 if( val==1 && p->mode!=MODE_Explain ){
24368 p->normalMode = p->mode;
24369 p->mode = MODE_Explain;
24370 p->autoExplain = 0;
24371 }else if( val==0 ){
24372 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
24373 p->autoExplain = 0;
24374 }else if( val==99 ){
24375 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
24376 p->autoExplain = 1;
24377 }
24378 }else
24379
24380 #ifndef SQLITE_OMIT_VIRTUALTABLE
24381 if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
24382 if( p->bSafeMode ){
24383 raw_printf(stderr,
24384 "Cannot run experimental commands such as \"%s\" in safe mode\n",
24385 azArg[0]);
24386 rc = 1;
24387 }else{
24388 open_db(p, 0);
24389 expertDotCommand(p, azArg, nArg);
24390 }
24391 }else
24392 #endif
24393
24394 if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
24395 static const struct {
24396 const char *zCtrlName; /* Name of a test-control option */
24397 int ctrlCode; /* Integer code for that option */
24398 const char *zUsage; /* Usage notes */
24399 } aCtrl[] = {
24400 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" },
24401 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" },
24402 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" },
24403 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" },
24404 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" },
24405 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/
24406 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" },
24407 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" },
24408 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" },
24409 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" },
24410 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/
24411 };
24412 int filectrl = -1;
24413 int iCtrl = -1;
24414 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */
24415 int isOk = 0; /* 0: usage 1: %lld 2: no-result */
24416 int n2, i;
24417 const char *zCmd = 0;
24418 const char *zSchema = 0;
24419
24420 open_db(p, 0);
24421 zCmd = nArg>=2 ? azArg[1] : "help";
24422
24423 if( zCmd[0]=='-'
24424 && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
24425 && nArg>=4
24426 ){
24427 zSchema = azArg[2];
24428 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
24429 nArg -= 2;
24430 zCmd = azArg[1];
24431 }
24432
24433 /* The argument can optionally begin with "-" or "--" */
24434 if( zCmd[0]=='-' && zCmd[1] ){
24435 zCmd++;
24436 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
24437 }
24438
24439 /* --help lists all file-controls */
24440 if( cli_strcmp(zCmd,"help")==0 ){
24441 utf8_printf(p->out, "Available file-controls:\n");
24442 for(i=0; i<ArraySize(aCtrl); i++){
24443 utf8_printf(p->out, " .filectrl %s %s\n",
24444 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
24445 }
24446 rc = 1;
24447 goto meta_command_exit;
24448 }
24449
24450 /* convert filectrl text option to value. allow any unique prefix
24451 ** of the option name, or a numerical value. */
24452 n2 = strlen30(zCmd);
24453 for(i=0; i<ArraySize(aCtrl); i++){
24454 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
24455 if( filectrl<0 ){
24456 filectrl = aCtrl[i].ctrlCode;
24457 iCtrl = i;
24458 }else{
24459 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
24460 "Use \".filectrl --help\" for help\n", zCmd);
24461 rc = 1;
24462 goto meta_command_exit;
24463 }
24464 }
24465 }
24466 if( filectrl<0 ){
24467 utf8_printf(stderr,"Error: unknown file-control: %s\n"
24468 "Use \".filectrl --help\" for help\n", zCmd);
24469 }else{
24470 switch(filectrl){
24471 case SQLITE_FCNTL_SIZE_LIMIT: {
24472 if( nArg!=2 && nArg!=3 ) break;
24473 iRes = nArg==3 ? integerValue(azArg[2]) : -1;
24474 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
24475 isOk = 1;
24476 break;
24477 }
24478 case SQLITE_FCNTL_LOCK_TIMEOUT:
24479 case SQLITE_FCNTL_CHUNK_SIZE: {
24480 int x;
24481 if( nArg!=3 ) break;
24482 x = (int)integerValue(azArg[2]);
24483 sqlite3_file_control(p->db, zSchema, filectrl, &x);
24484 isOk = 2;
24485 break;
24486 }
24487 case SQLITE_FCNTL_PERSIST_WAL:
24488 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
24489 int x;
24490 if( nArg!=2 && nArg!=3 ) break;
24491 x = nArg==3 ? booleanValue(azArg[2]) : -1;
24492 sqlite3_file_control(p->db, zSchema, filectrl, &x);
24493 iRes = x;
24494 isOk = 1;
24495 break;
24496 }
24497 case SQLITE_FCNTL_DATA_VERSION:
24498 case SQLITE_FCNTL_HAS_MOVED: {
24499 int x;
24500 if( nArg!=2 ) break;
24501 sqlite3_file_control(p->db, zSchema, filectrl, &x);
24502 iRes = x;
24503 isOk = 1;
24504 break;
24505 }
24506 case SQLITE_FCNTL_TEMPFILENAME: {
24507 char *z = 0;
24508 if( nArg!=2 ) break;
24509 sqlite3_file_control(p->db, zSchema, filectrl, &z);
24510 if( z ){
24511 utf8_printf(p->out, "%s\n", z);
24512 sqlite3_free(z);
24513 }
24514 isOk = 2;
24515 break;
24516 }
24517 case SQLITE_FCNTL_RESERVE_BYTES: {
24518 int x;
24519 if( nArg>=3 ){
24520 x = atoi(azArg[2]);
24521 sqlite3_file_control(p->db, zSchema, filectrl, &x);
24522 }
24523 x = -1;
24524 sqlite3_file_control(p->db, zSchema, filectrl, &x);
24525 utf8_printf(p->out,"%d\n", x);
24526 isOk = 2;
24527 break;
24528 }
24529 }
24530 }
24531 if( isOk==0 && iCtrl>=0 ){
24532 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
24533 rc = 1;
24534 }else if( isOk==1 ){
24535 char zBuf[100];
24536 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
24537 raw_printf(p->out, "%s\n", zBuf);
24538 }
24539 }else
24540
24541 if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
24542 ShellState data;
24543 int doStats = 0;
24544 memcpy(&data, p, sizeof(data));
24545 data.showHeader = 0;
24546 data.cMode = data.mode = MODE_Semi;
24547 if( nArg==2 && optionMatch(azArg[1], "indent") ){
24548 data.cMode = data.mode = MODE_Pretty;
24549 nArg = 1;
24550 }
24551 if( nArg!=1 ){
24552 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
24553 rc = 1;
24554 goto meta_command_exit;
24555 }
24556 open_db(p, 0);
24557 rc = sqlite3_exec(p->db,
24558 "SELECT sql FROM"
24559 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
24560 " FROM sqlite_schema UNION ALL"
24561 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
24562 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
24563 "ORDER BY x",
24564 callback, &data, 0
24565 );
24566 if( rc==SQLITE_OK ){
24567 sqlite3_stmt *pStmt;
24568 rc = sqlite3_prepare_v2(p->db,
24569 "SELECT rowid FROM sqlite_schema"
24570 " WHERE name GLOB 'sqlite_stat[134]'",
24571 -1, &pStmt, 0);
24572 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
24573 sqlite3_finalize(pStmt);
24574 }
24575 if( doStats==0 ){
24576 raw_printf(p->out, "/* No STAT tables available */\n");
24577 }else{
24578 raw_printf(p->out, "ANALYZE sqlite_schema;\n");
24579 data.cMode = data.mode = MODE_Insert;
24580 data.zDestTable = "sqlite_stat1";
24581 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
24582 data.zDestTable = "sqlite_stat4";
24583 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
24584 raw_printf(p->out, "ANALYZE sqlite_schema;\n");
24585 }
24586 }else
24587
24588 if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
24589 if( nArg==2 ){
24590 p->showHeader = booleanValue(azArg[1]);
24591 p->shellFlgs |= SHFLG_HeaderSet;
24592 }else{
24593 raw_printf(stderr, "Usage: .headers on|off\n");
24594 rc = 1;
24595 }
24596 }else
24597
24598 if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
24599 if( nArg>=2 ){
24600 n = showHelp(p->out, azArg[1]);
24601 if( n==0 ){
24602 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
24603 }
24604 }else{
24605 showHelp(p->out, 0);
24606 }
24607 }else
24608
24609 #ifndef SQLITE_SHELL_FIDDLE
24610 if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
24611 char *zTable = 0; /* Insert data into this table */
24612 char *zSchema = 0; /* within this schema (may default to "main") */
24613 char *zFile = 0; /* Name of file to extra content from */
24614 sqlite3_stmt *pStmt = NULL; /* A statement */
24615 int nCol; /* Number of columns in the table */
24616 int nByte; /* Number of bytes in an SQL string */
24617 int i, j; /* Loop counters */
24618 int needCommit; /* True to COMMIT or ROLLBACK at end */
24619 int nSep; /* Number of bytes in p->colSeparator[] */
24620 char *zSql; /* An SQL statement */
24621 char *zFullTabName; /* Table name with schema if applicable */
24622 ImportCtx sCtx; /* Reader context */
24623 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
24624 int eVerbose = 0; /* Larger for more console output */
24625 int nSkip = 0; /* Initial lines to skip */
24626 int useOutputMode = 1; /* Use output mode to determine separators */
24627 char *zCreate = 0; /* CREATE TABLE statement text */
24628
24629 failIfSafeMode(p, "cannot run .import in safe mode");
24630 memset(&sCtx, 0, sizeof(sCtx));
24631 if( p->mode==MODE_Ascii ){
24632 xRead = ascii_read_one_field;
24633 }else{
24634 xRead = csv_read_one_field;
24635 }
24636 rc = 1;
24637 for(i=1; i<nArg; i++){
24638 char *z = azArg[i];
24639 if( z[0]=='-' && z[1]=='-' ) z++;
24640 if( z[0]!='-' ){
24641 if( zFile==0 ){
24642 zFile = z;
24643 }else if( zTable==0 ){
24644 zTable = z;
24645 }else{
24646 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z);
24647 showHelp(p->out, "import");
24648 goto meta_command_exit;
24649 }
24650 }else if( cli_strcmp(z,"-v")==0 ){
24651 eVerbose++;
24652 }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
24653 zSchema = azArg[++i];
24654 }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
24655 nSkip = integerValue(azArg[++i]);
24656 }else if( cli_strcmp(z,"-ascii")==0 ){
24657 sCtx.cColSep = SEP_Unit[0];
24658 sCtx.cRowSep = SEP_Record[0];
24659 xRead = ascii_read_one_field;
24660 useOutputMode = 0;
24661 }else if( cli_strcmp(z,"-csv")==0 ){
24662 sCtx.cColSep = ',';
24663 sCtx.cRowSep = '\n';
24664 xRead = csv_read_one_field;
24665 useOutputMode = 0;
24666 }else{
24667 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z);
24668 showHelp(p->out, "import");
24669 goto meta_command_exit;
24670 }
24671 }
24672 if( zTable==0 ){
24673 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
24674 zFile==0 ? "FILE" : "TABLE");
24675 showHelp(p->out, "import");
24676 goto meta_command_exit;
24677 }
24678 seenInterrupt = 0;
24679 open_db(p, 0);
24680 if( useOutputMode ){
24681 /* If neither the --csv or --ascii options are specified, then set
24682 ** the column and row separator characters from the output mode. */
24683 nSep = strlen30(p->colSeparator);
24684 if( nSep==0 ){
24685 raw_printf(stderr,
24686 "Error: non-null column separator required for import\n");
24687 goto meta_command_exit;
24688 }
24689 if( nSep>1 ){
24690 raw_printf(stderr,
24691 "Error: multi-character column separators not allowed"
24692 " for import\n");
24693 goto meta_command_exit;
24694 }
24695 nSep = strlen30(p->rowSeparator);
24696 if( nSep==0 ){
24697 raw_printf(stderr,
24698 "Error: non-null row separator required for import\n");
24699 goto meta_command_exit;
24700 }
24701 if( nSep==2 && p->mode==MODE_Csv
24702 && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
24703 ){
24704 /* When importing CSV (only), if the row separator is set to the
24705 ** default output row separator, change it to the default input
24706 ** row separator. This avoids having to maintain different input
24707 ** and output row separators. */
24708 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
24709 nSep = strlen30(p->rowSeparator);
24710 }
24711 if( nSep>1 ){
24712 raw_printf(stderr, "Error: multi-character row separators not allowed"
24713 " for import\n");
24714 goto meta_command_exit;
24715 }
24716 sCtx.cColSep = (u8)p->colSeparator[0];
24717 sCtx.cRowSep = (u8)p->rowSeparator[0];
24718 }
24719 sCtx.zFile = zFile;
24720 sCtx.nLine = 1;
24721 if( sCtx.zFile[0]=='|' ){
24722 #ifdef SQLITE_OMIT_POPEN
24723 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
24724 goto meta_command_exit;
24725 #else
24726 sCtx.in = popen(sCtx.zFile+1, "r");
24727 sCtx.zFile = "<pipe>";
24728 sCtx.xCloser = pclose;
24729 #endif
24730 }else{
24731 sCtx.in = fopen(sCtx.zFile, "rb");
24732 sCtx.xCloser = fclose;
24733 }
24734 if( sCtx.in==0 ){
24735 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
24736 goto meta_command_exit;
24737 }
24738 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
24739 char zSep[2];
24740 zSep[1] = 0;
24741 zSep[0] = sCtx.cColSep;
24742 utf8_printf(p->out, "Column separator ");
24743 output_c_string(p->out, zSep);
24744 utf8_printf(p->out, ", row separator ");
24745 zSep[0] = sCtx.cRowSep;
24746 output_c_string(p->out, zSep);
24747 utf8_printf(p->out, "\n");
24748 }
24749 sCtx.z = sqlite3_malloc64(120);
24750 if( sCtx.z==0 ){
24751 import_cleanup(&sCtx);
24752 shell_out_of_memory();
24753 }
24754 /* Below, resources must be freed before exit. */
24755 while( (nSkip--)>0 ){
24756 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
24757 }
24758 if( zSchema!=0 ){
24759 zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
24760 }else{
24761 zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
24762 }
24763 zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
24764 if( zSql==0 || zFullTabName==0 ){
24765 import_cleanup(&sCtx);
24766 shell_out_of_memory();
24767 }
24768 nByte = strlen30(zSql);
24769 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
24770 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
24771 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
24772 sqlite3 *dbCols = 0;
24773 char *zRenames = 0;
24774 char *zColDefs;
24775 zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
24776 while( xRead(&sCtx) ){
24777 zAutoColumn(sCtx.z, &dbCols, 0);
24778 if( sCtx.cTerm!=sCtx.cColSep ) break;
24779 }
24780 zColDefs = zAutoColumn(0, &dbCols, &zRenames);
24781 if( zRenames!=0 ){
24782 utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
24783 "Columns renamed during .import %s due to duplicates:\n"
24784 "%s\n", sCtx.zFile, zRenames);
24785 sqlite3_free(zRenames);
24786 }
24787 assert(dbCols==0);
24788 if( zColDefs==0 ){
24789 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
24790 import_fail:
24791 sqlite3_free(zCreate);
24792 sqlite3_free(zSql);
24793 sqlite3_free(zFullTabName);
24794 import_cleanup(&sCtx);
24795 rc = 1;
24796 goto meta_command_exit;
24797 }
24798 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
24799 if( eVerbose>=1 ){
24800 utf8_printf(p->out, "%s\n", zCreate);
24801 }
24802 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
24803 if( rc ){
24804 utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
24805 goto import_fail;
24806 }
24807 sqlite3_free(zCreate);
24808 zCreate = 0;
24809 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
24810 }
24811 if( rc ){
24812 if (pStmt) sqlite3_finalize(pStmt);
24813 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
24814 goto import_fail;
24815 }
24816 sqlite3_free(zSql);
24817 nCol = sqlite3_column_count(pStmt);
24818 sqlite3_finalize(pStmt);
24819 pStmt = 0;
24820 if( nCol==0 ) return 0; /* no columns, no error */
24821 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
24822 if( zSql==0 ){
24823 import_cleanup(&sCtx);
24824 shell_out_of_memory();
24825 }
24826 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
24827 j = strlen30(zSql);
24828 for(i=1; i<nCol; i++){
24829 zSql[j++] = ',';
24830 zSql[j++] = '?';
24831 }
24832 zSql[j++] = ')';
24833 zSql[j] = 0;
24834 if( eVerbose>=2 ){
24835 utf8_printf(p->out, "Insert using: %s\n", zSql);
24836 }
24837 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
24838 if( rc ){
24839 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
24840 if (pStmt) sqlite3_finalize(pStmt);
24841 goto import_fail;
24842 }
24843 sqlite3_free(zSql);
24844 sqlite3_free(zFullTabName);
24845 needCommit = sqlite3_get_autocommit(p->db);
24846 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
24847 do{
24848 int startLine = sCtx.nLine;
24849 for(i=0; i<nCol; i++){
24850 char *z = xRead(&sCtx);
24851 /*
24852 ** Did we reach end-of-file before finding any columns?
24853 ** If so, stop instead of NULL filling the remaining columns.
24854 */
24855 if( z==0 && i==0 ) break;
24856 /*
24857 ** Did we reach end-of-file OR end-of-line before finding any
24858 ** columns in ASCII mode? If so, stop instead of NULL filling
24859 ** the remaining columns.
24860 */
24861 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
24862 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
24863 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
24864 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
24865 "filling the rest with NULL\n",
24866 sCtx.zFile, startLine, nCol, i+1);
24867 i += 2;
24868 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
24869 }
24870 }
24871 if( sCtx.cTerm==sCtx.cColSep ){
24872 do{
24873 xRead(&sCtx);
24874 i++;
24875 }while( sCtx.cTerm==sCtx.cColSep );
24876 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
24877 "extras ignored\n",
24878 sCtx.zFile, startLine, nCol, i);
24879 }
24880 if( i>=nCol ){
24881 sqlite3_step(pStmt);
24882 rc = sqlite3_reset(pStmt);
24883 if( rc!=SQLITE_OK ){
24884 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
24885 startLine, sqlite3_errmsg(p->db));
24886 sCtx.nErr++;
24887 }else{
24888 sCtx.nRow++;
24889 }
24890 }
24891 }while( sCtx.cTerm!=EOF );
24892
24893 import_cleanup(&sCtx);
24894 sqlite3_finalize(pStmt);
24895 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
24896 if( eVerbose>0 ){
24897 utf8_printf(p->out,
24898 "Added %d rows with %d errors using %d lines of input\n",
24899 sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
24900 }
24901 }else
24902 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24903
24904 #ifndef SQLITE_UNTESTABLE
24905 if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
24906 char *zSql;
24907 char *zCollist = 0;
24908 sqlite3_stmt *pStmt;
24909 int tnum = 0;
24910 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */
24911 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
24912 int i;
24913 if( !ShellHasFlag(p,SHFLG_TestingMode) ){
24914 utf8_printf(stderr, ".%s unavailable without --unsafe-testing\n",
24915 "imposter");
24916 rc = 1;
24917 goto meta_command_exit;
24918 }
24919 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
24920 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
24921 " .imposter off\n");
24922 /* Also allowed, but not documented:
24923 **
24924 ** .imposter TABLE IMPOSTER
24925 **
24926 ** where TABLE is a WITHOUT ROWID table. In that case, the
24927 ** imposter is another WITHOUT ROWID table with the columns in
24928 ** storage order. */
24929 rc = 1;
24930 goto meta_command_exit;
24931 }
24932 open_db(p, 0);
24933 if( nArg==2 ){
24934 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
24935 goto meta_command_exit;
24936 }
24937 zSql = sqlite3_mprintf(
24938 "SELECT rootpage, 0 FROM sqlite_schema"
24939 " WHERE name='%q' AND type='index'"
24940 "UNION ALL "
24941 "SELECT rootpage, 1 FROM sqlite_schema"
24942 " WHERE name='%q' AND type='table'"
24943 " AND sql LIKE '%%without%%rowid%%'",
24944 azArg[1], azArg[1]
24945 );
24946 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
24947 sqlite3_free(zSql);
24948 if( sqlite3_step(pStmt)==SQLITE_ROW ){
24949 tnum = sqlite3_column_int(pStmt, 0);
24950 isWO = sqlite3_column_int(pStmt, 1);
24951 }
24952 sqlite3_finalize(pStmt);
24953 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
24954 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
24955 sqlite3_free(zSql);
24956 i = 0;
24957 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
24958 char zLabel[20];
24959 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
24960 i++;
24961 if( zCol==0 ){
24962 if( sqlite3_column_int(pStmt,1)==-1 ){
24963 zCol = "_ROWID_";
24964 }else{
24965 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
24966 zCol = zLabel;
24967 }
24968 }
24969 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
24970 lenPK = (int)strlen(zCollist);
24971 }
24972 if( zCollist==0 ){
24973 zCollist = sqlite3_mprintf("\"%w\"", zCol);
24974 }else{
24975 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
24976 }
24977 }
24978 sqlite3_finalize(pStmt);
24979 if( i==0 || tnum==0 ){
24980 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
24981 rc = 1;
24982 sqlite3_free(zCollist);
24983 goto meta_command_exit;
24984 }
24985 if( lenPK==0 ) lenPK = 100000;
24986 zSql = sqlite3_mprintf(
24987 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
24988 azArg[2], zCollist, lenPK, zCollist);
24989 sqlite3_free(zCollist);
24990 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
24991 if( rc==SQLITE_OK ){
24992 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
24993 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
24994 if( rc ){
24995 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
24996 }else{
24997 utf8_printf(stdout, "%s;\n", zSql);
24998 raw_printf(stdout,
24999 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
25000 azArg[1], isWO ? "table" : "index"
25001 );
25002 }
25003 }else{
25004 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
25005 rc = 1;
25006 }
25007 sqlite3_free(zSql);
25008 }else
25009 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
25010
25011 #ifdef SQLITE_ENABLE_IOTRACE
25012 if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
25013 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
25014 if( iotrace && iotrace!=stdout ) fclose(iotrace);
25015 iotrace = 0;
25016 if( nArg<2 ){
25017 sqlite3IoTrace = 0;
25018 }else if( cli_strcmp(azArg[1], "-")==0 ){
25019 sqlite3IoTrace = iotracePrintf;
25020 iotrace = stdout;
25021 }else{
25022 iotrace = fopen(azArg[1], "w");
25023 if( iotrace==0 ){
25024 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
25025 sqlite3IoTrace = 0;
25026 rc = 1;
25027 }else{
25028 sqlite3IoTrace = iotracePrintf;
25029 }
25030 }
25031 }else
25032 #endif
25033
25034 if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
25035 static const struct {
25036 const char *zLimitName; /* Name of a limit */
25037 int limitCode; /* Integer code for that limit */
25038 } aLimit[] = {
25039 { "length", SQLITE_LIMIT_LENGTH },
25040 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
25041 { "column", SQLITE_LIMIT_COLUMN },
25042 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
25043 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
25044 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
25045 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
25046 { "attached", SQLITE_LIMIT_ATTACHED },
25047 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
25048 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
25049 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
25050 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
25051 };
25052 int i, n2;
25053 open_db(p, 0);
25054 if( nArg==1 ){
25055 for(i=0; i<ArraySize(aLimit); i++){
25056 printf("%20s %d\n", aLimit[i].zLimitName,
25057 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
25058 }
25059 }else if( nArg>3 ){
25060 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
25061 rc = 1;
25062 goto meta_command_exit;
25063 }else{
25064 int iLimit = -1;
25065 n2 = strlen30(azArg[1]);
25066 for(i=0; i<ArraySize(aLimit); i++){
25067 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
25068 if( iLimit<0 ){
25069 iLimit = i;
25070 }else{
25071 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
25072 rc = 1;
25073 goto meta_command_exit;
25074 }
25075 }
25076 }
25077 if( iLimit<0 ){
25078 utf8_printf(stderr, "unknown limit: \"%s\"\n"
25079 "enter \".limits\" with no arguments for a list.\n",
25080 azArg[1]);
25081 rc = 1;
25082 goto meta_command_exit;
25083 }
25084 if( nArg==3 ){
25085 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
25086 (int)integerValue(azArg[2]));
25087 }
25088 printf("%20s %d\n", aLimit[iLimit].zLimitName,
25089 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
25090 }
25091 }else
25092
25093 if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
25094 open_db(p, 0);
25095 lintDotCommand(p, azArg, nArg);
25096 }else
25097
25098 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
25099 if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
25100 const char *zFile, *zProc;
25101 char *zErrMsg = 0;
25102 failIfSafeMode(p, "cannot run .load in safe mode");
25103 if( nArg<2 || azArg[1][0]==0 ){
25104 /* Must have a non-empty FILE. (Will not load self.) */
25105 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
25106 rc = 1;
25107 goto meta_command_exit;
25108 }
25109 zFile = azArg[1];
25110 zProc = nArg>=3 ? azArg[2] : 0;
25111 open_db(p, 0);
25112 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
25113 if( rc!=SQLITE_OK ){
25114 utf8_printf(stderr, "Error: %s\n", zErrMsg);
25115 sqlite3_free(zErrMsg);
25116 rc = 1;
25117 }
25118 }else
25119 #endif
25120
25121 if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
25122 if( nArg!=2 ){
25123 raw_printf(stderr, "Usage: .log FILENAME\n");
25124 rc = 1;
25125 }else{
25126 const char *zFile = azArg[1];
25127 if( p->bSafeMode
25128 && cli_strcmp(zFile,"on")!=0
25129 && cli_strcmp(zFile,"off")!=0
25130 ){
25131 raw_printf(stdout, "cannot set .log to anything other "
25132 "than \"on\" or \"off\"\n");
25133 zFile = "off";
25134 }
25135 output_file_close(p->pLog);
25136 if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
25137 p->pLog = output_file_open(zFile, 0);
25138 }
25139 }else
25140
25141 if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
25142 const char *zMode = 0;
25143 const char *zTabname = 0;
25144 int i, n2;
25145 ColModeOpts cmOpts = ColModeOpts_default;
25146 for(i=1; i<nArg; i++){
25147 const char *z = azArg[i];
25148 if( optionMatch(z,"wrap") && i+1<nArg ){
25149 cmOpts.iWrap = integerValue(azArg[++i]);
25150 }else if( optionMatch(z,"ww") ){
25151 cmOpts.bWordWrap = 1;
25152 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
25153 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
25154 }else if( optionMatch(z,"quote") ){
25155 cmOpts.bQuote = 1;
25156 }else if( optionMatch(z,"noquote") ){
25157 cmOpts.bQuote = 0;
25158 }else if( zMode==0 ){
25159 zMode = z;
25160 /* Apply defaults for qbox pseudo-mode. If that
25161 * overwrites already-set values, user was informed of this.
25162 */
25163 if( cli_strcmp(z, "qbox")==0 ){
25164 ColModeOpts cmo = ColModeOpts_default_qbox;
25165 zMode = "box";
25166 cmOpts = cmo;
25167 }
25168 }else if( zTabname==0 ){
25169 zTabname = z;
25170 }else if( z[0]=='-' ){
25171 utf8_printf(stderr, "unknown option: %s\n", z);
25172 utf8_printf(stderr, "options:\n"
25173 " --noquote\n"
25174 " --quote\n"
25175 " --wordwrap on/off\n"
25176 " --wrap N\n"
25177 " --ww\n");
25178 rc = 1;
25179 goto meta_command_exit;
25180 }else{
25181 utf8_printf(stderr, "extra argument: \"%s\"\n", z);
25182 rc = 1;
25183 goto meta_command_exit;
25184 }
25185 }
25186 if( zMode==0 ){
25187 if( p->mode==MODE_Column
25188 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
25189 ){
25190 raw_printf
25191 (p->out,
25192 "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
25193 modeDescr[p->mode], p->cmOpts.iWrap,
25194 p->cmOpts.bWordWrap ? "on" : "off",
25195 p->cmOpts.bQuote ? "" : "no");
25196 }else{
25197 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
25198 }
25199 zMode = modeDescr[p->mode];
25200 }
25201 n2 = strlen30(zMode);
25202 if( cli_strncmp(zMode,"lines",n2)==0 ){
25203 p->mode = MODE_Line;
25204 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25205 }else if( cli_strncmp(zMode,"columns",n2)==0 ){
25206 p->mode = MODE_Column;
25207 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
25208 p->showHeader = 1;
25209 }
25210 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25211 p->cmOpts = cmOpts;
25212 }else if( cli_strncmp(zMode,"list",n2)==0 ){
25213 p->mode = MODE_List;
25214 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
25215 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25216 }else if( cli_strncmp(zMode,"html",n2)==0 ){
25217 p->mode = MODE_Html;
25218 }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
25219 p->mode = MODE_Tcl;
25220 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
25221 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25222 }else if( cli_strncmp(zMode,"csv",n2)==0 ){
25223 p->mode = MODE_Csv;
25224 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
25225 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
25226 }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
25227 p->mode = MODE_List;
25228 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
25229 }else if( cli_strncmp(zMode,"insert",n2)==0 ){
25230 p->mode = MODE_Insert;
25231 set_table_name(p, zTabname ? zTabname : "table");
25232 }else if( cli_strncmp(zMode,"quote",n2)==0 ){
25233 p->mode = MODE_Quote;
25234 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
25235 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25236 }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
25237 p->mode = MODE_Ascii;
25238 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
25239 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
25240 }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
25241 p->mode = MODE_Markdown;
25242 p->cmOpts = cmOpts;
25243 }else if( cli_strncmp(zMode,"table",n2)==0 ){
25244 p->mode = MODE_Table;
25245 p->cmOpts = cmOpts;
25246 }else if( cli_strncmp(zMode,"box",n2)==0 ){
25247 p->mode = MODE_Box;
25248 p->cmOpts = cmOpts;
25249 }else if( cli_strncmp(zMode,"count",n2)==0 ){
25250 p->mode = MODE_Count;
25251 }else if( cli_strncmp(zMode,"off",n2)==0 ){
25252 p->mode = MODE_Off;
25253 }else if( cli_strncmp(zMode,"json",n2)==0 ){
25254 p->mode = MODE_Json;
25255 }else{
25256 raw_printf(stderr, "Error: mode should be one of: "
25257 "ascii box column csv html insert json line list markdown "
25258 "qbox quote table tabs tcl\n");
25259 rc = 1;
25260 }
25261 p->cMode = p->mode;
25262 }else
25263
25264 #ifndef SQLITE_SHELL_FIDDLE
25265 if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
25266 if( nArg!=2 ){
25267 raw_printf(stderr, "Usage: .nonce NONCE\n");
25268 rc = 1;
25269 }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
25270 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
25271 p->lineno, azArg[1]);
25272 exit(1);
25273 }else{
25274 p->bSafeMode = 0;
25275 return 0; /* Return immediately to bypass the safe mode reset
25276 ** at the end of this procedure */
25277 }
25278 }else
25279 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
25280
25281 if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
25282 if( nArg==2 ){
25283 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
25284 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
25285 }else{
25286 raw_printf(stderr, "Usage: .nullvalue STRING\n");
25287 rc = 1;
25288 }
25289 }else
25290
25291 if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
25292 const char *zFN = 0; /* Pointer to constant filename */
25293 char *zNewFilename = 0; /* Name of the database file to open */
25294 int iName = 1; /* Index in azArg[] of the filename */
25295 int newFlag = 0; /* True to delete file before opening */
25296 int openMode = SHELL_OPEN_UNSPEC;
25297
25298 /* Check for command-line arguments */
25299 for(iName=1; iName<nArg; iName++){
25300 const char *z = azArg[iName];
25301 #ifndef SQLITE_SHELL_FIDDLE
25302 if( optionMatch(z,"new") ){
25303 newFlag = 1;
25304 #ifdef SQLITE_HAVE_ZLIB
25305 }else if( optionMatch(z, "zip") ){
25306 openMode = SHELL_OPEN_ZIPFILE;
25307 #endif
25308 }else if( optionMatch(z, "append") ){
25309 openMode = SHELL_OPEN_APPENDVFS;
25310 }else if( optionMatch(z, "readonly") ){
25311 openMode = SHELL_OPEN_READONLY;
25312 }else if( optionMatch(z, "nofollow") ){
25313 p->openFlags |= SQLITE_OPEN_NOFOLLOW;
25314 #ifndef SQLITE_OMIT_DESERIALIZE
25315 }else if( optionMatch(z, "deserialize") ){
25316 openMode = SHELL_OPEN_DESERIALIZE;
25317 }else if( optionMatch(z, "hexdb") ){
25318 openMode = SHELL_OPEN_HEXDB;
25319 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
25320 p->szMax = integerValue(azArg[++iName]);
25321 #endif /* SQLITE_OMIT_DESERIALIZE */
25322 }else
25323 #endif /* !SQLITE_SHELL_FIDDLE */
25324 if( z[0]=='-' ){
25325 utf8_printf(stderr, "unknown option: %s\n", z);
25326 rc = 1;
25327 goto meta_command_exit;
25328 }else if( zFN ){
25329 utf8_printf(stderr, "extra argument: \"%s\"\n", z);
25330 rc = 1;
25331 goto meta_command_exit;
25332 }else{
25333 zFN = z;
25334 }
25335 }
25336
25337 /* Close the existing database */
25338 session_close_all(p, -1);
25339 close_db(p->db);
25340 p->db = 0;
25341 p->pAuxDb->zDbFilename = 0;
25342 sqlite3_free(p->pAuxDb->zFreeOnClose);
25343 p->pAuxDb->zFreeOnClose = 0;
25344 p->openMode = openMode;
25345 p->openFlags = 0;
25346 p->szMax = 0;
25347
25348 /* If a filename is specified, try to open it first */
25349 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
25350 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
25351 #ifndef SQLITE_SHELL_FIDDLE
25352 if( p->bSafeMode
25353 && p->openMode!=SHELL_OPEN_HEXDB
25354 && zFN
25355 && cli_strcmp(zFN,":memory:")!=0
25356 ){
25357 failIfSafeMode(p, "cannot open disk-based database files in safe mode");
25358 }
25359 #else
25360 /* WASM mode has its own sandboxed pseudo-filesystem. */
25361 #endif
25362 if( zFN ){
25363 zNewFilename = sqlite3_mprintf("%s", zFN);
25364 shell_check_oom(zNewFilename);
25365 }else{
25366 zNewFilename = 0;
25367 }
25368 p->pAuxDb->zDbFilename = zNewFilename;
25369 open_db(p, OPEN_DB_KEEPALIVE);
25370 if( p->db==0 ){
25371 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
25372 sqlite3_free(zNewFilename);
25373 }else{
25374 p->pAuxDb->zFreeOnClose = zNewFilename;
25375 }
25376 }
25377 if( p->db==0 ){
25378 /* As a fall-back open a TEMP database */
25379 p->pAuxDb->zDbFilename = 0;
25380 open_db(p, 0);
25381 }
25382 }else
25383
25384 #ifndef SQLITE_SHELL_FIDDLE
25385 if( (c=='o'
25386 && (cli_strncmp(azArg[0], "output", n)==0
25387 || cli_strncmp(azArg[0], "once", n)==0))
25388 || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
25389 ){
25390 char *zFile = 0;
25391 int bTxtMode = 0;
25392 int i;
25393 int eMode = 0;
25394 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */
25395 unsigned char zBOM[4]; /* Byte-order mark to using if --bom is present */
25396
25397 zBOM[0] = 0;
25398 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
25399 if( c=='e' ){
25400 eMode = 'x';
25401 bOnce = 2;
25402 }else if( cli_strncmp(azArg[0],"once",n)==0 ){
25403 bOnce = 1;
25404 }
25405 for(i=1; i<nArg; i++){
25406 char *z = azArg[i];
25407 if( z[0]=='-' ){
25408 if( z[1]=='-' ) z++;
25409 if( cli_strcmp(z,"-bom")==0 ){
25410 zBOM[0] = 0xef;
25411 zBOM[1] = 0xbb;
25412 zBOM[2] = 0xbf;
25413 zBOM[3] = 0;
25414 }else if( c!='e' && cli_strcmp(z,"-x")==0 ){
25415 eMode = 'x'; /* spreadsheet */
25416 }else if( c!='e' && cli_strcmp(z,"-e")==0 ){
25417 eMode = 'e'; /* text editor */
25418 }else{
25419 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n",
25420 azArg[i]);
25421 showHelp(p->out, azArg[0]);
25422 rc = 1;
25423 goto meta_command_exit;
25424 }
25425 }else if( zFile==0 && eMode!='e' && eMode!='x' ){
25426 zFile = sqlite3_mprintf("%s", z);
25427 if( zFile && zFile[0]=='|' ){
25428 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
25429 break;
25430 }
25431 }else{
25432 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n",
25433 azArg[i]);
25434 showHelp(p->out, azArg[0]);
25435 rc = 1;
25436 sqlite3_free(zFile);
25437 goto meta_command_exit;
25438 }
25439 }
25440 if( zFile==0 ){
25441 zFile = sqlite3_mprintf("stdout");
25442 }
25443 if( bOnce ){
25444 p->outCount = 2;
25445 }else{
25446 p->outCount = 0;
25447 }
25448 output_reset(p);
25449 #ifndef SQLITE_NOHAVE_SYSTEM
25450 if( eMode=='e' || eMode=='x' ){
25451 p->doXdgOpen = 1;
25452 outputModePush(p);
25453 if( eMode=='x' ){
25454 /* spreadsheet mode. Output as CSV. */
25455 newTempFile(p, "csv");
25456 ShellClearFlag(p, SHFLG_Echo);
25457 p->mode = MODE_Csv;
25458 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
25459 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
25460 }else{
25461 /* text editor mode */
25462 newTempFile(p, "txt");
25463 bTxtMode = 1;
25464 }
25465 sqlite3_free(zFile);
25466 zFile = sqlite3_mprintf("%s", p->zTempFile);
25467 }
25468 #endif /* SQLITE_NOHAVE_SYSTEM */
25469 shell_check_oom(zFile);
25470 if( zFile[0]=='|' ){
25471 #ifdef SQLITE_OMIT_POPEN
25472 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
25473 rc = 1;
25474 p->out = stdout;
25475 #else
25476 p->out = popen(zFile + 1, "w");
25477 if( p->out==0 ){
25478 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
25479 p->out = stdout;
25480 rc = 1;
25481 }else{
25482 if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
25483 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
25484 }
25485 #endif
25486 }else{
25487 p->out = output_file_open(zFile, bTxtMode);
25488 if( p->out==0 ){
25489 if( cli_strcmp(zFile,"off")!=0 ){
25490 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
25491 }
25492 p->out = stdout;
25493 rc = 1;
25494 } else {
25495 if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
25496 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
25497 }
25498 }
25499 sqlite3_free(zFile);
25500 }else
25501 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
25502
25503 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
25504 open_db(p,0);
25505 if( nArg<=1 ) goto parameter_syntax_error;
25506
25507 /* .parameter clear
25508 ** Clear all bind parameters by dropping the TEMP table that holds them.
25509 */
25510 if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
25511 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
25512 0, 0, 0);
25513 }else
25514
25515 /* .parameter list
25516 ** List all bind parameters.
25517 */
25518 if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
25519 sqlite3_stmt *pStmt = 0;
25520 int rx;
25521 int len = 0;
25522 rx = sqlite3_prepare_v2(p->db,
25523 "SELECT max(length(key)) "
25524 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
25525 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
25526 len = sqlite3_column_int(pStmt, 0);
25527 if( len>40 ) len = 40;
25528 }
25529 sqlite3_finalize(pStmt);
25530 pStmt = 0;
25531 if( len ){
25532 rx = sqlite3_prepare_v2(p->db,
25533 "SELECT key, quote(value) "
25534 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
25535 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
25536 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
25537 sqlite3_column_text(pStmt,1));
25538 }
25539 sqlite3_finalize(pStmt);
25540 }
25541 }else
25542
25543 /* .parameter init
25544 ** Make sure the TEMP table used to hold bind parameters exists.
25545 ** Create it if necessary.
25546 */
25547 if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
25548 bind_table_init(p);
25549 }else
25550
25551 /* .parameter set NAME VALUE
25552 ** Set or reset a bind parameter. NAME should be the full parameter
25553 ** name exactly as it appears in the query. (ex: $abc, @def). The
25554 ** VALUE can be in either SQL literal notation, or if not it will be
25555 ** understood to be a text string.
25556 */
25557 if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
25558 int rx;
25559 char *zSql;
25560 sqlite3_stmt *pStmt;
25561 const char *zKey = azArg[2];
25562 const char *zValue = azArg[3];
25563 bind_table_init(p);
25564 zSql = sqlite3_mprintf(
25565 "REPLACE INTO temp.sqlite_parameters(key,value)"
25566 "VALUES(%Q,%s);", zKey, zValue);
25567 shell_check_oom(zSql);
25568 pStmt = 0;
25569 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25570 sqlite3_free(zSql);
25571 if( rx!=SQLITE_OK ){
25572 sqlite3_finalize(pStmt);
25573 pStmt = 0;
25574 zSql = sqlite3_mprintf(
25575 "REPLACE INTO temp.sqlite_parameters(key,value)"
25576 "VALUES(%Q,%Q);", zKey, zValue);
25577 shell_check_oom(zSql);
25578 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25579 sqlite3_free(zSql);
25580 if( rx!=SQLITE_OK ){
25581 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
25582 sqlite3_finalize(pStmt);
25583 pStmt = 0;
25584 rc = 1;
25585 }
25586 }
25587 sqlite3_step(pStmt);
25588 sqlite3_finalize(pStmt);
25589 }else
25590
25591 /* .parameter unset NAME
25592 ** Remove the NAME binding from the parameter binding table, if it
25593 ** exists.
25594 */
25595 if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
25596 char *zSql = sqlite3_mprintf(
25597 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
25598 shell_check_oom(zSql);
25599 sqlite3_exec(p->db, zSql, 0, 0, 0);
25600 sqlite3_free(zSql);
25601 }else
25602 /* If no command name matches, show a syntax error */
25603 parameter_syntax_error:
25604 showHelp(p->out, "parameter");
25605 }else
25606
25607 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
25608 int i;
25609 for(i=1; i<nArg; i++){
25610 if( i>1 ) raw_printf(p->out, " ");
25611 utf8_printf(p->out, "%s", azArg[i]);
25612 }
25613 raw_printf(p->out, "\n");
25614 }else
25615
25616 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
25617 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
25618 int i;
25619 int nn = 0;
25620 p->flgProgress = 0;
25621 p->mxProgress = 0;
25622 p->nProgress = 0;
25623 for(i=1; i<nArg; i++){
25624 const char *z = azArg[i];
25625 if( z[0]=='-' ){
25626 z++;
25627 if( z[0]=='-' ) z++;
25628 if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
25629 p->flgProgress |= SHELL_PROGRESS_QUIET;
25630 continue;
25631 }
25632 if( cli_strcmp(z,"reset")==0 ){
25633 p->flgProgress |= SHELL_PROGRESS_RESET;
25634 continue;
25635 }
25636 if( cli_strcmp(z,"once")==0 ){
25637 p->flgProgress |= SHELL_PROGRESS_ONCE;
25638 continue;
25639 }
25640 if( cli_strcmp(z,"limit")==0 ){
25641 if( i+1>=nArg ){
25642 utf8_printf(stderr, "Error: missing argument on --limit\n");
25643 rc = 1;
25644 goto meta_command_exit;
25645 }else{
25646 p->mxProgress = (int)integerValue(azArg[++i]);
25647 }
25648 continue;
25649 }
25650 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
25651 rc = 1;
25652 goto meta_command_exit;
25653 }else{
25654 nn = (int)integerValue(z);
25655 }
25656 }
25657 open_db(p, 0);
25658 sqlite3_progress_handler(p->db, nn, progress_handler, p);
25659 }else
25660 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
25661
25662 if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
25663 if( nArg >= 2) {
25664 shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
25665 }
25666 if( nArg >= 3) {
25667 shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
25668 }
25669 }else
25670
25671 #ifndef SQLITE_SHELL_FIDDLE
25672 if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
25673 rc = 2;
25674 }else
25675 #endif
25676
25677 #ifndef SQLITE_SHELL_FIDDLE
25678 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
25679 FILE *inSaved = p->in;
25680 int savedLineno = p->lineno;
25681 failIfSafeMode(p, "cannot run .read in safe mode");
25682 if( nArg!=2 ){
25683 raw_printf(stderr, "Usage: .read FILE\n");
25684 rc = 1;
25685 goto meta_command_exit;
25686 }
25687 if( azArg[1][0]=='|' ){
25688 #ifdef SQLITE_OMIT_POPEN
25689 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
25690 rc = 1;
25691 p->out = stdout;
25692 #else
25693 p->in = popen(azArg[1]+1, "r");
25694 if( p->in==0 ){
25695 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
25696 rc = 1;
25697 }else{
25698 rc = process_input(p);
25699 pclose(p->in);
25700 }
25701 #endif
25702 }else if( (p->in = openChrSource(azArg[1]))==0 ){
25703 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
25704 rc = 1;
25705 }else{
25706 rc = process_input(p);
25707 fclose(p->in);
25708 }
25709 p->in = inSaved;
25710 p->lineno = savedLineno;
25711 }else
25712 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
25713
25714 #ifndef SQLITE_SHELL_FIDDLE
25715 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
25716 const char *zSrcFile;
25717 const char *zDb;
25718 sqlite3 *pSrc;
25719 sqlite3_backup *pBackup;
25720 int nTimeout = 0;
25721
25722 failIfSafeMode(p, "cannot run .restore in safe mode");
25723 if( nArg==2 ){
25724 zSrcFile = azArg[1];
25725 zDb = "main";
25726 }else if( nArg==3 ){
25727 zSrcFile = azArg[2];
25728 zDb = azArg[1];
25729 }else{
25730 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
25731 rc = 1;
25732 goto meta_command_exit;
25733 }
25734 rc = sqlite3_open(zSrcFile, &pSrc);
25735 if( rc!=SQLITE_OK ){
25736 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
25737 close_db(pSrc);
25738 return 1;
25739 }
25740 open_db(p, 0);
25741 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
25742 if( pBackup==0 ){
25743 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
25744 close_db(pSrc);
25745 return 1;
25746 }
25747 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
25748 || rc==SQLITE_BUSY ){
25749 if( rc==SQLITE_BUSY ){
25750 if( nTimeout++ >= 3 ) break;
25751 sqlite3_sleep(100);
25752 }
25753 }
25754 sqlite3_backup_finish(pBackup);
25755 if( rc==SQLITE_DONE ){
25756 rc = 0;
25757 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
25758 raw_printf(stderr, "Error: source database is busy\n");
25759 rc = 1;
25760 }else{
25761 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
25762 rc = 1;
25763 }
25764 close_db(pSrc);
25765 }else
25766 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
25767
25768 if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){
25769 if( nArg==2 ){
25770 if( cli_strcmp(azArg[1], "vm")==0 ){
25771 p->scanstatsOn = 3;
25772 }else
25773 if( cli_strcmp(azArg[1], "est")==0 ){
25774 p->scanstatsOn = 2;
25775 }else{
25776 p->scanstatsOn = (u8)booleanValue(azArg[1]);
25777 }
25778 open_db(p, 0);
25779 sqlite3_db_config(
25780 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
25781 );
25782 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
25783 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
25784 #endif
25785 }else{
25786 raw_printf(stderr, "Usage: .scanstats on|off|est\n");
25787 rc = 1;
25788 }
25789 }else
25790
25791 if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
25792 ShellText sSelect;
25793 ShellState data;
25794 char *zErrMsg = 0;
25795 const char *zDiv = "(";
25796 const char *zName = 0;
25797 int iSchema = 0;
25798 int bDebug = 0;
25799 int bNoSystemTabs = 0;
25800 int ii;
25801
25802 open_db(p, 0);
25803 memcpy(&data, p, sizeof(data));
25804 data.showHeader = 0;
25805 data.cMode = data.mode = MODE_Semi;
25806 initText(&sSelect);
25807 for(ii=1; ii<nArg; ii++){
25808 if( optionMatch(azArg[ii],"indent") ){
25809 data.cMode = data.mode = MODE_Pretty;
25810 }else if( optionMatch(azArg[ii],"debug") ){
25811 bDebug = 1;
25812 }else if( optionMatch(azArg[ii],"nosys") ){
25813 bNoSystemTabs = 1;
25814 }else if( azArg[ii][0]=='-' ){
25815 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
25816 rc = 1;
25817 goto meta_command_exit;
25818 }else if( zName==0 ){
25819 zName = azArg[ii];
25820 }else{
25821 raw_printf(stderr,
25822 "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
25823 rc = 1;
25824 goto meta_command_exit;
25825 }
25826 }
25827 if( zName!=0 ){
25828 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
25829 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
25830 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
25831 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
25832 if( isSchema ){
25833 char *new_argv[2], *new_colv[2];
25834 new_argv[0] = sqlite3_mprintf(
25835 "CREATE TABLE %s (\n"
25836 " type text,\n"
25837 " name text,\n"
25838 " tbl_name text,\n"
25839 " rootpage integer,\n"
25840 " sql text\n"
25841 ")", zName);
25842 shell_check_oom(new_argv[0]);
25843 new_argv[1] = 0;
25844 new_colv[0] = "sql";
25845 new_colv[1] = 0;
25846 callback(&data, 1, new_argv, new_colv);
25847 sqlite3_free(new_argv[0]);
25848 }
25849 }
25850 if( zDiv ){
25851 sqlite3_stmt *pStmt = 0;
25852 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
25853 -1, &pStmt, 0);
25854 if( rc ){
25855 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
25856 sqlite3_finalize(pStmt);
25857 rc = 1;
25858 goto meta_command_exit;
25859 }
25860 appendText(&sSelect, "SELECT sql FROM", 0);
25861 iSchema = 0;
25862 while( sqlite3_step(pStmt)==SQLITE_ROW ){
25863 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
25864 char zScNum[30];
25865 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
25866 appendText(&sSelect, zDiv, 0);
25867 zDiv = " UNION ALL ";
25868 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
25869 if( sqlite3_stricmp(zDb, "main")!=0 ){
25870 appendText(&sSelect, zDb, '\'');
25871 }else{
25872 appendText(&sSelect, "NULL", 0);
25873 }
25874 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
25875 appendText(&sSelect, zScNum, 0);
25876 appendText(&sSelect, " AS snum, ", 0);
25877 appendText(&sSelect, zDb, '\'');
25878 appendText(&sSelect, " AS sname FROM ", 0);
25879 appendText(&sSelect, zDb, quoteChar(zDb));
25880 appendText(&sSelect, ".sqlite_schema", 0);
25881 }
25882 sqlite3_finalize(pStmt);
25883 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
25884 if( zName ){
25885 appendText(&sSelect,
25886 " UNION ALL SELECT shell_module_schema(name),"
25887 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
25888 0);
25889 }
25890 #endif
25891 appendText(&sSelect, ") WHERE ", 0);
25892 if( zName ){
25893 char *zQarg = sqlite3_mprintf("%Q", zName);
25894 int bGlob;
25895 shell_check_oom(zQarg);
25896 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
25897 strchr(zName, '[') != 0;
25898 if( strchr(zName, '.') ){
25899 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
25900 }else{
25901 appendText(&sSelect, "lower(tbl_name)", 0);
25902 }
25903 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
25904 appendText(&sSelect, zQarg, 0);
25905 if( !bGlob ){
25906 appendText(&sSelect, " ESCAPE '\\' ", 0);
25907 }
25908 appendText(&sSelect, " AND ", 0);
25909 sqlite3_free(zQarg);
25910 }
25911 if( bNoSystemTabs ){
25912 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
25913 }
25914 appendText(&sSelect, "sql IS NOT NULL"
25915 " ORDER BY snum, rowid", 0);
25916 if( bDebug ){
25917 utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
25918 }else{
25919 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
25920 }
25921 freeText(&sSelect);
25922 }
25923 if( zErrMsg ){
25924 utf8_printf(stderr,"Error: %s\n", zErrMsg);
25925 sqlite3_free(zErrMsg);
25926 rc = 1;
25927 }else if( rc != SQLITE_OK ){
25928 raw_printf(stderr,"Error: querying schema information\n");
25929 rc = 1;
25930 }else{
25931 rc = 0;
25932 }
25933 }else
25934
25935 if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
25936 || (c=='t' && n==9 && cli_strncmp(azArg[0], "treetrace", n)==0)
25937 ){
25938 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
25939 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
25940 }else
25941
25942 #if defined(SQLITE_ENABLE_SESSION)
25943 if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
25944 struct AuxDb *pAuxDb = p->pAuxDb;
25945 OpenSession *pSession = &pAuxDb->aSession[0];
25946 char **azCmd = &azArg[1];
25947 int iSes = 0;
25948 int nCmd = nArg - 1;
25949 int i;
25950 if( nArg<=1 ) goto session_syntax_error;
25951 open_db(p, 0);
25952 if( nArg>=3 ){
25953 for(iSes=0; iSes<pAuxDb->nSession; iSes++){
25954 if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
25955 }
25956 if( iSes<pAuxDb->nSession ){
25957 pSession = &pAuxDb->aSession[iSes];
25958 azCmd++;
25959 nCmd--;
25960 }else{
25961 pSession = &pAuxDb->aSession[0];
25962 iSes = 0;
25963 }
25964 }
25965
25966 /* .session attach TABLE
25967 ** Invoke the sqlite3session_attach() interface to attach a particular
25968 ** table so that it is never filtered.
25969 */
25970 if( cli_strcmp(azCmd[0],"attach")==0 ){
25971 if( nCmd!=2 ) goto session_syntax_error;
25972 if( pSession->p==0 ){
25973 session_not_open:
25974 raw_printf(stderr, "ERROR: No sessions are open\n");
25975 }else{
25976 rc = sqlite3session_attach(pSession->p, azCmd[1]);
25977 if( rc ){
25978 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
25979 rc = 0;
25980 }
25981 }
25982 }else
25983
25984 /* .session changeset FILE
25985 ** .session patchset FILE
25986 ** Write a changeset or patchset into a file. The file is overwritten.
25987 */
25988 if( cli_strcmp(azCmd[0],"changeset")==0
25989 || cli_strcmp(azCmd[0],"patchset")==0
25990 ){
25991 FILE *out = 0;
25992 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
25993 if( nCmd!=2 ) goto session_syntax_error;
25994 if( pSession->p==0 ) goto session_not_open;
25995 out = fopen(azCmd[1], "wb");
25996 if( out==0 ){
25997 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
25998 azCmd[1]);
25999 }else{
26000 int szChng;
26001 void *pChng;
26002 if( azCmd[0][0]=='c' ){
26003 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
26004 }else{
26005 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
26006 }
26007 if( rc ){
26008 printf("Error: error code %d\n", rc);
26009 rc = 0;
26010 }
26011 if( pChng
26012 && fwrite(pChng, szChng, 1, out)!=1 ){
26013 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
26014 szChng);
26015 }
26016 sqlite3_free(pChng);
26017 fclose(out);
26018 }
26019 }else
26020
26021 /* .session close
26022 ** Close the identified session
26023 */
26024 if( cli_strcmp(azCmd[0], "close")==0 ){
26025 if( nCmd!=1 ) goto session_syntax_error;
26026 if( pAuxDb->nSession ){
26027 session_close(pSession);
26028 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
26029 }
26030 }else
26031
26032 /* .session enable ?BOOLEAN?
26033 ** Query or set the enable flag
26034 */
26035 if( cli_strcmp(azCmd[0], "enable")==0 ){
26036 int ii;
26037 if( nCmd>2 ) goto session_syntax_error;
26038 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
26039 if( pAuxDb->nSession ){
26040 ii = sqlite3session_enable(pSession->p, ii);
26041 utf8_printf(p->out, "session %s enable flag = %d\n",
26042 pSession->zName, ii);
26043 }
26044 }else
26045
26046 /* .session filter GLOB ....
26047 ** Set a list of GLOB patterns of table names to be excluded.
26048 */
26049 if( cli_strcmp(azCmd[0], "filter")==0 ){
26050 int ii, nByte;
26051 if( nCmd<2 ) goto session_syntax_error;
26052 if( pAuxDb->nSession ){
26053 for(ii=0; ii<pSession->nFilter; ii++){
26054 sqlite3_free(pSession->azFilter[ii]);
26055 }
26056 sqlite3_free(pSession->azFilter);
26057 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
26058 pSession->azFilter = sqlite3_malloc( nByte );
26059 if( pSession->azFilter==0 ){
26060 raw_printf(stderr, "Error: out or memory\n");
26061 exit(1);
26062 }
26063 for(ii=1; ii<nCmd; ii++){
26064 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
26065 shell_check_oom(x);
26066 }
26067 pSession->nFilter = ii-1;
26068 }
26069 }else
26070
26071 /* .session indirect ?BOOLEAN?
26072 ** Query or set the indirect flag
26073 */
26074 if( cli_strcmp(azCmd[0], "indirect")==0 ){
26075 int ii;
26076 if( nCmd>2 ) goto session_syntax_error;
26077 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
26078 if( pAuxDb->nSession ){
26079 ii = sqlite3session_indirect(pSession->p, ii);
26080 utf8_printf(p->out, "session %s indirect flag = %d\n",
26081 pSession->zName, ii);
26082 }
26083 }else
26084
26085 /* .session isempty
26086 ** Determine if the session is empty
26087 */
26088 if( cli_strcmp(azCmd[0], "isempty")==0 ){
26089 int ii;
26090 if( nCmd!=1 ) goto session_syntax_error;
26091 if( pAuxDb->nSession ){
26092 ii = sqlite3session_isempty(pSession->p);
26093 utf8_printf(p->out, "session %s isempty flag = %d\n",
26094 pSession->zName, ii);
26095 }
26096 }else
26097
26098 /* .session list
26099 ** List all currently open sessions
26100 */
26101 if( cli_strcmp(azCmd[0],"list")==0 ){
26102 for(i=0; i<pAuxDb->nSession; i++){
26103 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
26104 }
26105 }else
26106
26107 /* .session open DB NAME
26108 ** Open a new session called NAME on the attached database DB.
26109 ** DB is normally "main".
26110 */
26111 if( cli_strcmp(azCmd[0],"open")==0 ){
26112 char *zName;
26113 if( nCmd!=3 ) goto session_syntax_error;
26114 zName = azCmd[2];
26115 if( zName[0]==0 ) goto session_syntax_error;
26116 for(i=0; i<pAuxDb->nSession; i++){
26117 if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
26118 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
26119 goto meta_command_exit;
26120 }
26121 }
26122 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
26123 raw_printf(stderr,
26124 "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
26125 goto meta_command_exit;
26126 }
26127 pSession = &pAuxDb->aSession[pAuxDb->nSession];
26128 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
26129 if( rc ){
26130 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
26131 rc = 0;
26132 goto meta_command_exit;
26133 }
26134 pSession->nFilter = 0;
26135 sqlite3session_table_filter(pSession->p, session_filter, pSession);
26136 pAuxDb->nSession++;
26137 pSession->zName = sqlite3_mprintf("%s", zName);
26138 shell_check_oom(pSession->zName);
26139 }else
26140 /* If no command name matches, show a syntax error */
26141 session_syntax_error:
26142 showHelp(p->out, "session");
26143 }else
26144 #endif
26145
26146 #ifdef SQLITE_DEBUG
26147 /* Undocumented commands for internal testing. Subject to change
26148 ** without notice. */
26149 if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
26150 if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
26151 int i, v;
26152 for(i=1; i<nArg; i++){
26153 v = booleanValue(azArg[i]);
26154 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
26155 }
26156 }
26157 if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
26158 int i; sqlite3_int64 v;
26159 for(i=1; i<nArg; i++){
26160 char zBuf[200];
26161 v = integerValue(azArg[i]);
26162 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
26163 utf8_printf(p->out, "%s", zBuf);
26164 }
26165 }
26166 }else
26167 #endif
26168
26169 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
26170 int bIsInit = 0; /* True to initialize the SELFTEST table */
26171 int bVerbose = 0; /* Verbose output */
26172 int bSelftestExists; /* True if SELFTEST already exists */
26173 int i, k; /* Loop counters */
26174 int nTest = 0; /* Number of tests runs */
26175 int nErr = 0; /* Number of errors seen */
26176 ShellText str; /* Answer for a query */
26177 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
26178
26179 open_db(p,0);
26180 for(i=1; i<nArg; i++){
26181 const char *z = azArg[i];
26182 if( z[0]=='-' && z[1]=='-' ) z++;
26183 if( cli_strcmp(z,"-init")==0 ){
26184 bIsInit = 1;
26185 }else
26186 if( cli_strcmp(z,"-v")==0 ){
26187 bVerbose++;
26188 }else
26189 {
26190 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
26191 azArg[i], azArg[0]);
26192 raw_printf(stderr, "Should be one of: --init -v\n");
26193 rc = 1;
26194 goto meta_command_exit;
26195 }
26196 }
26197 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
26198 != SQLITE_OK ){
26199 bSelftestExists = 0;
26200 }else{
26201 bSelftestExists = 1;
26202 }
26203 if( bIsInit ){
26204 createSelftestTable(p);
26205 bSelftestExists = 1;
26206 }
26207 initText(&str);
26208 appendText(&str, "x", 0);
26209 for(k=bSelftestExists; k>=0; k--){
26210 if( k==1 ){
26211 rc = sqlite3_prepare_v2(p->db,
26212 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
26213 -1, &pStmt, 0);
26214 }else{
26215 rc = sqlite3_prepare_v2(p->db,
26216 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
26217 " (1,'run','PRAGMA integrity_check','ok')",
26218 -1, &pStmt, 0);
26219 }
26220 if( rc ){
26221 raw_printf(stderr, "Error querying the selftest table\n");
26222 rc = 1;
26223 sqlite3_finalize(pStmt);
26224 goto meta_command_exit;
26225 }
26226 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
26227 int tno = sqlite3_column_int(pStmt, 0);
26228 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
26229 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
26230 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
26231
26232 if( zOp==0 ) continue;
26233 if( zSql==0 ) continue;
26234 if( zAns==0 ) continue;
26235 k = 0;
26236 if( bVerbose>0 ){
26237 printf("%d: %s %s\n", tno, zOp, zSql);
26238 }
26239 if( cli_strcmp(zOp,"memo")==0 ){
26240 utf8_printf(p->out, "%s\n", zSql);
26241 }else
26242 if( cli_strcmp(zOp,"run")==0 ){
26243 char *zErrMsg = 0;
26244 str.n = 0;
26245 str.z[0] = 0;
26246 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
26247 nTest++;
26248 if( bVerbose ){
26249 utf8_printf(p->out, "Result: %s\n", str.z);
26250 }
26251 if( rc || zErrMsg ){
26252 nErr++;
26253 rc = 1;
26254 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
26255 sqlite3_free(zErrMsg);
26256 }else if( cli_strcmp(zAns,str.z)!=0 ){
26257 nErr++;
26258 rc = 1;
26259 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
26260 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
26261 }
26262 }else
26263 {
26264 utf8_printf(stderr,
26265 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
26266 rc = 1;
26267 break;
26268 }
26269 } /* End loop over rows of content from SELFTEST */
26270 sqlite3_finalize(pStmt);
26271 } /* End loop over k */
26272 freeText(&str);
26273 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
26274 }else
26275
26276 if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
26277 if( nArg<2 || nArg>3 ){
26278 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
26279 rc = 1;
26280 }
26281 if( nArg>=2 ){
26282 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
26283 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
26284 }
26285 if( nArg>=3 ){
26286 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
26287 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
26288 }
26289 }else
26290
26291 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
26292 const char *zLike = 0; /* Which table to checksum. 0 means everything */
26293 int i; /* Loop counter */
26294 int bSchema = 0; /* Also hash the schema */
26295 int bSeparate = 0; /* Hash each table separately */
26296 int iSize = 224; /* Hash algorithm to use */
26297 int bDebug = 0; /* Only show the query that would have run */
26298 sqlite3_stmt *pStmt; /* For querying tables names */
26299 char *zSql; /* SQL to be run */
26300 char *zSep; /* Separator */
26301 ShellText sSql; /* Complete SQL for the query to run the hash */
26302 ShellText sQuery; /* Set of queries used to read all content */
26303 open_db(p, 0);
26304 for(i=1; i<nArg; i++){
26305 const char *z = azArg[i];
26306 if( z[0]=='-' ){
26307 z++;
26308 if( z[0]=='-' ) z++;
26309 if( cli_strcmp(z,"schema")==0 ){
26310 bSchema = 1;
26311 }else
26312 if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
26313 || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
26314 ){
26315 iSize = atoi(&z[5]);
26316 }else
26317 if( cli_strcmp(z,"debug")==0 ){
26318 bDebug = 1;
26319 }else
26320 {
26321 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
26322 azArg[i], azArg[0]);
26323 showHelp(p->out, azArg[0]);
26324 rc = 1;
26325 goto meta_command_exit;
26326 }
26327 }else if( zLike ){
26328 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
26329 rc = 1;
26330 goto meta_command_exit;
26331 }else{
26332 zLike = z;
26333 bSeparate = 1;
26334 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
26335 }
26336 }
26337 if( bSchema ){
26338 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
26339 " WHERE type='table' AND coalesce(rootpage,0)>1"
26340 " UNION ALL SELECT 'sqlite_schema'"
26341 " ORDER BY 1 collate nocase";
26342 }else{
26343 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
26344 " WHERE type='table' AND coalesce(rootpage,0)>1"
26345 " AND name NOT LIKE 'sqlite_%'"
26346 " ORDER BY 1 collate nocase";
26347 }
26348 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
26349 initText(&sQuery);
26350 initText(&sSql);
26351 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
26352 zSep = "VALUES(";
26353 while( SQLITE_ROW==sqlite3_step(pStmt) ){
26354 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
26355 if( zTab==0 ) continue;
26356 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
26357 if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
26358 appendText(&sQuery,"SELECT * FROM ", 0);
26359 appendText(&sQuery,zTab,'"');
26360 appendText(&sQuery," NOT INDEXED;", 0);
26361 }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
26362 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
26363 " ORDER BY name;", 0);
26364 }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
26365 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
26366 " ORDER BY name;", 0);
26367 }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
26368 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
26369 " ORDER BY tbl,idx;", 0);
26370 }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
26371 appendText(&sQuery, "SELECT * FROM ", 0);
26372 appendText(&sQuery, zTab, 0);
26373 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
26374 }
26375 appendText(&sSql, zSep, 0);
26376 appendText(&sSql, sQuery.z, '\'');
26377 sQuery.n = 0;
26378 appendText(&sSql, ",", 0);
26379 appendText(&sSql, zTab, '\'');
26380 zSep = "),(";
26381 }
26382 sqlite3_finalize(pStmt);
26383 if( bSeparate ){
26384 zSql = sqlite3_mprintf(
26385 "%s))"
26386 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
26387 " FROM [sha3sum$query]",
26388 sSql.z, iSize);
26389 }else{
26390 zSql = sqlite3_mprintf(
26391 "%s))"
26392 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
26393 " FROM [sha3sum$query]",
26394 sSql.z, iSize);
26395 }
26396 shell_check_oom(zSql);
26397 freeText(&sQuery);
26398 freeText(&sSql);
26399 if( bDebug ){
26400 utf8_printf(p->out, "%s\n", zSql);
26401 }else{
26402 shell_exec(p, zSql, 0);
26403 }
26404 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
26405 {
26406 int lrc;
26407 char *zRevText = /* Query for reversible to-blob-to-text check */
26408 "SELECT lower(name) as tname FROM sqlite_schema\n"
26409 "WHERE type='table' AND coalesce(rootpage,0)>1\n"
26410 "AND name NOT LIKE 'sqlite_%%'%s\n"
26411 "ORDER BY 1 collate nocase";
26412 zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
26413 zRevText = sqlite3_mprintf(
26414 /* lower-case query is first run, producing upper-case query. */
26415 "with tabcols as materialized(\n"
26416 "select tname, cname\n"
26417 "from ("
26418 " select printf('\"%%w\"',ss.tname) as tname,"
26419 " printf('\"%%w\"',ti.name) as cname\n"
26420 " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
26421 "select 'SELECT total(bad_text_count) AS bad_text_count\n"
26422 "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
26423 " from (select 'SELECT COUNT(*) AS bad_text_count\n"
26424 "FROM '||tname||' WHERE '\n"
26425 "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
26426 "|| ' AND typeof('||cname||')=''text'' ',\n"
26427 "' OR ') as query, tname from tabcols group by tname)"
26428 , zRevText);
26429 shell_check_oom(zRevText);
26430 if( bDebug ) utf8_printf(p->out, "%s\n", zRevText);
26431 lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
26432 if( lrc!=SQLITE_OK ){
26433 /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
26434 ** user does cruel and unnatural things like ".limit expr_depth 0". */
26435 rc = 1;
26436 }else{
26437 if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
26438 lrc = SQLITE_ROW==sqlite3_step(pStmt);
26439 if( lrc ){
26440 const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
26441 sqlite3_stmt *pCheckStmt;
26442 lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
26443 if( bDebug ) utf8_printf(p->out, "%s\n", zGenQuery);
26444 if( lrc!=SQLITE_OK ){
26445 rc = 1;
26446 }else{
26447 if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
26448 double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
26449 if( countIrreversible>0 ){
26450 int sz = (int)(countIrreversible + 0.5);
26451 utf8_printf(stderr,
26452 "Digest includes %d invalidly encoded text field%s.\n",
26453 sz, (sz>1)? "s": "");
26454 }
26455 }
26456 sqlite3_finalize(pCheckStmt);
26457 }
26458 sqlite3_finalize(pStmt);
26459 }
26460 }
26461 if( rc ) utf8_printf(stderr, ".sha3sum failed.\n");
26462 sqlite3_free(zRevText);
26463 }
26464 #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
26465 sqlite3_free(zSql);
26466 }else
26467
26468 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
26469 if( c=='s'
26470 && (cli_strncmp(azArg[0], "shell", n)==0
26471 || cli_strncmp(azArg[0],"system",n)==0)
26472 ){
26473 char *zCmd;
26474 int i, x;
26475 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
26476 if( nArg<2 ){
26477 raw_printf(stderr, "Usage: .system COMMAND\n");
26478 rc = 1;
26479 goto meta_command_exit;
26480 }
26481 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
26482 for(i=2; i<nArg && zCmd!=0; i++){
26483 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
26484 zCmd, azArg[i]);
26485 }
26486 x = zCmd!=0 ? system(zCmd) : 1;
26487 sqlite3_free(zCmd);
26488 if( x ) raw_printf(stderr, "System command returns %d\n", x);
26489 }else
26490 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
26491
26492 if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
26493 static const char *azBool[] = { "off", "on", "trigger", "full"};
26494 const char *zOut;
26495 int i;
26496 if( nArg!=1 ){
26497 raw_printf(stderr, "Usage: .show\n");
26498 rc = 1;
26499 goto meta_command_exit;
26500 }
26501 utf8_printf(p->out, "%12.12s: %s\n","echo",
26502 azBool[ShellHasFlag(p, SHFLG_Echo)]);
26503 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
26504 utf8_printf(p->out, "%12.12s: %s\n","explain",
26505 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
26506 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
26507 if( p->mode==MODE_Column
26508 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
26509 ){
26510 utf8_printf
26511 (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
26512 modeDescr[p->mode], p->cmOpts.iWrap,
26513 p->cmOpts.bWordWrap ? "on" : "off",
26514 p->cmOpts.bQuote ? "" : "no");
26515 }else{
26516 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
26517 }
26518 utf8_printf(p->out, "%12.12s: ", "nullvalue");
26519 output_c_string(p->out, p->nullValue);
26520 raw_printf(p->out, "\n");
26521 utf8_printf(p->out,"%12.12s: %s\n","output",
26522 strlen30(p->outfile) ? p->outfile : "stdout");
26523 utf8_printf(p->out,"%12.12s: ", "colseparator");
26524 output_c_string(p->out, p->colSeparator);
26525 raw_printf(p->out, "\n");
26526 utf8_printf(p->out,"%12.12s: ", "rowseparator");
26527 output_c_string(p->out, p->rowSeparator);
26528 raw_printf(p->out, "\n");
26529 switch( p->statsOn ){
26530 case 0: zOut = "off"; break;
26531 default: zOut = "on"; break;
26532 case 2: zOut = "stmt"; break;
26533 case 3: zOut = "vmstep"; break;
26534 }
26535 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
26536 utf8_printf(p->out, "%12.12s: ", "width");
26537 for (i=0;i<p->nWidth;i++) {
26538 raw_printf(p->out, "%d ", p->colWidth[i]);
26539 }
26540 raw_printf(p->out, "\n");
26541 utf8_printf(p->out, "%12.12s: %s\n", "filename",
26542 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
26543 }else
26544
26545 if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
26546 if( nArg==2 ){
26547 if( cli_strcmp(azArg[1],"stmt")==0 ){
26548 p->statsOn = 2;
26549 }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
26550 p->statsOn = 3;
26551 }else{
26552 p->statsOn = (u8)booleanValue(azArg[1]);
26553 }
26554 }else if( nArg==1 ){
26555 display_stats(p->db, p, 0);
26556 }else{
26557 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
26558 rc = 1;
26559 }
26560 }else
26561
26562 if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
26563 || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
26564 || cli_strncmp(azArg[0], "indexes", n)==0) )
26565 ){
26566 sqlite3_stmt *pStmt;
26567 char **azResult;
26568 int nRow, nAlloc;
26569 int ii;
26570 ShellText s;
26571 initText(&s);
26572 open_db(p, 0);
26573 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
26574 if( rc ){
26575 sqlite3_finalize(pStmt);
26576 return shellDatabaseError(p->db);
26577 }
26578
26579 if( nArg>2 && c=='i' ){
26580 /* It is an historical accident that the .indexes command shows an error
26581 ** when called with the wrong number of arguments whereas the .tables
26582 ** command does not. */
26583 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
26584 rc = 1;
26585 sqlite3_finalize(pStmt);
26586 goto meta_command_exit;
26587 }
26588 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
26589 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
26590 if( zDbName==0 ) continue;
26591 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
26592 if( sqlite3_stricmp(zDbName, "main")==0 ){
26593 appendText(&s, "SELECT name FROM ", 0);
26594 }else{
26595 appendText(&s, "SELECT ", 0);
26596 appendText(&s, zDbName, '\'');
26597 appendText(&s, "||'.'||name FROM ", 0);
26598 }
26599 appendText(&s, zDbName, '"');
26600 appendText(&s, ".sqlite_schema ", 0);
26601 if( c=='t' ){
26602 appendText(&s," WHERE type IN ('table','view')"
26603 " AND name NOT LIKE 'sqlite_%'"
26604 " AND name LIKE ?1", 0);
26605 }else{
26606 appendText(&s," WHERE type='index'"
26607 " AND tbl_name LIKE ?1", 0);
26608 }
26609 }
26610 rc = sqlite3_finalize(pStmt);
26611 if( rc==SQLITE_OK ){
26612 appendText(&s, " ORDER BY 1", 0);
26613 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
26614 }
26615 freeText(&s);
26616 if( rc ) return shellDatabaseError(p->db);
26617
26618 /* Run the SQL statement prepared by the above block. Store the results
26619 ** as an array of nul-terminated strings in azResult[]. */
26620 nRow = nAlloc = 0;
26621 azResult = 0;
26622 if( nArg>1 ){
26623 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
26624 }else{
26625 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
26626 }
26627 while( sqlite3_step(pStmt)==SQLITE_ROW ){
26628 if( nRow>=nAlloc ){
26629 char **azNew;
26630 int n2 = nAlloc*2 + 10;
26631 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
26632 shell_check_oom(azNew);
26633 nAlloc = n2;
26634 azResult = azNew;
26635 }
26636 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
26637 shell_check_oom(azResult[nRow]);
26638 nRow++;
26639 }
26640 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
26641 rc = shellDatabaseError(p->db);
26642 }
26643
26644 /* Pretty-print the contents of array azResult[] to the output */
26645 if( rc==0 && nRow>0 ){
26646 int len, maxlen = 0;
26647 int i, j;
26648 int nPrintCol, nPrintRow;
26649 for(i=0; i<nRow; i++){
26650 len = strlen30(azResult[i]);
26651 if( len>maxlen ) maxlen = len;
26652 }
26653 nPrintCol = 80/(maxlen+2);
26654 if( nPrintCol<1 ) nPrintCol = 1;
26655 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
26656 for(i=0; i<nPrintRow; i++){
26657 for(j=i; j<nRow; j+=nPrintRow){
26658 char *zSp = j<nPrintRow ? "" : " ";
26659 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
26660 azResult[j] ? azResult[j]:"");
26661 }
26662 raw_printf(p->out, "\n");
26663 }
26664 }
26665
26666 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
26667 sqlite3_free(azResult);
26668 }else
26669
26670 #ifndef SQLITE_SHELL_FIDDLE
26671 /* Begin redirecting output to the file "testcase-out.txt" */
26672 if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
26673 output_reset(p);
26674 p->out = output_file_open("testcase-out.txt", 0);
26675 if( p->out==0 ){
26676 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
26677 }
26678 if( nArg>=2 ){
26679 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
26680 }else{
26681 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
26682 }
26683 }else
26684 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26685
26686 #ifndef SQLITE_UNTESTABLE
26687 if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
26688 static const struct {
26689 const char *zCtrlName; /* Name of a test-control option */
26690 int ctrlCode; /* Integer code for that option */
26691 int unSafe; /* Not valid unless --unsafe-testing */
26692 const char *zUsage; /* Usage notes */
26693 } aCtrl[] = {
26694 {"always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" },
26695 {"assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" },
26696 /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/
26697 /*{"bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/
26698 {"byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" },
26699 {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" },
26700 /*{"fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/
26701 {"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
26702 {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
26703 {"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
26704 {"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
26705 {"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" },
26706 #ifdef YYCOVERAGE
26707 {"parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" },
26708 #endif
26709 {"pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " },
26710 {"prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" },
26711 {"prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" },
26712 {"prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" },
26713 {"seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" },
26714 {"sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" },
26715 {"tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" },
26716 {"uselongdouble", SQLITE_TESTCTRL_USELONGDOUBLE,0,"?BOOLEAN|\"default\"?"},
26717 };
26718 int testctrl = -1;
26719 int iCtrl = -1;
26720 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
26721 int isOk = 0;
26722 int i, n2;
26723 const char *zCmd = 0;
26724
26725 open_db(p, 0);
26726 zCmd = nArg>=2 ? azArg[1] : "help";
26727
26728 /* The argument can optionally begin with "-" or "--" */
26729 if( zCmd[0]=='-' && zCmd[1] ){
26730 zCmd++;
26731 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
26732 }
26733
26734 /* --help lists all test-controls */
26735 if( cli_strcmp(zCmd,"help")==0 ){
26736 utf8_printf(p->out, "Available test-controls:\n");
26737 for(i=0; i<ArraySize(aCtrl); i++){
26738 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
26739 utf8_printf(p->out, " .testctrl %s %s\n",
26740 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
26741 }
26742 rc = 1;
26743 goto meta_command_exit;
26744 }
26745
26746 /* convert testctrl text option to value. allow any unique prefix
26747 ** of the option name, or a numerical value. */
26748 n2 = strlen30(zCmd);
26749 for(i=0; i<ArraySize(aCtrl); i++){
26750 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
26751 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
26752 if( testctrl<0 ){
26753 testctrl = aCtrl[i].ctrlCode;
26754 iCtrl = i;
26755 }else{
26756 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
26757 "Use \".testctrl --help\" for help\n", zCmd);
26758 rc = 1;
26759 goto meta_command_exit;
26760 }
26761 }
26762 }
26763 if( testctrl<0 ){
26764 utf8_printf(stderr,"Error: unknown test-control: %s\n"
26765 "Use \".testctrl --help\" for help\n", zCmd);
26766 }else{
26767 switch(testctrl){
26768
26769 /* sqlite3_test_control(int, db, int) */
26770 case SQLITE_TESTCTRL_OPTIMIZATIONS:
26771 if( nArg==3 ){
26772 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
26773 rc2 = sqlite3_test_control(testctrl, p->db, opt);
26774 isOk = 3;
26775 }
26776 break;
26777
26778 /* sqlite3_test_control(int) */
26779 case SQLITE_TESTCTRL_PRNG_SAVE:
26780 case SQLITE_TESTCTRL_PRNG_RESTORE:
26781 case SQLITE_TESTCTRL_BYTEORDER:
26782 if( nArg==2 ){
26783 rc2 = sqlite3_test_control(testctrl);
26784 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
26785 }
26786 break;
26787
26788 /* sqlite3_test_control(int, uint) */
26789 case SQLITE_TESTCTRL_PENDING_BYTE:
26790 if( nArg==3 ){
26791 unsigned int opt = (unsigned int)integerValue(azArg[2]);
26792 rc2 = sqlite3_test_control(testctrl, opt);
26793 isOk = 3;
26794 }
26795 break;
26796
26797 /* sqlite3_test_control(int, int, sqlite3*) */
26798 case SQLITE_TESTCTRL_PRNG_SEED:
26799 if( nArg==3 || nArg==4 ){
26800 int ii = (int)integerValue(azArg[2]);
26801 sqlite3 *db;
26802 if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
26803 sqlite3_randomness(sizeof(ii),&ii);
26804 printf("-- random seed: %d\n", ii);
26805 }
26806 if( nArg==3 ){
26807 db = 0;
26808 }else{
26809 db = p->db;
26810 /* Make sure the schema has been loaded */
26811 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
26812 }
26813 rc2 = sqlite3_test_control(testctrl, ii, db);
26814 isOk = 3;
26815 }
26816 break;
26817
26818 /* sqlite3_test_control(int, int) */
26819 case SQLITE_TESTCTRL_ASSERT:
26820 case SQLITE_TESTCTRL_ALWAYS:
26821 if( nArg==3 ){
26822 int opt = booleanValue(azArg[2]);
26823 rc2 = sqlite3_test_control(testctrl, opt);
26824 isOk = 1;
26825 }
26826 break;
26827
26828 /* sqlite3_test_control(int, int) */
26829 case SQLITE_TESTCTRL_LOCALTIME_FAULT:
26830 case SQLITE_TESTCTRL_NEVER_CORRUPT:
26831 if( nArg==3 ){
26832 int opt = booleanValue(azArg[2]);
26833 rc2 = sqlite3_test_control(testctrl, opt);
26834 isOk = 3;
26835 }
26836 break;
26837
26838 /* sqlite3_test_control(int, int) */
26839 case SQLITE_TESTCTRL_USELONGDOUBLE: {
26840 int opt = -1;
26841 if( nArg==3 ){
26842 if( cli_strcmp(azArg[2],"default")==0 ){
26843 opt = 2;
26844 }else{
26845 opt = booleanValue(azArg[2]);
26846 }
26847 }
26848 rc2 = sqlite3_test_control(testctrl, opt);
26849 isOk = 1;
26850 break;
26851 }
26852
26853 /* sqlite3_test_control(sqlite3*) */
26854 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
26855 rc2 = sqlite3_test_control(testctrl, p->db);
26856 isOk = 3;
26857 break;
26858
26859 case SQLITE_TESTCTRL_IMPOSTER:
26860 if( nArg==5 ){
26861 rc2 = sqlite3_test_control(testctrl, p->db,
26862 azArg[2],
26863 integerValue(azArg[3]),
26864 integerValue(azArg[4]));
26865 isOk = 3;
26866 }
26867 break;
26868
26869 case SQLITE_TESTCTRL_SEEK_COUNT: {
26870 u64 x = 0;
26871 rc2 = sqlite3_test_control(testctrl, p->db, &x);
26872 utf8_printf(p->out, "%llu\n", x);
26873 isOk = 3;
26874 break;
26875 }
26876
26877 #ifdef YYCOVERAGE
26878 case SQLITE_TESTCTRL_PARSER_COVERAGE: {
26879 if( nArg==2 ){
26880 sqlite3_test_control(testctrl, p->out);
26881 isOk = 3;
26882 }
26883 break;
26884 }
26885 #endif
26886 #ifdef SQLITE_DEBUG
26887 case SQLITE_TESTCTRL_TUNE: {
26888 if( nArg==4 ){
26889 int id = (int)integerValue(azArg[2]);
26890 int val = (int)integerValue(azArg[3]);
26891 sqlite3_test_control(testctrl, id, &val);
26892 isOk = 3;
26893 }else if( nArg==3 ){
26894 int id = (int)integerValue(azArg[2]);
26895 sqlite3_test_control(testctrl, -id, &rc2);
26896 isOk = 1;
26897 }else if( nArg==2 ){
26898 int id = 1;
26899 while(1){
26900 int val = 0;
26901 rc2 = sqlite3_test_control(testctrl, -id, &val);
26902 if( rc2!=SQLITE_OK ) break;
26903 if( id>1 ) utf8_printf(p->out, " ");
26904 utf8_printf(p->out, "%d: %d", id, val);
26905 id++;
26906 }
26907 if( id>1 ) utf8_printf(p->out, "\n");
26908 isOk = 3;
26909 }
26910 break;
26911 }
26912 #endif
26913 case SQLITE_TESTCTRL_SORTER_MMAP:
26914 if( nArg==3 ){
26915 int opt = (unsigned int)integerValue(azArg[2]);
26916 rc2 = sqlite3_test_control(testctrl, p->db, opt);
26917 isOk = 3;
26918 }
26919 break;
26920 }
26921 }
26922 if( isOk==0 && iCtrl>=0 ){
26923 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
26924 rc = 1;
26925 }else if( isOk==1 ){
26926 raw_printf(p->out, "%d\n", rc2);
26927 }else if( isOk==2 ){
26928 raw_printf(p->out, "0x%08x\n", rc2);
26929 }
26930 }else
26931 #endif /* !defined(SQLITE_UNTESTABLE) */
26932
26933 if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
26934 open_db(p, 0);
26935 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
26936 }else
26937
26938 if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
26939 if( nArg==2 ){
26940 enableTimer = booleanValue(azArg[1]);
26941 if( enableTimer && !HAS_TIMER ){
26942 raw_printf(stderr, "Error: timer not available on this system.\n");
26943 enableTimer = 0;
26944 }
26945 }else{
26946 raw_printf(stderr, "Usage: .timer on|off\n");
26947 rc = 1;
26948 }
26949 }else
26950
26951 #ifndef SQLITE_OMIT_TRACE
26952 if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
26953 int mType = 0;
26954 int jj;
26955 open_db(p, 0);
26956 for(jj=1; jj<nArg; jj++){
26957 const char *z = azArg[jj];
26958 if( z[0]=='-' ){
26959 if( optionMatch(z, "expanded") ){
26960 p->eTraceType = SHELL_TRACE_EXPANDED;
26961 }
26962 #ifdef SQLITE_ENABLE_NORMALIZE
26963 else if( optionMatch(z, "normalized") ){
26964 p->eTraceType = SHELL_TRACE_NORMALIZED;
26965 }
26966 #endif
26967 else if( optionMatch(z, "plain") ){
26968 p->eTraceType = SHELL_TRACE_PLAIN;
26969 }
26970 else if( optionMatch(z, "profile") ){
26971 mType |= SQLITE_TRACE_PROFILE;
26972 }
26973 else if( optionMatch(z, "row") ){
26974 mType |= SQLITE_TRACE_ROW;
26975 }
26976 else if( optionMatch(z, "stmt") ){
26977 mType |= SQLITE_TRACE_STMT;
26978 }
26979 else if( optionMatch(z, "close") ){
26980 mType |= SQLITE_TRACE_CLOSE;
26981 }
26982 else {
26983 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
26984 rc = 1;
26985 goto meta_command_exit;
26986 }
26987 }else{
26988 output_file_close(p->traceOut);
26989 p->traceOut = output_file_open(z, 0);
26990 }
26991 }
26992 if( p->traceOut==0 ){
26993 sqlite3_trace_v2(p->db, 0, 0, 0);
26994 }else{
26995 if( mType==0 ) mType = SQLITE_TRACE_STMT;
26996 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
26997 }
26998 }else
26999 #endif /* !defined(SQLITE_OMIT_TRACE) */
27000
27001 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
27002 if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
27003 int ii;
27004 int lenOpt;
27005 char *zOpt;
27006 if( nArg<2 ){
27007 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
27008 rc = 1;
27009 goto meta_command_exit;
27010 }
27011 open_db(p, 0);
27012 zOpt = azArg[1];
27013 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
27014 lenOpt = (int)strlen(zOpt);
27015 if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
27016 assert( azArg[nArg]==0 );
27017 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
27018 }else{
27019 for(ii=1; ii<nArg; ii++){
27020 sqlite3_create_module(p->db, azArg[ii], 0, 0);
27021 }
27022 }
27023 }else
27024 #endif
27025
27026 #if SQLITE_USER_AUTHENTICATION
27027 if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){
27028 if( nArg<2 ){
27029 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
27030 rc = 1;
27031 goto meta_command_exit;
27032 }
27033 open_db(p, 0);
27034 if( cli_strcmp(azArg[1],"login")==0 ){
27035 if( nArg!=4 ){
27036 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
27037 rc = 1;
27038 goto meta_command_exit;
27039 }
27040 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
27041 strlen30(azArg[3]));
27042 if( rc ){
27043 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
27044 rc = 1;
27045 }
27046 }else if( cli_strcmp(azArg[1],"add")==0 ){
27047 if( nArg!=5 ){
27048 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
27049 rc = 1;
27050 goto meta_command_exit;
27051 }
27052 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
27053 booleanValue(azArg[4]));
27054 if( rc ){
27055 raw_printf(stderr, "User-Add failed: %d\n", rc);
27056 rc = 1;
27057 }
27058 }else if( cli_strcmp(azArg[1],"edit")==0 ){
27059 if( nArg!=5 ){
27060 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
27061 rc = 1;
27062 goto meta_command_exit;
27063 }
27064 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
27065 booleanValue(azArg[4]));
27066 if( rc ){
27067 raw_printf(stderr, "User-Edit failed: %d\n", rc);
27068 rc = 1;
27069 }
27070 }else if( cli_strcmp(azArg[1],"delete")==0 ){
27071 if( nArg!=3 ){
27072 raw_printf(stderr, "Usage: .user delete USER\n");
27073 rc = 1;
27074 goto meta_command_exit;
27075 }
27076 rc = sqlite3_user_delete(p->db, azArg[2]);
27077 if( rc ){
27078 raw_printf(stderr, "User-Delete failed: %d\n", rc);
27079 rc = 1;
27080 }
27081 }else{
27082 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
27083 rc = 1;
27084 goto meta_command_exit;
27085 }
27086 }else
27087 #endif /* SQLITE_USER_AUTHENTICATION */
27088
27089 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
27090 char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
27091 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
27092 sqlite3_libversion(), sqlite3_sourceid());
27093 #if SQLITE_HAVE_ZLIB
27094 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
27095 #endif
27096 #define CTIMEOPT_VAL_(opt) #opt
27097 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
27098 #if defined(__clang__) && defined(__clang_major__)
27099 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
27100 CTIMEOPT_VAL(__clang_minor__) "."
27101 CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
27102 #elif defined(_MSC_VER)
27103 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
27104 #elif defined(__GNUC__) && defined(__VERSION__)
27105 utf8_printf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
27106 #endif
27107 }else
27108
27109 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
27110 const char *zDbName = nArg==2 ? azArg[1] : "main";
27111 sqlite3_vfs *pVfs = 0;
27112 if( p->db ){
27113 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
27114 if( pVfs ){
27115 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
27116 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
27117 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
27118 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
27119 }
27120 }
27121 }else
27122
27123 if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
27124 sqlite3_vfs *pVfs;
27125 sqlite3_vfs *pCurrent = 0;
27126 if( p->db ){
27127 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
27128 }
27129 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
27130 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
27131 pVfs==pCurrent ? " <--- CURRENT" : "");
27132 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
27133 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
27134 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
27135 if( pVfs->pNext ){
27136 raw_printf(p->out, "-----------------------------------\n");
27137 }
27138 }
27139 }else
27140
27141 if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
27142 const char *zDbName = nArg==2 ? azArg[1] : "main";
27143 char *zVfsName = 0;
27144 if( p->db ){
27145 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
27146 if( zVfsName ){
27147 utf8_printf(p->out, "%s\n", zVfsName);
27148 sqlite3_free(zVfsName);
27149 }
27150 }
27151 }else
27152
27153 if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
27154 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
27155 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
27156 }else
27157
27158 if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
27159 int j;
27160 assert( nArg<=ArraySize(azArg) );
27161 p->nWidth = nArg-1;
27162 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
27163 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
27164 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
27165 for(j=1; j<nArg; j++){
27166 p->colWidth[j-1] = (int)integerValue(azArg[j]);
27167 }
27168 }else
27169
27170 {
27171 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
27172 " \"%s\". Enter \".help\" for help\n", azArg[0]);
27173 rc = 1;
27174 }
27175
27176 meta_command_exit:
27177 if( p->outCount ){
27178 p->outCount--;
27179 if( p->outCount==0 ) output_reset(p);
27180 }
27181 p->bSafeMode = p->bSafeModePersist;
27182 return rc;
27183 }
27184
27185 /* Line scan result and intermediate states (supporting scan resumption)
27186 */
27187 #ifndef CHAR_BIT
27188 # define CHAR_BIT 8
27189 #endif
27190 typedef enum {
27191 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
27192 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
27193 QSS_Start = 0
27194 } QuickScanState;
27195 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
27196 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
27197 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
27198 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
27199 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
27200
27201 /*
27202 ** Scan line for classification to guide shell's handling.
27203 ** The scan is resumable for subsequent lines when prior
27204 ** return values are passed as the 2nd argument.
27205 */
27206 static QuickScanState quickscan(char *zLine, QuickScanState qss,
27207 SCAN_TRACKER_REFTYPE pst){
27208 char cin;
27209 char cWait = (char)qss; /* intentional narrowing loss */
27210 if( cWait==0 ){
27211 PlainScan:
27212 assert( cWait==0 );
27213 while( (cin = *zLine++)!=0 ){
27214 if( IsSpace(cin) )
27215 continue;
27216 switch (cin){
27217 case '-':
27218 if( *zLine!='-' )
27219 break;
27220 while((cin = *++zLine)!=0 )
27221 if( cin=='\n')
27222 goto PlainScan;
27223 return qss;
27224 case ';':
27225 qss |= QSS_EndingSemi;
27226 continue;
27227 case '/':
27228 if( *zLine=='*' ){
27229 ++zLine;
27230 cWait = '*';
27231 CONTINUE_PROMPT_AWAITS(pst, "/*");
27232 qss = QSS_SETV(qss, cWait);
27233 goto TermScan;
27234 }
27235 break;
27236 case '[':
27237 cin = ']';
27238 deliberate_fall_through;
27239 case '`': case '\'': case '"':
27240 cWait = cin;
27241 qss = QSS_HasDark | cWait;
27242 CONTINUE_PROMPT_AWAITC(pst, cin);
27243 goto TermScan;
27244 case '(':
27245 CONTINUE_PAREN_INCR(pst, 1);
27246 break;
27247 case ')':
27248 CONTINUE_PAREN_INCR(pst, -1);
27249 break;
27250 default:
27251 break;
27252 }
27253 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
27254 }
27255 }else{
27256 TermScan:
27257 while( (cin = *zLine++)!=0 ){
27258 if( cin==cWait ){
27259 switch( cWait ){
27260 case '*':
27261 if( *zLine != '/' )
27262 continue;
27263 ++zLine;
27264 cWait = 0;
27265 CONTINUE_PROMPT_AWAITC(pst, 0);
27266 qss = QSS_SETV(qss, 0);
27267 goto PlainScan;
27268 case '`': case '\'': case '"':
27269 if(*zLine==cWait){
27270 /* Swallow doubled end-delimiter.*/
27271 ++zLine;
27272 continue;
27273 }
27274 deliberate_fall_through;
27275 case ']':
27276 cWait = 0;
27277 CONTINUE_PROMPT_AWAITC(pst, 0);
27278 qss = QSS_SETV(qss, 0);
27279 goto PlainScan;
27280 default: assert(0);
27281 }
27282 }
27283 }
27284 }
27285 return qss;
27286 }
27287
27288 /*
27289 ** Return TRUE if the line typed in is an SQL command terminator other
27290 ** than a semi-colon. The SQL Server style "go" command is understood
27291 ** as is the Oracle "/".
27292 */
27293 static int line_is_command_terminator(char *zLine){
27294 while( IsSpace(zLine[0]) ){ zLine++; };
27295 if( zLine[0]=='/' )
27296 zLine += 1; /* Oracle */
27297 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
27298 zLine += 2; /* SQL Server */
27299 else
27300 return 0;
27301 return quickscan(zLine, QSS_Start, 0)==QSS_Start;
27302 }
27303
27304 /*
27305 ** The CLI needs a working sqlite3_complete() to work properly. So error
27306 ** out of the build if compiling with SQLITE_OMIT_COMPLETE.
27307 */
27308 #ifdef SQLITE_OMIT_COMPLETE
27309 # error the CLI application is imcompatable with SQLITE_OMIT_COMPLETE.
27310 #endif
27311
27312 /*
27313 ** Return true if zSql is a complete SQL statement. Return false if it
27314 ** ends in the middle of a string literal or C-style comment.
27315 */
27316 static int line_is_complete(char *zSql, int nSql){
27317 int rc;
27318 if( zSql==0 ) return 1;
27319 zSql[nSql] = ';';
27320 zSql[nSql+1] = 0;
27321 rc = sqlite3_complete(zSql);
27322 zSql[nSql] = 0;
27323 return rc;
27324 }
27325
27326 /*
27327 ** Run a single line of SQL. Return the number of errors.
27328 */
27329 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
27330 int rc;
27331 char *zErrMsg = 0;
27332
27333 open_db(p, 0);
27334 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
27335 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
27336 BEGIN_TIMER;
27337 rc = shell_exec(p, zSql, &zErrMsg);
27338 END_TIMER;
27339 if( rc || zErrMsg ){
27340 char zPrefix[100];
27341 const char *zErrorTail;
27342 const char *zErrorType;
27343 if( zErrMsg==0 ){
27344 zErrorType = "Error";
27345 zErrorTail = sqlite3_errmsg(p->db);
27346 }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
27347 zErrorType = "Parse error";
27348 zErrorTail = &zErrMsg[12];
27349 }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
27350 zErrorType = "Runtime error";
27351 zErrorTail = &zErrMsg[10];
27352 }else{
27353 zErrorType = "Error";
27354 zErrorTail = zErrMsg;
27355 }
27356 if( in!=0 || !stdin_is_interactive ){
27357 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
27358 "%s near line %d:", zErrorType, startline);
27359 }else{
27360 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
27361 }
27362 utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
27363 sqlite3_free(zErrMsg);
27364 zErrMsg = 0;
27365 return 1;
27366 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
27367 char zLineBuf[2000];
27368 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
27369 "changes: %lld total_changes: %lld",
27370 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
27371 raw_printf(p->out, "%s\n", zLineBuf);
27372 }
27373 return 0;
27374 }
27375
27376 static void echo_group_input(ShellState *p, const char *zDo){
27377 if( ShellHasFlag(p, SHFLG_Echo) ) utf8_printf(p->out, "%s\n", zDo);
27378 }
27379
27380 #ifdef SQLITE_SHELL_FIDDLE
27381 /*
27382 ** Alternate one_input_line() impl for wasm mode. This is not in the primary
27383 ** impl because we need the global shellState and cannot access it from that
27384 ** function without moving lots of code around (creating a larger/messier diff).
27385 */
27386 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
27387 /* Parse the next line from shellState.wasm.zInput. */
27388 const char *zBegin = shellState.wasm.zPos;
27389 const char *z = zBegin;
27390 char *zLine = 0;
27391 i64 nZ = 0;
27392
27393 UNUSED_PARAMETER(in);
27394 UNUSED_PARAMETER(isContinuation);
27395 if(!z || !*z){
27396 return 0;
27397 }
27398 while(*z && isspace(*z)) ++z;
27399 zBegin = z;
27400 for(; *z && '\n'!=*z; ++nZ, ++z){}
27401 if(nZ>0 && '\r'==zBegin[nZ-1]){
27402 --nZ;
27403 }
27404 shellState.wasm.zPos = z;
27405 zLine = realloc(zPrior, nZ+1);
27406 shell_check_oom(zLine);
27407 memcpy(zLine, zBegin, nZ);
27408 zLine[nZ] = 0;
27409 return zLine;
27410 }
27411 #endif /* SQLITE_SHELL_FIDDLE */
27412
27413 /*
27414 ** Read input from *in and process it. If *in==0 then input
27415 ** is interactive - the user is typing it it. Otherwise, input
27416 ** is coming from a file or device. A prompt is issued and history
27417 ** is saved only if input is interactive. An interrupt signal will
27418 ** cause this routine to exit immediately, unless input is interactive.
27419 **
27420 ** Return the number of errors.
27421 */
27422 static int process_input(ShellState *p){
27423 char *zLine = 0; /* A single input line */
27424 char *zSql = 0; /* Accumulated SQL text */
27425 i64 nLine; /* Length of current line */
27426 i64 nSql = 0; /* Bytes of zSql[] used */
27427 i64 nAlloc = 0; /* Allocated zSql[] space */
27428 int rc; /* Error code */
27429 int errCnt = 0; /* Number of errors seen */
27430 i64 startline = 0; /* Line number for start of current input */
27431 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
27432
27433 if( p->inputNesting==MAX_INPUT_NESTING ){
27434 /* This will be more informative in a later version. */
27435 utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
27436 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
27437 return 1;
27438 }
27439 ++p->inputNesting;
27440 p->lineno = 0;
27441 CONTINUE_PROMPT_RESET;
27442 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
27443 fflush(p->out);
27444 zLine = one_input_line(p->in, zLine, nSql>0);
27445 if( zLine==0 ){
27446 /* End of input */
27447 if( p->in==0 && stdin_is_interactive ) printf("\n");
27448 break;
27449 }
27450 if( seenInterrupt ){
27451 if( p->in!=0 ) break;
27452 seenInterrupt = 0;
27453 }
27454 p->lineno++;
27455 if( QSS_INPLAIN(qss)
27456 && line_is_command_terminator(zLine)
27457 && line_is_complete(zSql, nSql) ){
27458 memcpy(zLine,";",2);
27459 }
27460 qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
27461 if( QSS_PLAINWHITE(qss) && nSql==0 ){
27462 /* Just swallow single-line whitespace */
27463 echo_group_input(p, zLine);
27464 qss = QSS_Start;
27465 continue;
27466 }
27467 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
27468 CONTINUE_PROMPT_RESET;
27469 echo_group_input(p, zLine);
27470 if( zLine[0]=='.' ){
27471 rc = do_meta_command(zLine, p);
27472 if( rc==2 ){ /* exit requested */
27473 break;
27474 }else if( rc ){
27475 errCnt++;
27476 }
27477 }
27478 qss = QSS_Start;
27479 continue;
27480 }
27481 /* No single-line dispositions remain; accumulate line(s). */
27482 nLine = strlen(zLine);
27483 if( nSql+nLine+2>=nAlloc ){
27484 /* Grow buffer by half-again increments when big. */
27485 nAlloc = nSql+(nSql>>1)+nLine+100;
27486 zSql = realloc(zSql, nAlloc);
27487 shell_check_oom(zSql);
27488 }
27489 if( nSql==0 ){
27490 i64 i;
27491 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
27492 assert( nAlloc>0 && zSql!=0 );
27493 memcpy(zSql, zLine+i, nLine+1-i);
27494 startline = p->lineno;
27495 nSql = nLine-i;
27496 }else{
27497 zSql[nSql++] = '\n';
27498 memcpy(zSql+nSql, zLine, nLine+1);
27499 nSql += nLine;
27500 }
27501 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
27502 echo_group_input(p, zSql);
27503 errCnt += runOneSqlLine(p, zSql, p->in, startline);
27504 CONTINUE_PROMPT_RESET;
27505 nSql = 0;
27506 if( p->outCount ){
27507 output_reset(p);
27508 p->outCount = 0;
27509 }else{
27510 clearTempFile(p);
27511 }
27512 p->bSafeMode = p->bSafeModePersist;
27513 qss = QSS_Start;
27514 }else if( nSql && QSS_PLAINWHITE(qss) ){
27515 echo_group_input(p, zSql);
27516 nSql = 0;
27517 qss = QSS_Start;
27518 }
27519 }
27520 if( nSql ){
27521 /* This may be incomplete. Let the SQL parser deal with that. */
27522 echo_group_input(p, zSql);
27523 errCnt += runOneSqlLine(p, zSql, p->in, startline);
27524 CONTINUE_PROMPT_RESET;
27525 }
27526 free(zSql);
27527 free(zLine);
27528 --p->inputNesting;
27529 return errCnt>0;
27530 }
27531
27532 /*
27533 ** Return a pathname which is the user's home directory. A
27534 ** 0 return indicates an error of some kind.
27535 */
27536 static char *find_home_dir(int clearFlag){
27537 static char *home_dir = NULL;
27538 if( clearFlag ){
27539 free(home_dir);
27540 home_dir = 0;
27541 return 0;
27542 }
27543 if( home_dir ) return home_dir;
27544
27545 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
27546 && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
27547 {
27548 struct passwd *pwent;
27549 uid_t uid = getuid();
27550 if( (pwent=getpwuid(uid)) != NULL) {
27551 home_dir = pwent->pw_dir;
27552 }
27553 }
27554 #endif
27555
27556 #if defined(_WIN32_WCE)
27557 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
27558 */
27559 home_dir = "/";
27560 #else
27561
27562 #if defined(_WIN32) || defined(WIN32)
27563 if (!home_dir) {
27564 home_dir = getenv("USERPROFILE");
27565 }
27566 #endif
27567
27568 if (!home_dir) {
27569 home_dir = getenv("HOME");
27570 }
27571
27572 #if defined(_WIN32) || defined(WIN32)
27573 if (!home_dir) {
27574 char *zDrive, *zPath;
27575 int n;
27576 zDrive = getenv("HOMEDRIVE");
27577 zPath = getenv("HOMEPATH");
27578 if( zDrive && zPath ){
27579 n = strlen30(zDrive) + strlen30(zPath) + 1;
27580 home_dir = malloc( n );
27581 if( home_dir==0 ) return 0;
27582 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
27583 return home_dir;
27584 }
27585 home_dir = "c:\\";
27586 }
27587 #endif
27588
27589 #endif /* !_WIN32_WCE */
27590
27591 if( home_dir ){
27592 i64 n = strlen(home_dir) + 1;
27593 char *z = malloc( n );
27594 if( z ) memcpy(z, home_dir, n);
27595 home_dir = z;
27596 }
27597
27598 return home_dir;
27599 }
27600
27601 /*
27602 ** On non-Windows platforms, look for $XDG_CONFIG_HOME.
27603 ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
27604 ** the path to it, else return 0. The result is cached for
27605 ** subsequent calls.
27606 */
27607 static const char *find_xdg_config(void){
27608 #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \
27609 || defined(__RTP__) || defined(_WRS_KERNEL)
27610 return 0;
27611 #else
27612 static int alreadyTried = 0;
27613 static char *zConfig = 0;
27614 const char *zXdgHome;
27615
27616 if( alreadyTried!=0 ){
27617 return zConfig;
27618 }
27619 alreadyTried = 1;
27620 zXdgHome = getenv("XDG_CONFIG_HOME");
27621 if( zXdgHome==0 ){
27622 return 0;
27623 }
27624 zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
27625 shell_check_oom(zConfig);
27626 if( access(zConfig,0)!=0 ){
27627 sqlite3_free(zConfig);
27628 zConfig = 0;
27629 }
27630 return zConfig;
27631 #endif
27632 }
27633
27634 /*
27635 ** Read input from the file given by sqliterc_override. Or if that
27636 ** parameter is NULL, take input from the first of find_xdg_config()
27637 ** or ~/.sqliterc which is found.
27638 **
27639 ** Returns the number of errors.
27640 */
27641 static void process_sqliterc(
27642 ShellState *p, /* Configuration data */
27643 const char *sqliterc_override /* Name of config file. NULL to use default */
27644 ){
27645 char *home_dir = NULL;
27646 const char *sqliterc = sqliterc_override;
27647 char *zBuf = 0;
27648 FILE *inSaved = p->in;
27649 int savedLineno = p->lineno;
27650
27651 if( sqliterc == NULL ){
27652 sqliterc = find_xdg_config();
27653 }
27654 if( sqliterc == NULL ){
27655 home_dir = find_home_dir(0);
27656 if( home_dir==0 ){
27657 raw_printf(stderr, "-- warning: cannot find home directory;"
27658 " cannot read ~/.sqliterc\n");
27659 return;
27660 }
27661 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
27662 shell_check_oom(zBuf);
27663 sqliterc = zBuf;
27664 }
27665 p->in = fopen(sqliterc,"rb");
27666 if( p->in ){
27667 if( stdin_is_interactive ){
27668 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
27669 }
27670 if( process_input(p) && bail_on_error ) exit(1);
27671 fclose(p->in);
27672 }else if( sqliterc_override!=0 ){
27673 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
27674 if( bail_on_error ) exit(1);
27675 }
27676 p->in = inSaved;
27677 p->lineno = savedLineno;
27678 sqlite3_free(zBuf);
27679 }
27680
27681 /*
27682 ** Show available command line options
27683 */
27684 static const char zOptions[] =
27685 " -- treat no subsequent arguments as options\n"
27686 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
27687 " -A ARGS... run \".archive ARGS\" and exit\n"
27688 #endif
27689 " -append append the database to the end of the file\n"
27690 " -ascii set output mode to 'ascii'\n"
27691 " -bail stop after hitting an error\n"
27692 " -batch force batch I/O\n"
27693 " -box set output mode to 'box'\n"
27694 " -column set output mode to 'column'\n"
27695 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
27696 " -csv set output mode to 'csv'\n"
27697 #if !defined(SQLITE_OMIT_DESERIALIZE)
27698 " -deserialize open the database using sqlite3_deserialize()\n"
27699 #endif
27700 " -echo print inputs before execution\n"
27701 " -init FILENAME read/process named file\n"
27702 " -[no]header turn headers on or off\n"
27703 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
27704 " -heap SIZE Size of heap for memsys3 or memsys5\n"
27705 #endif
27706 " -help show this message\n"
27707 " -html set output mode to HTML\n"
27708 " -interactive force interactive I/O\n"
27709 " -json set output mode to 'json'\n"
27710 " -line set output mode to 'line'\n"
27711 " -list set output mode to 'list'\n"
27712 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
27713 " -markdown set output mode to 'markdown'\n"
27714 #if !defined(SQLITE_OMIT_DESERIALIZE)
27715 " -maxsize N maximum size for a --deserialize database\n"
27716 #endif
27717 " -memtrace trace all memory allocations and deallocations\n"
27718 " -mmap N default mmap size set to N\n"
27719 #ifdef SQLITE_ENABLE_MULTIPLEX
27720 " -multiplex enable the multiplexor VFS\n"
27721 #endif
27722 " -newline SEP set output row separator. Default: '\\n'\n"
27723 " -nofollow refuse to open symbolic links to database files\n"
27724 " -nonce STRING set the safe-mode escape nonce\n"
27725 " -nullvalue TEXT set text string for NULL values. Default ''\n"
27726 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
27727 " -pcachetrace trace all page cache operations\n"
27728 " -quote set output mode to 'quote'\n"
27729 " -readonly open the database read-only\n"
27730 " -safe enable safe-mode\n"
27731 " -separator SEP set output column separator. Default: '|'\n"
27732 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
27733 " -sorterref SIZE sorter references threshold size\n"
27734 #endif
27735 " -stats print memory stats before each finalize\n"
27736 " -table set output mode to 'table'\n"
27737 " -tabs set output mode to 'tabs'\n"
27738 " -unsafe-testing allow unsafe commands and modes for testing\n"
27739 #if SHELL_WIN_UTF8_OPT
27740 " -utf8 setup interactive console code page for UTF-8\n"
27741 #endif
27742 " -version show SQLite version\n"
27743 " -vfs NAME use NAME as the default VFS\n"
27744 #ifdef SQLITE_ENABLE_VFSTRACE
27745 " -vfstrace enable tracing of all VFS calls\n"
27746 #endif
27747 #ifdef SQLITE_HAVE_ZLIB
27748 " -zip open the file as a ZIP Archive\n"
27749 #endif
27750 ;
27751 static void usage(int showDetail){
27752 utf8_printf(stderr,
27753 "Usage: %s [OPTIONS] [FILENAME [SQL]]\n"
27754 "FILENAME is the name of an SQLite database. A new database is created\n"
27755 "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
27756 if( showDetail ){
27757 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
27758 }else{
27759 raw_printf(stderr, "Use the -help option for additional information\n");
27760 }
27761 exit(1);
27762 }
27763
27764 /*
27765 ** Internal check: Verify that the SQLite is uninitialized. Print a
27766 ** error message if it is initialized.
27767 */
27768 static void verify_uninitialized(void){
27769 if( sqlite3_config(-1)==SQLITE_MISUSE ){
27770 utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
27771 " initialization.\n");
27772 }
27773 }
27774
27775 /*
27776 ** Initialize the state information in data
27777 */
27778 static void main_init(ShellState *data) {
27779 memset(data, 0, sizeof(*data));
27780 data->normalMode = data->cMode = data->mode = MODE_List;
27781 data->autoExplain = 1;
27782 data->pAuxDb = &data->aAuxDb[0];
27783 memcpy(data->colSeparator,SEP_Column, 2);
27784 memcpy(data->rowSeparator,SEP_Row, 2);
27785 data->showHeader = 0;
27786 data->shellFlgs = SHFLG_Lookaside;
27787 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
27788 #if !defined(SQLITE_SHELL_FIDDLE)
27789 verify_uninitialized();
27790 #endif
27791 sqlite3_config(SQLITE_CONFIG_URI, 1);
27792 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
27793 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
27794 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
27795 }
27796
27797 /*
27798 ** Output text to the console in a font that attracts extra attention.
27799 */
27800 #ifdef _WIN32
27801 static void printBold(const char *zText){
27802 #if !SQLITE_OS_WINRT
27803 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
27804 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
27805 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
27806 SetConsoleTextAttribute(out,
27807 FOREGROUND_RED|FOREGROUND_INTENSITY
27808 );
27809 #endif
27810 printf("%s", zText);
27811 #if !SQLITE_OS_WINRT
27812 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
27813 #endif
27814 }
27815 #else
27816 static void printBold(const char *zText){
27817 printf("\033[1m%s\033[0m", zText);
27818 }
27819 #endif
27820
27821 /*
27822 ** Get the argument to an --option. Throw an error and die if no argument
27823 ** is available.
27824 */
27825 static char *cmdline_option_value(int argc, char **argv, int i){
27826 if( i==argc ){
27827 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
27828 argv[0], argv[argc-1]);
27829 exit(1);
27830 }
27831 return argv[i];
27832 }
27833
27834 static void sayAbnormalExit(void){
27835 if( seenInterrupt ) fprintf(stderr, "Program interrupted.\n");
27836 }
27837
27838 #ifndef SQLITE_SHELL_IS_UTF8
27839 # if (defined(_WIN32) || defined(WIN32)) \
27840 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
27841 # define SQLITE_SHELL_IS_UTF8 (0)
27842 # else
27843 # define SQLITE_SHELL_IS_UTF8 (1)
27844 # endif
27845 #endif
27846
27847 #ifdef SQLITE_SHELL_FIDDLE
27848 # define main fiddle_main
27849 #endif
27850
27851 #if SQLITE_SHELL_IS_UTF8
27852 int SQLITE_CDECL main(int argc, char **argv){
27853 #else
27854 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
27855 char **argv;
27856 #endif
27857 #ifdef SQLITE_DEBUG
27858 sqlite3_int64 mem_main_enter = 0;
27859 #endif
27860 char *zErrMsg = 0;
27861 #ifdef SQLITE_SHELL_FIDDLE
27862 # define data shellState
27863 #else
27864 ShellState data;
27865 #endif
27866 const char *zInitFile = 0;
27867 int i;
27868 int rc = 0;
27869 int warnInmemoryDb = 0;
27870 int readStdin = 1;
27871 int nCmd = 0;
27872 int nOptsEnd = argc;
27873 char **azCmd = 0;
27874 const char *zVfs = 0; /* Value of -vfs command-line option */
27875 #if !SQLITE_SHELL_IS_UTF8
27876 char **argvToFree = 0;
27877 int argcToFree = 0;
27878 #endif
27879 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
27880
27881 #ifdef SQLITE_SHELL_FIDDLE
27882 stdin_is_interactive = 0;
27883 stdout_is_console = 1;
27884 data.wasm.zDefaultDbName = "/fiddle.sqlite3";
27885 #else
27886 stdin_is_interactive = isatty(0);
27887 stdout_is_console = isatty(1);
27888 #endif
27889 #if SHELL_WIN_UTF8_OPT
27890 atexit(console_restore); /* Needs revision for CLI as library call */
27891 #endif
27892 atexit(sayAbnormalExit);
27893 #ifdef SQLITE_DEBUG
27894 mem_main_enter = sqlite3_memory_used();
27895 #endif
27896 #if !defined(_WIN32_WCE)
27897 if( getenv("SQLITE_DEBUG_BREAK") ){
27898 if( isatty(0) && isatty(2) ){
27899 fprintf(stderr,
27900 "attach debugger to process %d and press any key to continue.\n",
27901 GETPID());
27902 fgetc(stdin);
27903 }else{
27904 #if defined(_WIN32) || defined(WIN32)
27905 #if SQLITE_OS_WINRT
27906 __debugbreak();
27907 #else
27908 DebugBreak();
27909 #endif
27910 #elif defined(SIGTRAP)
27911 raise(SIGTRAP);
27912 #endif
27913 }
27914 }
27915 #endif
27916 /* Register a valid signal handler early, before much else is done. */
27917 #ifdef SIGINT
27918 signal(SIGINT, interrupt_handler);
27919 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
27920 if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
27921 fprintf(stderr, "No ^C handler.\n");
27922 }
27923 #endif
27924
27925 #if USE_SYSTEM_SQLITE+0!=1
27926 if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
27927 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
27928 sqlite3_sourceid(), SQLITE_SOURCE_ID);
27929 exit(1);
27930 }
27931 #endif
27932 main_init(&data);
27933
27934 /* On Windows, we must translate command-line arguments into UTF-8.
27935 ** The SQLite memory allocator subsystem has to be enabled in order to
27936 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
27937 ** subsequent sqlite3_config() calls will work. So copy all results into
27938 ** memory that does not come from the SQLite memory allocator.
27939 */
27940 #if !SQLITE_SHELL_IS_UTF8
27941 sqlite3_initialize();
27942 argvToFree = malloc(sizeof(argv[0])*argc*2);
27943 shell_check_oom(argvToFree);
27944 argcToFree = argc;
27945 argv = argvToFree + argc;
27946 for(i=0; i<argc; i++){
27947 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
27948 i64 n;
27949 shell_check_oom(z);
27950 n = strlen(z);
27951 argv[i] = malloc( n+1 );
27952 shell_check_oom(argv[i]);
27953 memcpy(argv[i], z, n+1);
27954 argvToFree[i] = argv[i];
27955 sqlite3_free(z);
27956 }
27957 sqlite3_shutdown();
27958 #endif
27959
27960 assert( argc>=1 && argv && argv[0] );
27961 Argv0 = argv[0];
27962
27963 #ifdef SQLITE_SHELL_DBNAME_PROC
27964 {
27965 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
27966 ** of a C-function that will provide the name of the database file. Use
27967 ** this compile-time option to embed this shell program in larger
27968 ** applications. */
27969 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
27970 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
27971 warnInmemoryDb = 0;
27972 }
27973 #endif
27974
27975 /* Do an initial pass through the command-line argument to locate
27976 ** the name of the database file, the name of the initialization file,
27977 ** the size of the alternative malloc heap,
27978 ** and the first command to execute.
27979 */
27980 #ifndef SQLITE_SHELL_FIDDLE
27981 verify_uninitialized();
27982 #endif
27983 for(i=1; i<argc; i++){
27984 char *z;
27985 z = argv[i];
27986 if( z[0]!='-' || i>nOptsEnd ){
27987 if( data.aAuxDb->zDbFilename==0 ){
27988 data.aAuxDb->zDbFilename = z;
27989 }else{
27990 /* Excess arguments are interpreted as SQL (or dot-commands) and
27991 ** mean that nothing is read from stdin */
27992 readStdin = 0;
27993 nCmd++;
27994 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
27995 shell_check_oom(azCmd);
27996 azCmd[nCmd-1] = z;
27997 }
27998 continue;
27999 }
28000 if( z[1]=='-' ) z++;
28001 if( cli_strcmp(z, "-")==0 ){
28002 nOptsEnd = i;
28003 continue;
28004 }else if( cli_strcmp(z,"-separator")==0
28005 || cli_strcmp(z,"-nullvalue")==0
28006 || cli_strcmp(z,"-newline")==0
28007 || cli_strcmp(z,"-cmd")==0
28008 ){
28009 (void)cmdline_option_value(argc, argv, ++i);
28010 }else if( cli_strcmp(z,"-init")==0 ){
28011 zInitFile = cmdline_option_value(argc, argv, ++i);
28012 }else if( cli_strcmp(z,"-batch")==0 ){
28013 /* Need to check for batch mode here to so we can avoid printing
28014 ** informational messages (like from process_sqliterc) before
28015 ** we do the actual processing of arguments later in a second pass.
28016 */
28017 stdin_is_interactive = 0;
28018 }else if( cli_strcmp(z,"-heap")==0 ){
28019 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
28020 const char *zSize;
28021 sqlite3_int64 szHeap;
28022
28023 zSize = cmdline_option_value(argc, argv, ++i);
28024 szHeap = integerValue(zSize);
28025 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
28026 verify_uninitialized();
28027 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
28028 #else
28029 (void)cmdline_option_value(argc, argv, ++i);
28030 #endif
28031 }else if( cli_strcmp(z,"-pagecache")==0 ){
28032 sqlite3_int64 n, sz;
28033 sz = integerValue(cmdline_option_value(argc,argv,++i));
28034 if( sz>70000 ) sz = 70000;
28035 if( sz<0 ) sz = 0;
28036 n = integerValue(cmdline_option_value(argc,argv,++i));
28037 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
28038 n = 0xffffffffffffLL/sz;
28039 }
28040 verify_uninitialized();
28041 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
28042 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
28043 data.shellFlgs |= SHFLG_Pagecache;
28044 }else if( cli_strcmp(z,"-lookaside")==0 ){
28045 int n, sz;
28046 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
28047 if( sz<0 ) sz = 0;
28048 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
28049 if( n<0 ) n = 0;
28050 verify_uninitialized();
28051 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
28052 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
28053 }else if( cli_strcmp(z,"-threadsafe")==0 ){
28054 int n;
28055 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
28056 verify_uninitialized();
28057 switch( n ){
28058 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break;
28059 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break;
28060 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break;
28061 }
28062 #ifdef SQLITE_ENABLE_VFSTRACE
28063 }else if( cli_strcmp(z,"-vfstrace")==0 ){
28064 extern int vfstrace_register(
28065 const char *zTraceName,
28066 const char *zOldVfsName,
28067 int (*xOut)(const char*,void*),
28068 void *pOutArg,
28069 int makeDefault
28070 );
28071 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
28072 #endif
28073 #ifdef SQLITE_ENABLE_MULTIPLEX
28074 }else if( cli_strcmp(z,"-multiplex")==0 ){
28075 extern int sqlite3_multiplex_initialize(const char*,int);
28076 sqlite3_multiplex_initialize(0, 1);
28077 #endif
28078 }else if( cli_strcmp(z,"-mmap")==0 ){
28079 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
28080 verify_uninitialized();
28081 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
28082 #if defined(SQLITE_ENABLE_SORTER_REFERENCES)
28083 }else if( cli_strcmp(z,"-sorterref")==0 ){
28084 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
28085 verify_uninitialized();
28086 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
28087 #endif
28088 }else if( cli_strcmp(z,"-vfs")==0 ){
28089 zVfs = cmdline_option_value(argc, argv, ++i);
28090 #ifdef SQLITE_HAVE_ZLIB
28091 }else if( cli_strcmp(z,"-zip")==0 ){
28092 data.openMode = SHELL_OPEN_ZIPFILE;
28093 #endif
28094 }else if( cli_strcmp(z,"-append")==0 ){
28095 data.openMode = SHELL_OPEN_APPENDVFS;
28096 #ifndef SQLITE_OMIT_DESERIALIZE
28097 }else if( cli_strcmp(z,"-deserialize")==0 ){
28098 data.openMode = SHELL_OPEN_DESERIALIZE;
28099 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
28100 data.szMax = integerValue(argv[++i]);
28101 #endif
28102 }else if( cli_strcmp(z,"-readonly")==0 ){
28103 data.openMode = SHELL_OPEN_READONLY;
28104 }else if( cli_strcmp(z,"-nofollow")==0 ){
28105 data.openFlags = SQLITE_OPEN_NOFOLLOW;
28106 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
28107 }else if( cli_strncmp(z, "-A",2)==0 ){
28108 /* All remaining command-line arguments are passed to the ".archive"
28109 ** command, so ignore them */
28110 break;
28111 #endif
28112 }else if( cli_strcmp(z, "-memtrace")==0 ){
28113 sqlite3MemTraceActivate(stderr);
28114 }else if( cli_strcmp(z, "-pcachetrace")==0 ){
28115 sqlite3PcacheTraceActivate(stderr);
28116 }else if( cli_strcmp(z,"-bail")==0 ){
28117 bail_on_error = 1;
28118 }else if( cli_strcmp(z,"-nonce")==0 ){
28119 free(data.zNonce);
28120 data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
28121 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
28122 ShellSetFlag(&data,SHFLG_TestingMode);
28123 }else if( cli_strcmp(z,"-safe")==0 ){
28124 /* no-op - catch this on the second pass */
28125 }
28126 }
28127 #ifndef SQLITE_SHELL_FIDDLE
28128 verify_uninitialized();
28129 #endif
28130
28131
28132 #ifdef SQLITE_SHELL_INIT_PROC
28133 {
28134 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
28135 ** of a C-function that will perform initialization actions on SQLite that
28136 ** occur just before or after sqlite3_initialize(). Use this compile-time
28137 ** option to embed this shell program in larger applications. */
28138 extern void SQLITE_SHELL_INIT_PROC(void);
28139 SQLITE_SHELL_INIT_PROC();
28140 }
28141 #else
28142 /* All the sqlite3_config() calls have now been made. So it is safe
28143 ** to call sqlite3_initialize() and process any command line -vfs option. */
28144 sqlite3_initialize();
28145 #endif
28146
28147 if( zVfs ){
28148 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
28149 if( pVfs ){
28150 sqlite3_vfs_register(pVfs, 1);
28151 }else{
28152 utf8_printf(stderr, "no such VFS: \"%s\"\n", zVfs);
28153 exit(1);
28154 }
28155 }
28156
28157 if( data.pAuxDb->zDbFilename==0 ){
28158 #ifndef SQLITE_OMIT_MEMORYDB
28159 data.pAuxDb->zDbFilename = ":memory:";
28160 warnInmemoryDb = argc==1;
28161 #else
28162 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
28163 return 1;
28164 #endif
28165 }
28166 data.out = stdout;
28167 #ifndef SQLITE_SHELL_FIDDLE
28168 sqlite3_appendvfs_init(0,0,0);
28169 #endif
28170
28171 /* Go ahead and open the database file if it already exists. If the
28172 ** file does not exist, delay opening it. This prevents empty database
28173 ** files from being created if a user mistypes the database name argument
28174 ** to the sqlite command-line tool.
28175 */
28176 if( access(data.pAuxDb->zDbFilename, 0)==0 ){
28177 open_db(&data, 0);
28178 }
28179
28180 /* Process the initialization file if there is one. If no -init option
28181 ** is given on the command line, look for a file named ~/.sqliterc and
28182 ** try to process it.
28183 */
28184 process_sqliterc(&data,zInitFile);
28185
28186 /* Make a second pass through the command-line argument and set
28187 ** options. This second pass is delayed until after the initialization
28188 ** file is processed so that the command-line arguments will override
28189 ** settings in the initialization file.
28190 */
28191 for(i=1; i<argc; i++){
28192 char *z = argv[i];
28193 if( z[0]!='-' || i>=nOptsEnd ) continue;
28194 if( z[1]=='-' ){ z++; }
28195 if( cli_strcmp(z,"-init")==0 ){
28196 i++;
28197 }else if( cli_strcmp(z,"-html")==0 ){
28198 data.mode = MODE_Html;
28199 }else if( cli_strcmp(z,"-list")==0 ){
28200 data.mode = MODE_List;
28201 }else if( cli_strcmp(z,"-quote")==0 ){
28202 data.mode = MODE_Quote;
28203 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
28204 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
28205 }else if( cli_strcmp(z,"-line")==0 ){
28206 data.mode = MODE_Line;
28207 }else if( cli_strcmp(z,"-column")==0 ){
28208 data.mode = MODE_Column;
28209 }else if( cli_strcmp(z,"-json")==0 ){
28210 data.mode = MODE_Json;
28211 }else if( cli_strcmp(z,"-markdown")==0 ){
28212 data.mode = MODE_Markdown;
28213 }else if( cli_strcmp(z,"-table")==0 ){
28214 data.mode = MODE_Table;
28215 }else if( cli_strcmp(z,"-box")==0 ){
28216 data.mode = MODE_Box;
28217 }else if( cli_strcmp(z,"-csv")==0 ){
28218 data.mode = MODE_Csv;
28219 memcpy(data.colSeparator,",",2);
28220 #ifdef SQLITE_HAVE_ZLIB
28221 }else if( cli_strcmp(z,"-zip")==0 ){
28222 data.openMode = SHELL_OPEN_ZIPFILE;
28223 #endif
28224 }else if( cli_strcmp(z,"-append")==0 ){
28225 data.openMode = SHELL_OPEN_APPENDVFS;
28226 #ifndef SQLITE_OMIT_DESERIALIZE
28227 }else if( cli_strcmp(z,"-deserialize")==0 ){
28228 data.openMode = SHELL_OPEN_DESERIALIZE;
28229 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
28230 data.szMax = integerValue(argv[++i]);
28231 #endif
28232 }else if( cli_strcmp(z,"-readonly")==0 ){
28233 data.openMode = SHELL_OPEN_READONLY;
28234 }else if( cli_strcmp(z,"-nofollow")==0 ){
28235 data.openFlags |= SQLITE_OPEN_NOFOLLOW;
28236 }else if( cli_strcmp(z,"-ascii")==0 ){
28237 data.mode = MODE_Ascii;
28238 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit);
28239 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record);
28240 }else if( cli_strcmp(z,"-tabs")==0 ){
28241 data.mode = MODE_List;
28242 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab);
28243 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row);
28244 }else if( cli_strcmp(z,"-separator")==0 ){
28245 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
28246 "%s",cmdline_option_value(argc,argv,++i));
28247 }else if( cli_strcmp(z,"-newline")==0 ){
28248 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
28249 "%s",cmdline_option_value(argc,argv,++i));
28250 }else if( cli_strcmp(z,"-nullvalue")==0 ){
28251 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
28252 "%s",cmdline_option_value(argc,argv,++i));
28253 }else if( cli_strcmp(z,"-header")==0 ){
28254 data.showHeader = 1;
28255 ShellSetFlag(&data, SHFLG_HeaderSet);
28256 }else if( cli_strcmp(z,"-noheader")==0 ){
28257 data.showHeader = 0;
28258 ShellSetFlag(&data, SHFLG_HeaderSet);
28259 }else if( cli_strcmp(z,"-echo")==0 ){
28260 ShellSetFlag(&data, SHFLG_Echo);
28261 }else if( cli_strcmp(z,"-eqp")==0 ){
28262 data.autoEQP = AUTOEQP_on;
28263 }else if( cli_strcmp(z,"-eqpfull")==0 ){
28264 data.autoEQP = AUTOEQP_full;
28265 }else if( cli_strcmp(z,"-stats")==0 ){
28266 data.statsOn = 1;
28267 }else if( cli_strcmp(z,"-scanstats")==0 ){
28268 data.scanstatsOn = 1;
28269 }else if( cli_strcmp(z,"-backslash")==0 ){
28270 /* Undocumented command-line option: -backslash
28271 ** Causes C-style backslash escapes to be evaluated in SQL statements
28272 ** prior to sending the SQL into SQLite. Useful for injecting
28273 ** crazy bytes in the middle of SQL statements for testing and debugging.
28274 */
28275 ShellSetFlag(&data, SHFLG_Backslash);
28276 }else if( cli_strcmp(z,"-bail")==0 ){
28277 /* No-op. The bail_on_error flag should already be set. */
28278 }else if( cli_strcmp(z,"-version")==0 ){
28279 printf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(),
28280 8*(int)sizeof(char*));
28281 return 0;
28282 }else if( cli_strcmp(z,"-interactive")==0 ){
28283 stdin_is_interactive = 1;
28284 }else if( cli_strcmp(z,"-batch")==0 ){
28285 stdin_is_interactive = 0;
28286 }else if( cli_strcmp(z,"-utf8")==0 ){
28287 #if SHELL_WIN_UTF8_OPT
28288 console_utf8 = 1;
28289 #endif /* SHELL_WIN_UTF8_OPT */
28290 }else if( cli_strcmp(z,"-heap")==0 ){
28291 i++;
28292 }else if( cli_strcmp(z,"-pagecache")==0 ){
28293 i+=2;
28294 }else if( cli_strcmp(z,"-lookaside")==0 ){
28295 i+=2;
28296 }else if( cli_strcmp(z,"-threadsafe")==0 ){
28297 i+=2;
28298 }else if( cli_strcmp(z,"-nonce")==0 ){
28299 i += 2;
28300 }else if( cli_strcmp(z,"-mmap")==0 ){
28301 i++;
28302 }else if( cli_strcmp(z,"-memtrace")==0 ){
28303 i++;
28304 }else if( cli_strcmp(z,"-pcachetrace")==0 ){
28305 i++;
28306 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
28307 }else if( cli_strcmp(z,"-sorterref")==0 ){
28308 i++;
28309 #endif
28310 }else if( cli_strcmp(z,"-vfs")==0 ){
28311 i++;
28312 #ifdef SQLITE_ENABLE_VFSTRACE
28313 }else if( cli_strcmp(z,"-vfstrace")==0 ){
28314 i++;
28315 #endif
28316 #ifdef SQLITE_ENABLE_MULTIPLEX
28317 }else if( cli_strcmp(z,"-multiplex")==0 ){
28318 i++;
28319 #endif
28320 }else if( cli_strcmp(z,"-help")==0 ){
28321 usage(1);
28322 }else if( cli_strcmp(z,"-cmd")==0 ){
28323 /* Run commands that follow -cmd first and separately from commands
28324 ** that simply appear on the command-line. This seems goofy. It would
28325 ** be better if all commands ran in the order that they appear. But
28326 ** we retain the goofy behavior for historical compatibility. */
28327 if( i==argc-1 ) break;
28328 z = cmdline_option_value(argc,argv,++i);
28329 if( z[0]=='.' ){
28330 rc = do_meta_command(z, &data);
28331 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
28332 }else{
28333 open_db(&data, 0);
28334 rc = shell_exec(&data, z, &zErrMsg);
28335 if( zErrMsg!=0 ){
28336 utf8_printf(stderr,"Error: %s\n", zErrMsg);
28337 if( bail_on_error ) return rc!=0 ? rc : 1;
28338 }else if( rc!=0 ){
28339 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
28340 if( bail_on_error ) return rc;
28341 }
28342 }
28343 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
28344 }else if( cli_strncmp(z, "-A", 2)==0 ){
28345 if( nCmd>0 ){
28346 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
28347 " with \"%s\"\n", z);
28348 return 1;
28349 }
28350 open_db(&data, OPEN_DB_ZIPFILE);
28351 if( z[2] ){
28352 argv[i] = &z[2];
28353 arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
28354 }else{
28355 arDotCommand(&data, 1, argv+i, argc-i);
28356 }
28357 readStdin = 0;
28358 break;
28359 #endif
28360 }else if( cli_strcmp(z,"-safe")==0 ){
28361 data.bSafeMode = data.bSafeModePersist = 1;
28362 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
28363 /* Acted upon in first pass. */
28364 }else{
28365 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
28366 raw_printf(stderr,"Use -help for a list of options.\n");
28367 return 1;
28368 }
28369 data.cMode = data.mode;
28370 }
28371 #if SHELL_WIN_UTF8_OPT
28372 if( console_utf8 && stdin_is_interactive ){
28373 console_prepare();
28374 }else{
28375 setBinaryMode(stdin, 0);
28376 console_utf8 = 0;
28377 }
28378 #endif
28379
28380 if( !readStdin ){
28381 /* Run all arguments that do not begin with '-' as if they were separate
28382 ** command-line inputs, except for the argToSkip argument which contains
28383 ** the database filename.
28384 */
28385 for(i=0; i<nCmd; i++){
28386 if( azCmd[i][0]=='.' ){
28387 rc = do_meta_command(azCmd[i], &data);
28388 if( rc ){
28389 free(azCmd);
28390 return rc==2 ? 0 : rc;
28391 }
28392 }else{
28393 open_db(&data, 0);
28394 echo_group_input(&data, azCmd[i]);
28395 rc = shell_exec(&data, azCmd[i], &zErrMsg);
28396 if( zErrMsg || rc ){
28397 if( zErrMsg!=0 ){
28398 utf8_printf(stderr,"Error: %s\n", zErrMsg);
28399 }else{
28400 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
28401 }
28402 sqlite3_free(zErrMsg);
28403 free(azCmd);
28404 return rc!=0 ? rc : 1;
28405 }
28406 }
28407 }
28408 }else{
28409 /* Run commands received from standard input
28410 */
28411 if( stdin_is_interactive ){
28412 char *zHome;
28413 char *zHistory;
28414 int nHistory;
28415 printf(
28416 "SQLite version %s %.19s\n" /*extra-version-info*/
28417 "Enter \".help\" for usage hints.\n",
28418 sqlite3_libversion(), sqlite3_sourceid()
28419 );
28420 if( warnInmemoryDb ){
28421 printf("Connected to a ");
28422 printBold("transient in-memory database");
28423 printf(".\nUse \".open FILENAME\" to reopen on a "
28424 "persistent database.\n");
28425 }
28426 zHistory = getenv("SQLITE_HISTORY");
28427 if( zHistory ){
28428 zHistory = strdup(zHistory);
28429 }else if( (zHome = find_home_dir(0))!=0 ){
28430 nHistory = strlen30(zHome) + 20;
28431 if( (zHistory = malloc(nHistory))!=0 ){
28432 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
28433 }
28434 }
28435 if( zHistory ){ shell_read_history(zHistory); }
28436 #if HAVE_READLINE || HAVE_EDITLINE
28437 rl_attempted_completion_function = readline_completion;
28438 #elif HAVE_LINENOISE
28439 linenoiseSetCompletionCallback(linenoise_completion);
28440 #endif
28441 data.in = 0;
28442 rc = process_input(&data);
28443 if( zHistory ){
28444 shell_stifle_history(2000);
28445 shell_write_history(zHistory);
28446 free(zHistory);
28447 }
28448 }else{
28449 data.in = stdin;
28450 rc = process_input(&data);
28451 }
28452 }
28453 #ifndef SQLITE_SHELL_FIDDLE
28454 /* In WASM mode we have to leave the db state in place so that
28455 ** client code can "push" SQL into it after this call returns. */
28456 free(azCmd);
28457 set_table_name(&data, 0);
28458 if( data.db ){
28459 session_close_all(&data, -1);
28460 close_db(data.db);
28461 }
28462 for(i=0; i<ArraySize(data.aAuxDb); i++){
28463 sqlite3_free(data.aAuxDb[i].zFreeOnClose);
28464 if( data.aAuxDb[i].db ){
28465 session_close_all(&data, i);
28466 close_db(data.aAuxDb[i].db);
28467 }
28468 }
28469 find_home_dir(1);
28470 output_reset(&data);
28471 data.doXdgOpen = 0;
28472 clearTempFile(&data);
28473 #if !SQLITE_SHELL_IS_UTF8
28474 for(i=0; i<argcToFree; i++) free(argvToFree[i]);
28475 free(argvToFree);
28476 #endif
28477 free(data.colWidth);
28478 free(data.zNonce);
28479 /* Clear the global data structure so that valgrind will detect memory
28480 ** leaks */
28481 memset(&data, 0, sizeof(data));
28482 #ifdef SQLITE_DEBUG
28483 if( sqlite3_memory_used()>mem_main_enter ){
28484 utf8_printf(stderr, "Memory leaked: %u bytes\n",
28485 (unsigned int)(sqlite3_memory_used()-mem_main_enter));
28486 }
28487 #endif
28488 #endif /* !SQLITE_SHELL_FIDDLE */
28489 return rc;
28490 }
28491
28492
28493 #ifdef SQLITE_SHELL_FIDDLE
28494 /* Only for emcc experimentation purposes. */
28495 int fiddle_experiment(int a,int b){
28496 return a + b;
28497 }
28498
28499 /*
28500 ** Returns a pointer to the current DB handle.
28501 */
28502 sqlite3 * fiddle_db_handle(){
28503 return globalDb;
28504 }
28505
28506 /*
28507 ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
28508 ** "main" is assumed. Returns 0 if no db with the given name is
28509 ** open.
28510 */
28511 sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
28512 sqlite3_vfs * pVfs = 0;
28513 if(globalDb){
28514 sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
28515 SQLITE_FCNTL_VFS_POINTER, &pVfs);
28516 }
28517 return pVfs;
28518 }
28519
28520 /* Only for emcc experimentation purposes. */
28521 sqlite3 * fiddle_db_arg(sqlite3 *arg){
28522 printf("fiddle_db_arg(%p)\n", (const void*)arg);
28523 return arg;
28524 }
28525
28526 /*
28527 ** Intended to be called via a SharedWorker() while a separate
28528 ** SharedWorker() (which manages the wasm module) is performing work
28529 ** which should be interrupted. Unfortunately, SharedWorker is not
28530 ** portable enough to make real use of.
28531 */
28532 void fiddle_interrupt(void){
28533 if( globalDb ) sqlite3_interrupt(globalDb);
28534 }
28535
28536 /*
28537 ** Returns the filename of the given db name, assuming "main" if
28538 ** zDbName is NULL. Returns NULL if globalDb is not opened.
28539 */
28540 const char * fiddle_db_filename(const char * zDbName){
28541 return globalDb
28542 ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
28543 : NULL;
28544 }
28545
28546 /*
28547 ** Completely wipes out the contents of the currently-opened database
28548 ** but leaves its storage intact for reuse.
28549 */
28550 void fiddle_reset_db(void){
28551 if( globalDb ){
28552 int rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
28553 if( 0==rc ) rc = sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
28554 sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
28555 }
28556 }
28557
28558 /*
28559 ** Uses the current database's VFS xRead to stream the db file's
28560 ** contents out to the given callback. The callback gets a single
28561 ** chunk of size n (its 2nd argument) on each call and must return 0
28562 ** on success, non-0 on error. This function returns 0 on success,
28563 ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
28564 ** code from the callback. Note that this is not thread-friendly: it
28565 ** expects that it will be the only thread reading the db file and
28566 ** takes no measures to ensure that is the case.
28567 */
28568 int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
28569 sqlite3_int64 nSize = 0;
28570 sqlite3_int64 nPos = 0;
28571 sqlite3_file * pFile = 0;
28572 unsigned char buf[1024 * 8];
28573 int nBuf = (int)sizeof(buf);
28574 int rc = shellState.db
28575 ? sqlite3_file_control(shellState.db, "main",
28576 SQLITE_FCNTL_FILE_POINTER, &pFile)
28577 : SQLITE_NOTFOUND;
28578 if( rc ) return rc;
28579 rc = pFile->pMethods->xFileSize(pFile, &nSize);
28580 if( rc ) return rc;
28581 if(nSize % nBuf){
28582 /* DB size is not an even multiple of the buffer size. Reduce
28583 ** buffer size so that we do not unduly inflate the db size when
28584 ** exporting. */
28585 if(0 == nSize % 4096) nBuf = 4096;
28586 else if(0 == nSize % 2048) nBuf = 2048;
28587 else if(0 == nSize % 1024) nBuf = 1024;
28588 else nBuf = 512;
28589 }
28590 for( ; 0==rc && nPos<nSize; nPos += nBuf ){
28591 rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
28592 if(SQLITE_IOERR_SHORT_READ == rc){
28593 rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
28594 }
28595 if( 0==rc ) rc = xCallback(buf, nBuf);
28596 }
28597 return rc;
28598 }
28599
28600 /*
28601 ** Trivial exportable function for emscripten. It processes zSql as if
28602 ** it were input to the sqlite3 shell and redirects all output to the
28603 ** wasm binding. fiddle_main() must have been called before this
28604 ** is called, or results are undefined.
28605 */
28606 void fiddle_exec(const char * zSql){
28607 if(zSql && *zSql){
28608 if('.'==*zSql) puts(zSql);
28609 shellState.wasm.zInput = zSql;
28610 shellState.wasm.zPos = zSql;
28611 process_input(&shellState);
28612 shellState.wasm.zInput = shellState.wasm.zPos = 0;
28613 }
28614 }
28615 #endif /* SQLITE_SHELL_FIDDLE */