Sqlite3 3.50.2
Light weight SQL DB
Loading...
Searching...
No Matches
shell.c
Go to the documentation of this file.
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
37typedef unsigned int u32;
38typedef 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"
124typedef unsigned char u8;
125#include <ctype.h>
126#include <stdarg.h>
127
128#if !defined(_WIN32) && !defined(WIN32)
129# include <signal.h>
130# if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
131# include <pwd.h>
132# endif
133#endif
134#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
135# include <unistd.h>
136# include <dirent.h>
137# define GETPID getpid
138# if defined(__MINGW32__)
139# define DIRENT dirent
140# ifndef S_ISLNK
141# define S_ISLNK(mode) (0)
142# endif
143# endif
144#else
145# define GETPID (int)GetCurrentProcessId
146#endif
147#include <sys/types.h>
148#include <sys/stat.h>
149
150#if HAVE_READLINE
151# include <readline/readline.h>
152# include <readline/history.h>
153#endif
154
155#if HAVE_EDITLINE
156# include <editline/readline.h>
157#endif
158
159#if HAVE_EDITLINE || HAVE_READLINE
160
161# define shell_add_history(X) add_history(X)
162# define shell_read_history(X) read_history(X)
163# define shell_write_history(X) write_history(X)
164# define shell_stifle_history(X) stifle_history(X)
165# define shell_readline(X) readline(X)
166
167#elif HAVE_LINENOISE
168
169# include "linenoise.h"
170# define shell_add_history(X) linenoiseHistoryAdd(X)
171# define shell_read_history(X) linenoiseHistoryLoad(X)
172# define shell_write_history(X) linenoiseHistorySave(X)
173# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
174# define shell_readline(X) linenoise(X)
175
176#else
177
178# define shell_read_history(X)
179# define shell_write_history(X)
180# define shell_stifle_history(X)
181
182# define SHELL_USE_LOCAL_GETLINE 1
183#endif
184
185#ifndef deliberate_fall_through
186/* Quiet some compilers about some of our intentional code. */
187# if defined(GCC_VERSION) && GCC_VERSION>=7000000
188# define deliberate_fall_through __attribute__((fallthrough));
189# else
190# define deliberate_fall_through
191# endif
192#endif
193
194#if defined(_WIN32) || defined(WIN32)
196# define SQLITE_OMIT_POPEN 1
197# else
198# include <io.h>
199# include <fcntl.h>
200# define isatty(h) _isatty(h)
201# ifndef access
202# define access(f,m) _access((f),(m))
203# endif
204# ifndef unlink
205# define unlink _unlink
206# endif
207# ifndef strdup
208# define strdup _strdup
209# endif
210# undef pclose
211# define pclose _pclose
212# endif
213#else
214 /* Make sure isatty() has a prototype. */
215 extern int isatty(int);
216
217# if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
218 /* popen and pclose are not C89 functions and so are
219 ** sometimes omitted from the <stdio.h> header */
220 extern FILE *popen(const char*,const char*);
221 extern int pclose(FILE*);
222# else
223# define SQLITE_OMIT_POPEN 1
224# endif
225#endif
226
227#if defined(_WIN32_WCE)
228/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
229 * thus we always assume that we have a console. That can be
230 * overridden with the -batch command line option.
231 */
232#define isatty(x) 1
233#endif
234
235/* ctype macros that work with signed characters */
236#define IsSpace(X) isspace((unsigned char)X)
237#define IsDigit(X) isdigit((unsigned char)X)
238#define ToLower(X) (char)tolower((unsigned char)X)
239#define IsAlnum(X) isalnum((unsigned char)X)
240#define IsAlpha(X) isalpha((unsigned char)X)
241
242#if defined(_WIN32) || defined(WIN32)
244#include <intrin.h>
245#endif
246#undef WIN32_LEAN_AND_MEAN
247#define WIN32_LEAN_AND_MEAN
248#include <windows.h>
249
250/* string conversion routines only needed on Win32 */
251extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
252extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
253#endif
254
255/************************* Begin ../ext/misc/sqlite3_stdio.h ******************/
256/*
257** 2024-09-24
258**
259** The author disclaims copyright to this source code. In place of
260** a legal notice, here is a blessing:
261**
262** May you do good and not evil.
263** May you find forgiveness for yourself and forgive others.
264** May you share freely, never taking more than you give.
265**
266*************************************************************************
267**
268** This header file contains definitions of interfaces that provide
269** cross-platform I/O for UTF-8 content.
270**
271** On most platforms, the interfaces definitions in this file are
272** just #defines. For example sqlite3_fopen() is a macro that resolves
273** to the standard fopen() in the C-library.
274**
275** But Windows does not have a standard C-library, at least not one that
276** can handle UTF-8. So for windows build, the interfaces resolve to new
277** C-language routines contained in the separate sqlite3_stdio.c source file.
278**
279** So on all non-Windows platforms, simply #include this header file and
280** use the interfaces defined herein. Then to run your application on Windows,
281** also link in the accompanying sqlite3_stdio.c source file when compiling
282** to get compatible interfaces.
283*/
284#ifndef _SQLITE3_STDIO_H_
285#define _SQLITE3_STDIO_H_ 1
286#ifdef _WIN32
287/**** Definitions For Windows ****/
288#include <stdio.h>
289#include <windows.h>
290
291FILE *sqlite3_fopen(const char *zFilename, const char *zMode);
292FILE *sqlite3_popen(const char *zCommand, const char *type);
293char *sqlite3_fgets(char *s, int size, FILE *stream);
294int sqlite3_fputs(const char *s, FILE *stream);
295int sqlite3_fprintf(FILE *stream, const char *format, ...);
296void sqlite3_fsetmode(FILE *stream, int mode);
297
298
299#else
300/**** Definitions For All Other Platforms ****/
301#include <stdio.h>
302#define sqlite3_fopen fopen
303#define sqlite3_popen popen
304#define sqlite3_fgets fgets
305#define sqlite3_fputs fputs
306#define sqlite3_fprintf fprintf
307#define sqlite3_fsetmode(F,X) /*no-op*/
308
309#endif
310#endif /* _SQLITE3_STDIO_H_ */
311
312/************************* End ../ext/misc/sqlite3_stdio.h ********************/
313/************************* Begin ../ext/misc/sqlite3_stdio.c ******************/
314/*
315** 2024-09-24
316**
317** The author disclaims copyright to this source code. In place of
318** a legal notice, here is a blessing:
319**
320** May you do good and not evil.
321** May you find forgiveness for yourself and forgive others.
322** May you share freely, never taking more than you give.
323**
324*************************************************************************
325**
326** Implementation of standard I/O interfaces for UTF-8 that are missing
327** on Windows.
328*/
329#ifdef _WIN32 /* This file is a no-op on all platforms except Windows */
330#ifndef _SQLITE3_STDIO_H_
331/* #include "sqlite3_stdio.h" */
332#endif
333#undef WIN32_LEAN_AND_MEAN
334#define WIN32_LEAN_AND_MEAN
335#include <windows.h>
336#include <stdlib.h>
337#include <string.h>
338#include <stdio.h>
339#include <assert.h>
340/* #include "sqlite3.h" */
341#include <ctype.h>
342#include <stdarg.h>
343#include <io.h>
344#include <fcntl.h>
345
346/*
347** If the SQLITE_U8TEXT_ONLY option is defined, then use O_U8TEXT
348** when appropriate on all output. (Sometimes use O_BINARY when
349** rendering ASCII text in cases where NL-to-CRLF expansion would
350** not be correct.)
351**
352** If the SQLITE_U8TEXT_STDIO option is defined, then use O_U8TEXT
353** when appropriate when writing to stdout or stderr. Use O_BINARY
354** or O_TEXT (depending on things like the .mode and the .crlf setting
355** in the CLI, or other context clues in other applications) for all
356** other output channels.
357**
358** The default behavior, if neither of the above is defined is to
359** use O_U8TEXT when writing to the Windows console (or anything
360** else for which _isatty() returns true) and to use O_BINARY or O_TEXT
361** for all other output channels.
362**
363** The SQLITE_USE_W32_FOR_CONSOLE_IO macro is also available. If
364** defined, it forces the use of Win32 APIs for all console I/O, both
365** input and output. This is necessary for some non-Microsoft run-times
366** that implement stdio differently from Microsoft/Visual-Studio.
367*/
368#if defined(SQLITE_U8TEXT_ONLY)
369# define UseWtextForOutput(fd) 1
370# define UseWtextForInput(fd) 1
371# define IsConsole(fd) _isatty(_fileno(fd))
372#elif defined(SQLITE_U8TEXT_STDIO)
373# define UseWtextForOutput(fd) ((fd)==stdout || (fd)==stderr)
374# define UseWtextForInput(fd) ((fd)==stdin)
375# define IsConsole(fd) _isatty(_fileno(fd))
376#else
377# define UseWtextForOutput(fd) _isatty(_fileno(fd))
378# define UseWtextForInput(fd) _isatty(_fileno(fd))
379# define IsConsole(fd) 1
380#endif
381
382/*
383** Global variables determine if simulated O_BINARY mode is to be
384** used for stdout or other, respectively. Simulated O_BINARY mode
385** means the mode is usually O_BINARY, but switches to O_U8TEXT for
386** unicode characters U+0080 or greater (any character that has a
387** multi-byte representation in UTF-8). This is the only way we
388** have found to render Unicode characters on a Windows console while
389** at the same time avoiding undesirable \n to \r\n translation.
390*/
391static int simBinaryStdout = 0;
392static int simBinaryOther = 0;
393
394
395/*
396** Determine if simulated binary mode should be used for output to fd
397*/
398static int UseBinaryWText(FILE *fd){
399 if( fd==stdout || fd==stderr ){
400 return simBinaryStdout;
401 }else{
402 return simBinaryOther;
403 }
404}
405
406
407/*
408** Work-alike for the fopen() routine from the standard C library.
409*/
410FILE *sqlite3_fopen(const char *zFilename, const char *zMode){
411 FILE *fp = 0;
412 wchar_t *b1, *b2;
413 int sz1, sz2;
414
415 sz1 = (int)strlen(zFilename);
416 sz2 = (int)strlen(zMode);
417 b1 = sqlite3_malloc( (sz1+1)*sizeof(b1[0]) );
418 b2 = sqlite3_malloc( (sz2+1)*sizeof(b1[0]) );
419 if( b1 && b2 ){
420 sz1 = MultiByteToWideChar(CP_UTF8, 0, zFilename, sz1, b1, sz1);
421 b1[sz1] = 0;
422 sz2 = MultiByteToWideChar(CP_UTF8, 0, zMode, sz2, b2, sz2);
423 b2[sz2] = 0;
424 fp = _wfopen(b1, b2);
425 }
428 simBinaryOther = 0;
429 return fp;
430}
431
432
433/*
434** Work-alike for the popen() routine from the standard C library.
435*/
436FILE *sqlite3_popen(const char *zCommand, const char *zMode){
437 FILE *fp = 0;
438 wchar_t *b1, *b2;
439 int sz1, sz2;
440
441 sz1 = (int)strlen(zCommand);
442 sz2 = (int)strlen(zMode);
443 b1 = sqlite3_malloc( (sz1+1)*sizeof(b1[0]) );
444 b2 = sqlite3_malloc( (sz2+1)*sizeof(b1[0]) );
445 if( b1 && b2 ){
446 sz1 = MultiByteToWideChar(CP_UTF8, 0, zCommand, sz1, b1, sz1);
447 b1[sz1] = 0;
448 sz2 = MultiByteToWideChar(CP_UTF8, 0, zMode, sz2, b2, sz2);
449 b2[sz2] = 0;
450 fp = _wpopen(b1, b2);
451 }
454 return fp;
455}
456
457/*
458** Work-alike for fgets() from the standard C library.
459*/
460char *sqlite3_fgets(char *buf, int sz, FILE *in){
461 if( UseWtextForInput(in) ){
462 /* When reading from the command-prompt in Windows, it is necessary
463 ** to use _O_WTEXT input mode to read UTF-16 characters, then translate
464 ** that into UTF-8. Otherwise, non-ASCII characters all get translated
465 ** into '?'.
466 */
467 wchar_t *b1 = sqlite3_malloc( sz*sizeof(wchar_t) );
468 if( b1==0 ) return 0;
469#ifdef SQLITE_USE_W32_FOR_CONSOLE_IO
470 DWORD nRead = 0;
471 if( IsConsole(in)
472 && ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), b1, sz-1, &nRead, 0)
473 ){
474 b1[nRead] = 0;
475 }else
476#endif
477 {
478 _setmode(_fileno(in), IsConsole(in) ? _O_WTEXT : _O_U8TEXT);
479 if( fgetws(b1, sz/4, in)==0 ){
481 return 0;
482 }
483 }
484 WideCharToMultiByte(CP_UTF8, 0, b1, -1, buf, sz, 0, 0);
486 return buf;
487 }else{
488 /* Reading from a file or other input source, just read bytes without
489 ** any translation. */
490 return fgets(buf, sz, in);
491 }
492}
493
494/*
495** Send ASCII text as O_BINARY. But for Unicode characters U+0080 and
496** greater, switch to O_U8TEXT.
497*/
498static void piecemealOutput(wchar_t *b1, int sz, FILE *out){
499 int i;
500 wchar_t c;
501 while( sz>0 ){
502 for(i=0; i<sz && b1[i]>=0x80; i++){}
503 if( i>0 ){
504 c = b1[i];
505 b1[i] = 0;
506 fflush(out);
507 _setmode(_fileno(out), _O_U8TEXT);
508 fputws(b1, out);
509 fflush(out);
510 b1 += i;
511 b1[0] = c;
512 sz -= i;
513 }else{
514 fflush(out);
515 _setmode(_fileno(out), _O_TEXT);
516 _setmode(_fileno(out), _O_BINARY);
517 fwrite(&b1[0], 1, 1, out);
518 for(i=1; i<sz && b1[i]<0x80; i++){
519 fwrite(&b1[i], 1, 1, out);
520 }
521 fflush(out);
522 _setmode(_fileno(out), _O_U8TEXT);
523 b1 += i;
524 sz -= i;
525 }
526 }
527}
528
529/*
530** Work-alike for fputs() from the standard C library.
531*/
532int sqlite3_fputs(const char *z, FILE *out){
533 if( !UseWtextForOutput(out) ){
534 /* Writing to a file or other destination, just write bytes without
535 ** any translation. */
536 return fputs(z, out);
537 }else{
538 /* One must use UTF16 in order to get unicode support when writing
539 ** to the console on Windows.
540 */
541 int sz = (int)strlen(z);
542 wchar_t *b1 = sqlite3_malloc( (sz+1)*sizeof(wchar_t) );
543 if( b1==0 ) return 0;
544 sz = MultiByteToWideChar(CP_UTF8, 0, z, sz, b1, sz);
545 b1[sz] = 0;
546
547#ifdef SQLITE_USE_W32_FOR_CONSOLE_IO
548 DWORD nWr = 0;
549 if( IsConsole(out)
550 && WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),b1,sz,&nWr,0)
551 ){
552 /* If writing to the console, then the WriteConsoleW() is all we
553 ** need to do. */
554 }else
555#endif
556 {
557 /* As long as SQLITE_USE_W32_FOR_CONSOLE_IO is not defined, or for
558 ** non-console I/O even if that macro is defined, write using the
559 ** standard library. */
560 _setmode(_fileno(out), _O_U8TEXT);
561 if( UseBinaryWText(out) ){
562 piecemealOutput(b1, sz, out);
563 }else{
564 fputws(b1, out);
565 }
566 }
568 return 0;
569 }
570}
571
572
573/*
574** Work-alike for fprintf() from the standard C library.
575*/
576int sqlite3_fprintf(FILE *out, const char *zFormat, ...){
577 int rc;
578 if( UseWtextForOutput(out) ){
579 /* When writing to the command-prompt in Windows, it is necessary
580 ** to use _O_WTEXT input mode and write UTF-16 characters.
581 */
582 char *z;
583 va_list ap;
584
585 va_start(ap, zFormat);
586 z = sqlite3_vmprintf(zFormat, ap);
587 va_end(ap);
588 sqlite3_fputs(z, out);
589 rc = (int)strlen(z);
591 }else{
592 /* Writing to a file or other destination, just write bytes without
593 ** any translation. */
594 va_list ap;
595 va_start(ap, zFormat);
596 rc = vfprintf(out, zFormat, ap);
597 va_end(ap);
598 }
599 return rc;
600}
601
602/*
603** Set the mode for an output stream. mode argument is typically _O_BINARY or
604** _O_TEXT.
605*/
606void sqlite3_fsetmode(FILE *fp, int mode){
607 if( !UseWtextForOutput(fp) ){
608 fflush(fp);
609 _setmode(_fileno(fp), mode);
610 }else if( fp==stdout || fp==stderr ){
611 simBinaryStdout = (mode==_O_BINARY);
612 }else{
613 simBinaryOther = (mode==_O_BINARY);
614 }
615}
616
617#endif /* defined(_WIN32) */
618
619/************************* End ../ext/misc/sqlite3_stdio.c ********************/
620
621/* Use console I/O package as a direct INCLUDE. */
622#define SQLITE_INTERNAL_LINKAGE static
623
624#ifdef SQLITE_SHELL_FIDDLE
625/* Deselect most features from the console I/O package for Fiddle. */
626# define SQLITE_CIO_NO_REDIRECT
627# define SQLITE_CIO_NO_CLASSIFY
628# define SQLITE_CIO_NO_TRANSLATE
629# define SQLITE_CIO_NO_SETMODE
630# define SQLITE_CIO_NO_FLUSH
631#endif
632
633#define eputz(z) sqlite3_fputs(z,stderr)
634#define sputz(fp,z) sqlite3_fputs(z,fp)
635
636/* True if the timer is enabled */
637static int enableTimer = 0;
638
639/* A version of strcmp() that works with NULL values */
640static int cli_strcmp(const char *a, const char *b){
641 if( a==0 ) a = "";
642 if( b==0 ) b = "";
643 return strcmp(a,b);
644}
645static int cli_strncmp(const char *a, const char *b, size_t n){
646 if( a==0 ) a = "";
647 if( b==0 ) b = "";
648 return strncmp(a,b,n);
649}
650
651/* Return the current wall-clock time */
653 static sqlite3_vfs *clockVfs = 0;
655 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
656 if( clockVfs==0 ) return 0; /* Never actually happens */
657 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
658 clockVfs->xCurrentTimeInt64(clockVfs, &t);
659 }else{
660 double r;
661 clockVfs->xCurrentTime(clockVfs, &r);
662 t = (sqlite3_int64)(r*86400000.0);
663 }
664 return t;
665}
666
667#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
668#include <sys/time.h>
669#include <sys/resource.h>
670
671/* VxWorks does not support getrusage() as far as we can determine */
672#if defined(_WRS_KERNEL) || defined(__RTP__)
673struct rusage {
674 struct timeval ru_utime; /* user CPU time used */
675 struct timeval ru_stime; /* system CPU time used */
676};
677#define getrusage(A,B) memset(B,0,sizeof(*B))
678#endif
679
680
681/* Saved resource information for the beginning of an operation */
682static struct rusage sBegin; /* CPU time at start */
683static sqlite3_int64 iBegin; /* Wall-clock time at start */
684
685/*
686** Begin timing an operation
687*/
688static void beginTimer(void){
689 if( enableTimer ){
690 getrusage(RUSAGE_SELF, &sBegin);
691 iBegin = timeOfDay();
692 }
693}
694
695/* Return the difference of two time_structs in seconds */
696static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
697 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
698 (double)(pEnd->tv_sec - pStart->tv_sec);
699}
700
701/*
702** Print the timing results.
703*/
704static void endTimer(FILE *out){
705 if( enableTimer ){
706 sqlite3_int64 iEnd = timeOfDay();
707 struct rusage sEnd;
708 getrusage(RUSAGE_SELF, &sEnd);
709 sqlite3_fprintf(out, "Run Time: real %.3f user %f sys %f\n",
710 (iEnd - iBegin)*0.001,
711 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
712 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
713 }
714}
715
716#define BEGIN_TIMER beginTimer()
717#define END_TIMER(X) endTimer(X)
718#define HAS_TIMER 1
719
720#elif (defined(_WIN32) || defined(WIN32))
721
722/* Saved resource information for the beginning of an operation */
723static HANDLE hProcess;
724static FILETIME ftKernelBegin;
725static FILETIME ftUserBegin;
726static sqlite3_int64 ftWallBegin;
727typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
728 LPFILETIME, LPFILETIME);
729static GETPROCTIMES getProcessTimesAddr = NULL;
730
731/*
732** Check to see if we have timer support. Return 1 if necessary
733** support found (or found previously).
734*/
735static int hasTimer(void){
736 if( getProcessTimesAddr ){
737 return 1;
738 } else {
740 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
741 ** versions. See if the version we are running on has it, and if it
742 ** does, save off a pointer to it and the current process handle.
743 */
744 hProcess = GetCurrentProcess();
745 if( hProcess ){
746 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
747 if( NULL != hinstLib ){
748 getProcessTimesAddr =
749 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
750 if( NULL != getProcessTimesAddr ){
751 return 1;
752 }
753 FreeLibrary(hinstLib);
754 }
755 }
756#endif
757 }
758 return 0;
759}
760
761/*
762** Begin timing an operation
763*/
764static void beginTimer(void){
765 if( enableTimer && getProcessTimesAddr ){
766 FILETIME ftCreation, ftExit;
767 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
768 &ftKernelBegin,&ftUserBegin);
769 ftWallBegin = timeOfDay();
770 }
771}
772
773/* Return the difference of two FILETIME structs in seconds */
774static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
775 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
776 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
777 return (double) ((i64End - i64Start) / 10000000.0);
778}
779
780/*
781** Print the timing results.
782*/
783static void endTimer(FILE *out){
784 if( enableTimer && getProcessTimesAddr){
785 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
786 sqlite3_int64 ftWallEnd = timeOfDay();
787 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
788 sqlite3_fprintf(out, "Run Time: real %.3f user %f sys %f\n",
789 (ftWallEnd - ftWallBegin)*0.001,
790 timeDiff(&ftUserBegin, &ftUserEnd),
791 timeDiff(&ftKernelBegin, &ftKernelEnd));
792 }
793}
794
795#define BEGIN_TIMER beginTimer()
796#define END_TIMER(X) endTimer(X)
797#define HAS_TIMER hasTimer()
798
799#else
800#define BEGIN_TIMER
801#define END_TIMER(X) /*no-op*/
802#define HAS_TIMER 0
803#endif
804
805/*
806** Used to prevent warnings about unused parameters
807*/
808#define UNUSED_PARAMETER(x) (void)(x)
809
810/*
811** Number of elements in an array
812*/
813#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
814
815/*
816** If the following flag is set, then command execution stops
817** at an error if we are not interactive.
818*/
819static int bail_on_error = 0;
820
821/*
822** Treat stdin as an interactive input if the following variable
823** is true. Otherwise, assume stdin is connected to a file or pipe.
824*/
825static int stdin_is_interactive = 1;
826
827/*
828** On Windows systems we need to know if standard output is a console
829** in order to show that UTF-16 translation is done in the sign-on
830** banner. The following variable is true if it is the console.
831*/
832static int stdout_is_console = 1;
833
834/*
835** The following is the open SQLite database. We make a pointer
836** to this database a static variable so that it can be accessed
837** by the SIGINT handler to interrupt database processing.
838*/
839static sqlite3 *globalDb = 0;
840
841/*
842** True if an interrupt (Control-C) has been received.
843*/
844static volatile int seenInterrupt = 0;
845
846/*
847** This is the name of our program. It is set in main(), used
848** in a number of other places, mostly for error messages.
849*/
850static char *Argv0;
851
852/*
853** Prompt strings. Initialized in main. Settable with
854** .prompt main continue
855*/
856#define PROMPT_LEN_MAX 128
857/* First line prompt. default: "sqlite> " */
859/* Continuation prompt. default: " ...> " */
861
862/* This is variant of the standard-library strncpy() routine with the
863** one change that the destination string is always zero-terminated, even
864** if there is no zero-terminator in the first n-1 characters of the source
865** string.
866*/
867static char *shell_strncpy(char *dest, const char *src, size_t n){
868 size_t i;
869 for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
870 dest[i] = 0;
871 return dest;
872}
873
874/*
875** strcpy() workalike to squelch an unwarranted link-time warning
876** from OpenBSD.
877*/
878static void shell_strcpy(char *dest, const char *src){
879 while( (*(dest++) = *(src++))!=0 ){}
880}
881
882/*
883** Optionally disable dynamic continuation prompt.
884** Unless disabled, the continuation prompt shows open SQL lexemes if any,
885** or open parentheses level if non-zero, or continuation prompt as set.
886** This facility interacts with the scanner and process_input() where the
887** below 5 macros are used.
888*/
889#ifdef SQLITE_OMIT_DYNAPROMPT
890# define CONTINUATION_PROMPT continuePrompt
891# define CONTINUE_PROMPT_RESET
892# define CONTINUE_PROMPT_AWAITS(p,s)
893# define CONTINUE_PROMPT_AWAITC(p,c)
894# define CONTINUE_PAREN_INCR(p,n)
895# define CONTINUE_PROMPT_PSTATE 0
896typedef void *t_NoDynaPrompt;
897# define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
898#else
899# define CONTINUATION_PROMPT dynamicContinuePrompt()
900# define CONTINUE_PROMPT_RESET
901 do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
902# define CONTINUE_PROMPT_AWAITS(p,s)
903 if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
904# define CONTINUE_PROMPT_AWAITC(p,c)
905 if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
906# define CONTINUE_PAREN_INCR(p,n)
907 if(p && stdin_is_interactive) (trackParenLevel(p,n))
908# define CONTINUE_PROMPT_PSTATE (&dynPrompt)
910# define SCAN_TRACKER_REFTYPE t_DynaPromptRef
911
912static struct DynaPrompt {
914 char acAwait[2];
917} dynPrompt = { {0}, {0}, 0, 0 };
918
919/* Record parenthesis nesting level change, or force level to 0. */
920static void trackParenLevel(struct DynaPrompt *p, int ni){
921 p->inParenLevel += ni;
922 if( ni==0 ) p->inParenLevel = 0;
923 p->zScannerAwaits = 0;
924}
925
926/* Record that a lexeme is opened, or closed with args==0. */
927static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
928 if( s!=0 || c==0 ){
929 p->zScannerAwaits = s;
930 p->acAwait[0] = 0;
931 }else{
932 p->acAwait[0] = c;
934 }
935}
936
937/* Upon demand, derive the continuation prompt to display. */
938static char *dynamicContinuePrompt(void){
939 if( continuePrompt[0]==0
940 || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
941 return continuePrompt;
942 }else{
943 if( dynPrompt.zScannerAwaits ){
944 size_t ncp = strlen(continuePrompt);
945 size_t ndp = strlen(dynPrompt.zScannerAwaits);
946 if( ndp > ncp-3 ) return continuePrompt;
948 while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
951 }else{
952 if( dynPrompt.inParenLevel>9 ){
953 shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
954 }else if( dynPrompt.inParenLevel<0 ){
955 shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
956 }else{
957 shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
958 dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
959 }
962 }
963 }
964 return dynPrompt.dynamicPrompt;
965}
966#endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
967
968/* Indicate out-of-memory and exit. */
969static void shell_out_of_memory(void){
970 eputz("Error: out of memory\n");
971 exit(1);
972}
973
974/* Check a pointer to see if it is NULL. If it is NULL, exit with an
975** out-of-memory error.
976*/
977static void shell_check_oom(const void *p){
978 if( p==0 ) shell_out_of_memory();
979}
980
981/*
982** Write I/O traces to the following stream.
983*/
984#ifdef SQLITE_ENABLE_IOTRACE
985static FILE *iotrace = 0;
986#endif
987
988/*
989** This routine works like printf in that its first argument is a
990** format string and subsequent arguments are values to be substituted
991** in place of % fields. The result of formatting this string
992** is written to iotrace.
993*/
994#ifdef SQLITE_ENABLE_IOTRACE
995static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
996 va_list ap;
997 char *z;
998 if( iotrace==0 ) return;
999 va_start(ap, zFormat);
1000 z = sqlite3_vmprintf(zFormat, ap);
1001 va_end(ap);
1002 sqlite3_fprintf(iotrace, "%s", z);
1003 sqlite3_free(z);
1004}
1005#endif
1006
1007/* Lookup table to estimate the number of columns consumed by a Unicode
1008** character.
1009*/
1010static const struct {
1011 unsigned char w; /* Width of the character in columns */
1012 int iFirst; /* First character in a span having this width */
1013} aUWidth[] = {
1014 /* {1, 0x00000}, */
1015 {0, 0x00300}, {1, 0x00370}, {0, 0x00483}, {1, 0x00487}, {0, 0x00488},
1016 {1, 0x0048a}, {0, 0x00591}, {1, 0x005be}, {0, 0x005bf}, {1, 0x005c0},
1017 {0, 0x005c1}, {1, 0x005c3}, {0, 0x005c4}, {1, 0x005c6}, {0, 0x005c7},
1018 {1, 0x005c8}, {0, 0x00600}, {1, 0x00604}, {0, 0x00610}, {1, 0x00616},
1019 {0, 0x0064b}, {1, 0x0065f}, {0, 0x00670}, {1, 0x00671}, {0, 0x006d6},
1020 {1, 0x006e5}, {0, 0x006e7}, {1, 0x006e9}, {0, 0x006ea}, {1, 0x006ee},
1021 {0, 0x0070f}, {1, 0x00710}, {0, 0x00711}, {1, 0x00712}, {0, 0x00730},
1022 {1, 0x0074b}, {0, 0x007a6}, {1, 0x007b1}, {0, 0x007eb}, {1, 0x007f4},
1023 {0, 0x00901}, {1, 0x00903}, {0, 0x0093c}, {1, 0x0093d}, {0, 0x00941},
1024 {1, 0x00949}, {0, 0x0094d}, {1, 0x0094e}, {0, 0x00951}, {1, 0x00955},
1025 {0, 0x00962}, {1, 0x00964}, {0, 0x00981}, {1, 0x00982}, {0, 0x009bc},
1026 {1, 0x009bd}, {0, 0x009c1}, {1, 0x009c5}, {0, 0x009cd}, {1, 0x009ce},
1027 {0, 0x009e2}, {1, 0x009e4}, {0, 0x00a01}, {1, 0x00a03}, {0, 0x00a3c},
1028 {1, 0x00a3d}, {0, 0x00a41}, {1, 0x00a43}, {0, 0x00a47}, {1, 0x00a49},
1029 {0, 0x00a4b}, {1, 0x00a4e}, {0, 0x00a70}, {1, 0x00a72}, {0, 0x00a81},
1030 {1, 0x00a83}, {0, 0x00abc}, {1, 0x00abd}, {0, 0x00ac1}, {1, 0x00ac6},
1031 {0, 0x00ac7}, {1, 0x00ac9}, {0, 0x00acd}, {1, 0x00ace}, {0, 0x00ae2},
1032 {1, 0x00ae4}, {0, 0x00b01}, {1, 0x00b02}, {0, 0x00b3c}, {1, 0x00b3d},
1033 {0, 0x00b3f}, {1, 0x00b40}, {0, 0x00b41}, {1, 0x00b44}, {0, 0x00b4d},
1034 {1, 0x00b4e}, {0, 0x00b56}, {1, 0x00b57}, {0, 0x00b82}, {1, 0x00b83},
1035 {0, 0x00bc0}, {1, 0x00bc1}, {0, 0x00bcd}, {1, 0x00bce}, {0, 0x00c3e},
1036 {1, 0x00c41}, {0, 0x00c46}, {1, 0x00c49}, {0, 0x00c4a}, {1, 0x00c4e},
1037 {0, 0x00c55}, {1, 0x00c57}, {0, 0x00cbc}, {1, 0x00cbd}, {0, 0x00cbf},
1038 {1, 0x00cc0}, {0, 0x00cc6}, {1, 0x00cc7}, {0, 0x00ccc}, {1, 0x00cce},
1039 {0, 0x00ce2}, {1, 0x00ce4}, {0, 0x00d41}, {1, 0x00d44}, {0, 0x00d4d},
1040 {1, 0x00d4e}, {0, 0x00dca}, {1, 0x00dcb}, {0, 0x00dd2}, {1, 0x00dd5},
1041 {0, 0x00dd6}, {1, 0x00dd7}, {0, 0x00e31}, {1, 0x00e32}, {0, 0x00e34},
1042 {1, 0x00e3b}, {0, 0x00e47}, {1, 0x00e4f}, {0, 0x00eb1}, {1, 0x00eb2},
1043 {0, 0x00eb4}, {1, 0x00eba}, {0, 0x00ebb}, {1, 0x00ebd}, {0, 0x00ec8},
1044 {1, 0x00ece}, {0, 0x00f18}, {1, 0x00f1a}, {0, 0x00f35}, {1, 0x00f36},
1045 {0, 0x00f37}, {1, 0x00f38}, {0, 0x00f39}, {1, 0x00f3a}, {0, 0x00f71},
1046 {1, 0x00f7f}, {0, 0x00f80}, {1, 0x00f85}, {0, 0x00f86}, {1, 0x00f88},
1047 {0, 0x00f90}, {1, 0x00f98}, {0, 0x00f99}, {1, 0x00fbd}, {0, 0x00fc6},
1048 {1, 0x00fc7}, {0, 0x0102d}, {1, 0x01031}, {0, 0x01032}, {1, 0x01033},
1049 {0, 0x01036}, {1, 0x01038}, {0, 0x01039}, {1, 0x0103a}, {0, 0x01058},
1050 {1, 0x0105a}, {2, 0x01100}, {0, 0x01160}, {1, 0x01200}, {0, 0x0135f},
1051 {1, 0x01360}, {0, 0x01712}, {1, 0x01715}, {0, 0x01732}, {1, 0x01735},
1052 {0, 0x01752}, {1, 0x01754}, {0, 0x01772}, {1, 0x01774}, {0, 0x017b4},
1053 {1, 0x017b6}, {0, 0x017b7}, {1, 0x017be}, {0, 0x017c6}, {1, 0x017c7},
1054 {0, 0x017c9}, {1, 0x017d4}, {0, 0x017dd}, {1, 0x017de}, {0, 0x0180b},
1055 {1, 0x0180e}, {0, 0x018a9}, {1, 0x018aa}, {0, 0x01920}, {1, 0x01923},
1056 {0, 0x01927}, {1, 0x01929}, {0, 0x01932}, {1, 0x01933}, {0, 0x01939},
1057 {1, 0x0193c}, {0, 0x01a17}, {1, 0x01a19}, {0, 0x01b00}, {1, 0x01b04},
1058 {0, 0x01b34}, {1, 0x01b35}, {0, 0x01b36}, {1, 0x01b3b}, {0, 0x01b3c},
1059 {1, 0x01b3d}, {0, 0x01b42}, {1, 0x01b43}, {0, 0x01b6b}, {1, 0x01b74},
1060 {0, 0x01dc0}, {1, 0x01dcb}, {0, 0x01dfe}, {1, 0x01e00}, {0, 0x0200b},
1061 {1, 0x02010}, {0, 0x0202a}, {1, 0x0202f}, {0, 0x02060}, {1, 0x02064},
1062 {0, 0x0206a}, {1, 0x02070}, {0, 0x020d0}, {1, 0x020f0}, {2, 0x02329},
1063 {1, 0x0232b}, {2, 0x02e80}, {0, 0x0302a}, {2, 0x03030}, {1, 0x0303f},
1064 {2, 0x03040}, {0, 0x03099}, {2, 0x0309b}, {1, 0x0a4d0}, {0, 0x0a806},
1065 {1, 0x0a807}, {0, 0x0a80b}, {1, 0x0a80c}, {0, 0x0a825}, {1, 0x0a827},
1066 {2, 0x0ac00}, {1, 0x0d7a4}, {2, 0x0f900}, {1, 0x0fb00}, {0, 0x0fb1e},
1067 {1, 0x0fb1f}, {0, 0x0fe00}, {2, 0x0fe10}, {1, 0x0fe1a}, {0, 0x0fe20},
1068 {1, 0x0fe24}, {2, 0x0fe30}, {1, 0x0fe70}, {0, 0x0feff}, {2, 0x0ff00},
1069 {1, 0x0ff61}, {2, 0x0ffe0}, {1, 0x0ffe7}, {0, 0x0fff9}, {1, 0x0fffc},
1070 {0, 0x10a01}, {1, 0x10a04}, {0, 0x10a05}, {1, 0x10a07}, {0, 0x10a0c},
1071 {1, 0x10a10}, {0, 0x10a38}, {1, 0x10a3b}, {0, 0x10a3f}, {1, 0x10a40},
1072 {0, 0x1d167}, {1, 0x1d16a}, {0, 0x1d173}, {1, 0x1d183}, {0, 0x1d185},
1073 {1, 0x1d18c}, {0, 0x1d1aa}, {1, 0x1d1ae}, {0, 0x1d242}, {1, 0x1d245},
1074 {2, 0x20000}, {1, 0x2fffe}, {2, 0x30000}, {1, 0x3fffe}, {0, 0xe0001},
1075 {1, 0xe0002}, {0, 0xe0020}, {1, 0xe0080}, {0, 0xe0100}, {1, 0xe01f0}
1077
1078/*
1079** Return an estimate of the width, in columns, for the single Unicode
1080** character c. For normal characters, the answer is always 1. But the
1081** estimate might be 0 or 2 for zero-width and double-width characters.
1082**
1083** Different display devices display unicode using different widths. So
1084** it is impossible to know that true display width with 100% accuracy.
1085** Inaccuracies in the width estimates might cause columns to be misaligned.
1086** Unfortunately, there is nothing we can do about that.
1087*/
1088int cli_wcwidth(int c){
1089 int iFirst, iLast;
1090
1091 /* Fast path for common characters */
1092 if( c<=0x300 ) return 1;
1093
1094 /* The general case */
1095 iFirst = 0;
1096 iLast = sizeof(aUWidth)/sizeof(aUWidth[0]) - 1;
1097 while( iFirst<iLast-1 ){
1098 int iMid = (iFirst+iLast)/2;
1099 int cMid = aUWidth[iMid].iFirst;
1100 if( cMid < c ){
1101 iFirst = iMid;
1102 }else if( cMid > c ){
1103 iLast = iMid - 1;
1104 }else{
1105 return aUWidth[iMid].w;
1106 }
1107 }
1108 if( aUWidth[iLast].iFirst > c ) return aUWidth[iFirst].w;
1109 return aUWidth[iLast].w;
1110}
1111
1112/*
1113** Compute the value and length of a multi-byte UTF-8 character that
1114** begins at z[0]. Return the length. Write the Unicode value into *pU.
1115**
1116** This routine only works for *multi-byte* UTF-8 characters.
1117*/
1118static int decodeUtf8(const unsigned char *z, int *pU){
1119 if( (z[0] & 0xe0)==0xc0 && (z[1] & 0xc0)==0x80 ){
1120 *pU = ((z[0] & 0x1f)<<6) | (z[1] & 0x3f);
1121 return 2;
1122 }
1123 if( (z[0] & 0xf0)==0xe0 && (z[1] & 0xc0)==0x80 && (z[2] & 0xc0)==0x80 ){
1124 *pU = ((z[0] & 0x0f)<<12) | ((z[1] & 0x3f)<<6) | (z[2] & 0x3f);
1125 return 3;
1126 }
1127 if( (z[0] & 0xf8)==0xf0 && (z[1] & 0xc0)==0x80 && (z[2] & 0xc0)==0x80
1128 && (z[3] & 0xc0)==0x80
1129 ){
1130 *pU = ((z[0] & 0x0f)<<18) | ((z[1] & 0x3f)<<12) | ((z[2] & 0x3f))<<6
1131 | (z[4] & 0x3f);
1132 return 4;
1133 }
1134 *pU = 0;
1135 return 1;
1136}
1137
1138
1139#if 0 /* NOT USED */
1140/*
1141** Return the width, in display columns, of a UTF-8 string.
1142**
1143** Each normal character counts as 1. Zero-width characters count
1144** as zero, and double-width characters count as 2.
1145*/
1146int cli_wcswidth(const char *z){
1147 const unsigned char *a = (const unsigned char*)z;
1148 int n = 0;
1149 int i = 0;
1150 unsigned char c;
1151 while( (c = a[i])!=0 ){
1152 if( c>=0xc0 ){
1153 int u;
1154 int len = decodeUtf8(&a[i], &u);
1155 i += len;
1156 n += cli_wcwidth(u);
1157 }else if( c>=' ' ){
1158 n++;
1159 i++;
1160 }else{
1161 i++;
1162 }
1163 }
1164 return n;
1165}
1166#endif
1167
1168/*
1169** Check to see if z[] is a valid VT100 escape. If it is, then
1170** return the number of bytes in the escape sequence. Return 0 if
1171** z[] is not a VT100 escape.
1172**
1173** This routine assumes that z[0] is \033 (ESC).
1174*/
1175static int isVt100(const unsigned char *z){
1176 int i;
1177 if( z[1]!='[' ) return 0;
1178 i = 2;
1179 while( z[i]>=0x30 && z[i]<=0x3f ){ i++; }
1180 while( z[i]>=0x20 && z[i]<=0x2f ){ i++; }
1181 if( z[i]<0x40 || z[i]>0x7e ) return 0;
1182 return i+1;
1183}
1184
1185/*
1186** Output string zUtf to stdout as w characters. If w is negative,
1187** then right-justify the text. W is the width in UTF-8 characters, not
1188** in bytes. This is different from the %*.*s specification in printf
1189** since with %*.*s the width is measured in bytes, not characters.
1190**
1191** Take into account zero-width and double-width Unicode characters.
1192** In other words, a zero-width character does not count toward the
1193** the w limit. A double-width character counts as two.
1194*/
1195static void utf8_width_print(FILE *out, int w, const char *zUtf){
1196 const unsigned char *a = (const unsigned char*)zUtf;
1197 unsigned char c;
1198 int i = 0;
1199 int n = 0;
1200 int k;
1201 int aw = w<0 ? -w : w;
1202 if( zUtf==0 ) zUtf = "";
1203 while( (c = a[i])!=0 ){
1204 if( (c&0xc0)==0xc0 ){
1205 int u;
1206 int len = decodeUtf8(a+i, &u);
1207 int x = cli_wcwidth(u);
1208 if( x+n>aw ){
1209 break;
1210 }
1211 i += len;
1212 n += x;
1213 }else if( c==0x1b && (k = isVt100(&a[i]))>0 ){
1214 i += k;
1215 }else if( n>=aw ){
1216 break;
1217 }else{
1218 n++;
1219 i++;
1220 }
1221 }
1222 if( n>=aw ){
1223 sqlite3_fprintf(out, "%.*s", i, zUtf);
1224 }else if( w<0 ){
1225 sqlite3_fprintf(out, "%*s%s", aw-n, "", zUtf);
1226 }else{
1227 sqlite3_fprintf(out, "%s%*s", zUtf, aw-n, "");
1228 }
1229}
1230
1231
1232/*
1233** Determines if a string is a number of not.
1234*/
1235static int isNumber(const char *z, int *realnum){
1236 if( *z=='-' || *z=='+' ) z++;
1237 if( !IsDigit(*z) ){
1238 return 0;
1239 }
1240 z++;
1241 if( realnum ) *realnum = 0;
1242 while( IsDigit(*z) ){ z++; }
1243 if( *z=='.' ){
1244 z++;
1245 if( !IsDigit(*z) ) return 0;
1246 while( IsDigit(*z) ){ z++; }
1247 if( realnum ) *realnum = 1;
1248 }
1249 if( *z=='e' || *z=='E' ){
1250 z++;
1251 if( *z=='+' || *z=='-' ) z++;
1252 if( !IsDigit(*z) ) return 0;
1253 while( IsDigit(*z) ){ z++; }
1254 if( realnum ) *realnum = 1;
1255 }
1256 return *z==0;
1257}
1258
1259/*
1260** Compute a string length that is limited to what can be stored in
1261** lower 30 bits of a 32-bit signed integer.
1262*/
1263static int strlen30(const char *z){
1264 const char *z2 = z;
1265 while( *z2 ){ z2++; }
1266 return 0x3fffffff & (int)(z2 - z);
1267}
1268
1269/*
1270** Return the length of a string in characters. Multibyte UTF8 characters
1271** count as a single character.
1272*/
1273static int strlenChar(const char *z){
1274 int n = 0;
1275 while( *z ){
1276 if( (0xc0&*(z++))!=0x80 ) n++;
1277 }
1278 return n;
1279}
1280
1281/*
1282** Return open FILE * if zFile exists, can be opened for read
1283** and is an ordinary file or a character stream source.
1284** Otherwise return 0.
1285*/
1286static FILE * openChrSource(const char *zFile){
1287#if defined(_WIN32) || defined(WIN32)
1288 struct __stat64 x = {0};
1289# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
1290 /* On Windows, open first, then check the stream nature. This order
1291 ** is necessary because _stat() and sibs, when checking a named pipe,
1292 ** effectively break the pipe as its supplier sees it. */
1293 FILE *rv = sqlite3_fopen(zFile, "rb");
1294 if( rv==0 ) return 0;
1295 if( _fstat64(_fileno(rv), &x) != 0
1296 || !STAT_CHR_SRC(x.st_mode)){
1297 fclose(rv);
1298 rv = 0;
1299 }
1300 return rv;
1301#else
1302 struct stat x = {0};
1303 int rc = stat(zFile, &x);
1304# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
1305 if( rc!=0 ) return 0;
1306 if( STAT_CHR_SRC(x.st_mode) ){
1307 return sqlite3_fopen(zFile, "rb");
1308 }else{
1309 return 0;
1310 }
1311#endif
1312#undef STAT_CHR_SRC
1313}
1314
1315/*
1316** This routine reads a line of text from FILE in, stores
1317** the text in memory obtained from malloc() and returns a pointer
1318** to the text. NULL is returned at end of file, or if malloc()
1319** fails.
1320**
1321** If zLine is not NULL then it is a malloced buffer returned from
1322** a previous call to this routine that may be reused.
1323*/
1324static char *local_getline(char *zLine, FILE *in){
1325 int nLine = zLine==0 ? 0 : 100;
1326 int n = 0;
1327
1328 while( 1 ){
1329 if( n+100>nLine ){
1330 nLine = nLine*2 + 100;
1331 zLine = realloc(zLine, nLine);
1332 shell_check_oom(zLine);
1333 }
1334 if( sqlite3_fgets(&zLine[n], nLine - n, in)==0 ){
1335 if( n==0 ){
1336 free(zLine);
1337 return 0;
1338 }
1339 zLine[n] = 0;
1340 break;
1341 }
1342 while( zLine[n] ) n++;
1343 if( n>0 && zLine[n-1]=='\n' ){
1344 n--;
1345 if( n>0 && zLine[n-1]=='\r' ) n--;
1346 zLine[n] = 0;
1347 break;
1348 }
1349 }
1350 return zLine;
1351}
1352
1353/*
1354** Retrieve a single line of input text.
1355**
1356** If in==0 then read from standard input and prompt before each line.
1357** If isContinuation is true, then a continuation prompt is appropriate.
1358** If isContinuation is zero, then the main prompt should be used.
1359**
1360** If zPrior is not NULL then it is a buffer from a prior call to this
1361** routine that can be reused.
1362**
1363** The result is stored in space obtained from malloc() and must either
1364** be freed by the caller or else passed back into this routine via the
1365** zPrior argument for reuse.
1366*/
1367#ifndef SQLITE_SHELL_FIDDLE
1368static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
1369 char *zPrompt;
1370 char *zResult;
1371 if( in!=0 ){
1372 zResult = local_getline(zPrior, in);
1373 }else{
1374 zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
1376 sputz(stdout, zPrompt);
1377 fflush(stdout);
1378 do{
1379 zResult = local_getline(zPrior, stdin);
1380 zPrior = 0;
1381 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1382 if( zResult==0 ) sqlite3_sleep(50);
1383 }while( zResult==0 && seenInterrupt>0 );
1384#else
1385 free(zPrior);
1386 zResult = shell_readline(zPrompt);
1387 while( zResult==0 ){
1388 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1389 sqlite3_sleep(50);
1390 if( seenInterrupt==0 ) break;
1391 zResult = shell_readline("");
1392 }
1393 if( zResult && *zResult ) shell_add_history(zResult);
1394#endif
1395 }
1396 return zResult;
1397}
1398#endif /* !SQLITE_SHELL_FIDDLE */
1399
1400/*
1401** Return the value of a hexadecimal digit. Return -1 if the input
1402** is not a hex digit.
1403*/
1404static int hexDigitValue(char c){
1405 if( c>='0' && c<='9' ) return c - '0';
1406 if( c>='a' && c<='f' ) return c - 'a' + 10;
1407 if( c>='A' && c<='F' ) return c - 'A' + 10;
1408 return -1;
1409}
1410
1411/*
1412** Interpret zArg as an integer value, possibly with suffixes.
1413*/
1414static sqlite3_int64 integerValue(const char *zArg){
1415 sqlite3_int64 v = 0;
1416 static const struct { char *zSuffix; int iMult; } aMult[] = {
1417 { "KiB", 1024 },
1418 { "MiB", 1024*1024 },
1419 { "GiB", 1024*1024*1024 },
1420 { "KB", 1000 },
1421 { "MB", 1000000 },
1422 { "GB", 1000000000 },
1423 { "K", 1000 },
1424 { "M", 1000000 },
1425 { "G", 1000000000 },
1426 };
1427 int i;
1428 int isNeg = 0;
1429 if( zArg[0]=='-' ){
1430 isNeg = 1;
1431 zArg++;
1432 }else if( zArg[0]=='+' ){
1433 zArg++;
1434 }
1435 if( zArg[0]=='0' && zArg[1]=='x' ){
1436 int x;
1437 zArg += 2;
1438 while( (x = hexDigitValue(zArg[0]))>=0 ){
1439 v = (v<<4) + x;
1440 zArg++;
1441 }
1442 }else{
1443 while( IsDigit(zArg[0]) ){
1444 v = v*10 + zArg[0] - '0';
1445 zArg++;
1446 }
1447 }
1448 for(i=0; i<ArraySize(aMult); i++){
1449 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1450 v *= aMult[i].iMult;
1451 break;
1452 }
1453 }
1454 return isNeg? -v : v;
1455}
1456
1457/*
1458** A variable length string to which one can append text.
1459*/
1460typedef struct ShellText ShellText;
1462 char *z;
1463 int n;
1465};
1466
1467/*
1468** Initialize and destroy a ShellText object
1469*/
1470static void initText(ShellText *p){
1471 memset(p, 0, sizeof(*p));
1472}
1473static void freeText(ShellText *p){
1474 free(p->z);
1475 initText(p);
1476}
1477
1478/* zIn is either a pointer to a NULL-terminated string in memory obtained
1479** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1480** added to zIn, and the result returned in memory obtained from malloc().
1481** zIn, if it was not NULL, is freed.
1482**
1483** If the third argument, quote, is not '\0', then it is used as a
1484** quote character for zAppend.
1485*/
1486static void appendText(ShellText *p, const char *zAppend, char quote){
1487 i64 len;
1488 i64 i;
1489 i64 nAppend = strlen30(zAppend);
1490
1491 len = nAppend+p->n+1;
1492 if( quote ){
1493 len += 2;
1494 for(i=0; i<nAppend; i++){
1495 if( zAppend[i]==quote ) len++;
1496 }
1497 }
1498
1499 if( p->z==0 || p->n+len>=p->nAlloc ){
1500 p->nAlloc = p->nAlloc*2 + len + 20;
1501 p->z = realloc(p->z, p->nAlloc);
1503 }
1504
1505 if( quote ){
1506 char *zCsr = p->z+p->n;
1507 *zCsr++ = quote;
1508 for(i=0; i<nAppend; i++){
1509 *zCsr++ = zAppend[i];
1510 if( zAppend[i]==quote ) *zCsr++ = quote;
1511 }
1512 *zCsr++ = quote;
1513 p->n = (int)(zCsr - p->z);
1514 *zCsr = '\0';
1515 }else{
1516 memcpy(p->z+p->n, zAppend, nAppend);
1517 p->n += nAppend;
1518 p->z[p->n] = '\0';
1519 }
1520}
1521
1522/*
1523** Attempt to determine if identifier zName needs to be quoted, either
1524** because it contains non-alphanumeric characters, or because it is an
1525** SQLite keyword. Be conservative in this estimate: When in doubt assume
1526** that quoting is required.
1527**
1528** Return '"' if quoting is required. Return 0 if no quoting is required.
1529*/
1530static char quoteChar(const char *zName){
1531 int i;
1532 if( zName==0 ) return '"';
1533 if( !IsAlpha(zName[0]) && zName[0]!='_' ) return '"';
1534 for(i=0; zName[i]; i++){
1535 if( !IsAlnum(zName[i]) && zName[i]!='_' ) return '"';
1536 }
1537 return sqlite3_keyword_check(zName, i) ? '"' : 0;
1538}
1539
1540/*
1541** Construct a fake object name and column list to describe the structure
1542** of the view, virtual table, or table valued function zSchema.zName.
1543*/
1544static char *shellFakeSchema(
1545 sqlite3 *db, /* The database connection containing the vtab */
1546 const char *zSchema, /* Schema of the database holding the vtab */
1547 const char *zName /* The name of the virtual table */
1548){
1549 sqlite3_stmt *pStmt = 0;
1550 char *zSql;
1551 ShellText s;
1552 char cQuote;
1553 char *zDiv = "(";
1554 int nRow = 0;
1555
1556 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
1557 zSchema ? zSchema : "main", zName);
1559 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
1560 sqlite3_free(zSql);
1561 initText(&s);
1562 if( zSchema ){
1563 cQuote = quoteChar(zSchema);
1564 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
1565 appendText(&s, zSchema, cQuote);
1566 appendText(&s, ".", 0);
1567 }
1568 cQuote = quoteChar(zName);
1569 appendText(&s, zName, cQuote);
1570 while( sqlite3_step(pStmt)==SQLITE_ROW ){
1571 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
1572 nRow++;
1573 appendText(&s, zDiv, 0);
1574 zDiv = ",";
1575 if( zCol==0 ) zCol = "";
1576 cQuote = quoteChar(zCol);
1577 appendText(&s, zCol, cQuote);
1578 }
1579 appendText(&s, ")", 0);
1580 sqlite3_finalize(pStmt);
1581 if( nRow==0 ){
1582 freeText(&s);
1583 s.z = 0;
1584 }
1585 return s.z;
1586}
1587
1588/*
1589** SQL function: strtod(X)
1590**
1591** Use the C-library strtod() function to convert string X into a double.
1592** Used for comparing the accuracy of SQLite's internal text-to-float conversion
1593** routines against the C-library.
1594*/
1595static void shellStrtod(
1596 sqlite3_context *pCtx,
1597 int nVal,
1598 sqlite3_value **apVal
1599){
1600 char *z = (char*)sqlite3_value_text(apVal[0]);
1601 UNUSED_PARAMETER(nVal);
1602 if( z==0 ) return;
1603 sqlite3_result_double(pCtx, strtod(z,0));
1604}
1605
1606/*
1607** SQL function: dtostr(X)
1608**
1609** Use the C-library printf() function to convert real value X into a string.
1610** Used for comparing the accuracy of SQLite's internal float-to-text conversion
1611** routines against the C-library.
1612*/
1613static void shellDtostr(
1614 sqlite3_context *pCtx,
1615 int nVal,
1616 sqlite3_value **apVal
1617){
1618 double r = sqlite3_value_double(apVal[0]);
1619 int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
1620 char z[400];
1621 if( n<1 ) n = 1;
1622 if( n>350 ) n = 350;
1623 sqlite3_snprintf(sizeof(z), z, "%#+.*e", n, r);
1625}
1626
1627/*
1628** SQL function: shell_add_schema(S,X)
1629**
1630** Add the schema name X to the CREATE statement in S and return the result.
1631** Examples:
1632**
1633** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
1634**
1635** Also works on
1636**
1637** CREATE INDEX
1638** CREATE UNIQUE INDEX
1639** CREATE VIEW
1640** CREATE TRIGGER
1641** CREATE VIRTUAL TABLE
1642**
1643** This UDF is used by the .schema command to insert the schema name of
1644** attached databases into the middle of the sqlite_schema.sql field.
1645*/
1647 sqlite3_context *pCtx,
1648 int nVal,
1649 sqlite3_value **apVal
1650){
1651 static const char *aPrefix[] = {
1652 "TABLE",
1653 "INDEX",
1654 "UNIQUE INDEX",
1655 "VIEW",
1656 "TRIGGER",
1657 "VIRTUAL TABLE"
1658 };
1659 int i = 0;
1660 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
1661 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
1662 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
1663 sqlite3 *db = sqlite3_context_db_handle(pCtx);
1664 UNUSED_PARAMETER(nVal);
1665 if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
1666 for(i=0; i<ArraySize(aPrefix); i++){
1667 int n = strlen30(aPrefix[i]);
1668 if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
1669 char *z = 0;
1670 char *zFake = 0;
1671 if( zSchema ){
1672 char cQuote = quoteChar(zSchema);
1673 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
1674 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1675 }else{
1676 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1677 }
1678 }
1679 if( zName
1680 && aPrefix[i][0]=='V'
1681 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1682 ){
1683 if( z==0 ){
1684 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1685 }else{
1686 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1687 }
1688 free(zFake);
1689 }
1690 if( z ){
1692 return;
1693 }
1694 }
1695 }
1696 }
1697 sqlite3_result_value(pCtx, apVal[0]);
1698}
1699
1700/*
1701** The source code for several run-time loadable extensions is inserted
1702** below by the ../tool/mkshellc.tcl script. Before processing that included
1703** code, we need to override some macros to make the included program code
1704** work here in the middle of this regular program.
1705*/
1706#define SQLITE_EXTENSION_INIT1
1707#define SQLITE_EXTENSION_INIT2(X) (void)(X)
1708
1709#if defined(_WIN32) && defined(_MSC_VER)
1710/************************* Begin test_windirent.h ******************/
1711/*
1712** 2015 November 30
1713**
1714** The author disclaims copyright to this source code. In place of
1715** a legal notice, here is a blessing:
1716**
1717** May you do good and not evil.
1718** May you find forgiveness for yourself and forgive others.
1719** May you share freely, never taking more than you give.
1720**
1721*************************************************************************
1722** This file contains declarations for most of the opendir() family of
1723** POSIX functions on Win32 using the MSVCRT.
1724*/
1725
1726#if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
1727#define SQLITE_WINDIRENT_H
1728
1729/*
1730** We need several data types from the Windows SDK header.
1731*/
1732
1733#ifndef WIN32_LEAN_AND_MEAN
1734#define WIN32_LEAN_AND_MEAN
1735#endif
1736
1737#include "windows.h"
1738
1739/*
1740** We need several support functions from the SQLite core.
1741*/
1742
1743/* #include "sqlite3.h" */
1744
1745/*
1746** We need several things from the ANSI and MSVCRT headers.
1747*/
1748
1749#include <stdio.h>
1750#include <stdlib.h>
1751#include <errno.h>
1752#include <io.h>
1753#include <limits.h>
1754#include <sys/types.h>
1755#include <sys/stat.h>
1756
1757/*
1758** We may need several defines that should have been in "sys/stat.h".
1759*/
1760
1761#ifndef S_ISREG
1762#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1763#endif
1764
1765#ifndef S_ISDIR
1766#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1767#endif
1768
1769#ifndef S_ISLNK
1770#define S_ISLNK(mode) (0)
1771#endif
1772
1773/*
1774** We may need to provide the "mode_t" type.
1775*/
1776
1777#ifndef MODE_T_DEFINED
1778 #define MODE_T_DEFINED
1779 typedef unsigned short mode_t;
1780#endif
1781
1782/*
1783** We may need to provide the "ino_t" type.
1784*/
1785
1786#ifndef INO_T_DEFINED
1787 #define INO_T_DEFINED
1788 typedef unsigned short ino_t;
1789#endif
1790
1791/*
1792** We need to define "NAME_MAX" if it was not present in "limits.h".
1793*/
1794
1795#ifndef NAME_MAX
1796# ifdef FILENAME_MAX
1797# define NAME_MAX (FILENAME_MAX)
1798# else
1799# define NAME_MAX (260)
1800# endif
1801# define DIRENT_NAME_MAX (NAME_MAX)
1802#endif
1803
1804/*
1805** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1806*/
1807
1808#ifndef NULL_INTPTR_T
1809# define NULL_INTPTR_T ((intptr_t)(0))
1810#endif
1811
1812#ifndef BAD_INTPTR_T
1813# define BAD_INTPTR_T ((intptr_t)(-1))
1814#endif
1815
1816/*
1817** We need to provide the necessary structures and related types.
1818*/
1819
1820#ifndef DIRENT_DEFINED
1821#define DIRENT_DEFINED
1822typedef struct DIRENT DIRENT;
1823typedef DIRENT *LPDIRENT;
1824struct DIRENT {
1825 ino_t d_ino; /* Sequence number, do not use. */
1826 unsigned d_attributes; /* Win32 file attributes. */
1827 char d_name[NAME_MAX + 1]; /* Name within the directory. */
1828};
1829#endif
1830
1831#ifndef DIR_DEFINED
1832#define DIR_DEFINED
1833typedef struct DIR DIR;
1834typedef DIR *LPDIR;
1835struct DIR {
1836 intptr_t d_handle; /* Value returned by "_findfirst". */
1837 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */
1838 DIRENT d_next; /* DIRENT constructed based on "_findnext". */
1839};
1840#endif
1841
1842/*
1843** Provide a macro, for use by the implementation, to determine if a
1844** particular directory entry should be skipped over when searching for
1845** the next directory entry that should be returned by the readdir().
1846*/
1847
1848#ifndef is_filtered
1849# define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1850#endif
1851
1852/*
1853** Provide the function prototype for the POSIX compatible getenv()
1854** function. This function is not thread-safe.
1855*/
1856
1857extern const char *windirent_getenv(const char *name);
1858
1859/*
1860** Finally, we can provide the function prototypes for the opendir(),
1861** readdir(), and closedir() POSIX functions.
1862*/
1863
1864extern LPDIR opendir(const char *dirname);
1865extern LPDIRENT readdir(LPDIR dirp);
1866extern INT closedir(LPDIR dirp);
1867
1868#endif /* defined(WIN32) && defined(_MSC_VER) */
1869
1870/************************* End test_windirent.h ********************/
1871/************************* Begin test_windirent.c ******************/
1872/*
1873** 2015 November 30
1874**
1875** The author disclaims copyright to this source code. In place of
1876** a legal notice, here is a blessing:
1877**
1878** May you do good and not evil.
1879** May you find forgiveness for yourself and forgive others.
1880** May you share freely, never taking more than you give.
1881**
1882*************************************************************************
1883** This file contains code to implement most of the opendir() family of
1884** POSIX functions on Win32 using the MSVCRT.
1885*/
1886
1887#if defined(_WIN32) && defined(_MSC_VER)
1888/* #include "test_windirent.h" */
1889
1890/*
1891** Implementation of the POSIX getenv() function using the Win32 API.
1892** This function is not thread-safe.
1893*/
1894const char *windirent_getenv(
1895 const char *name
1896){
1897 static char value[32768]; /* Maximum length, per MSDN */
1898 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1899 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1900
1901 memset(value, 0, sizeof(value));
1902 dwRet = GetEnvironmentVariableA(name, value, dwSize);
1903 if( dwRet==0 || dwRet>dwSize ){
1904 /*
1905 ** The function call to GetEnvironmentVariableA() failed -OR-
1906 ** the buffer is not large enough. Either way, return NULL.
1907 */
1908 return 0;
1909 }else{
1910 /*
1911 ** The function call to GetEnvironmentVariableA() succeeded
1912 ** -AND- the buffer contains the entire value.
1913 */
1914 return value;
1915 }
1916}
1917
1918/*
1919** Implementation of the POSIX opendir() function using the MSVCRT.
1920*/
1921LPDIR opendir(
1922 const char *dirname /* Directory name, UTF8 encoding */
1923){
1924 struct _wfinddata_t data;
1925 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1926 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1927 wchar_t *b1;
1928 sqlite3_int64 sz;
1929
1930 if( dirp==NULL ) return NULL;
1931 memset(dirp, 0, sizeof(DIR));
1932
1933 /* TODO: Remove this if Unix-style root paths are not used. */
1934 if( sqlite3_stricmp(dirname, "/")==0 ){
1935 dirname = windirent_getenv("SystemDrive");
1936 }
1937
1938 memset(&data, 0, sizeof(data));
1939 sz = strlen(dirname);
1940 b1 = sqlite3_malloc64( (sz+3)*sizeof(b1[0]) );
1941 if( b1==0 ){
1942 closedir(dirp);
1943 return NULL;
1944 }
1945 sz = MultiByteToWideChar(CP_UTF8, 0, dirname, sz, b1, sz);
1946 b1[sz++] = '\\';
1947 b1[sz++] = '*';
1948 b1[sz] = 0;
1949 if( sz+1>(sqlite3_int64)namesize ){
1950 closedir(dirp);
1952 return NULL;
1953 }
1954 memcpy(data.name, b1, (sz+1)*sizeof(b1[0]));
1956 dirp->d_handle = _wfindfirst(data.name, &data);
1957
1958 if( dirp->d_handle==BAD_INTPTR_T ){
1959 closedir(dirp);
1960 return NULL;
1961 }
1962
1963 /* TODO: Remove this block to allow hidden and/or system files. */
1964 if( is_filtered(data) ){
1965next:
1966
1967 memset(&data, 0, sizeof(data));
1968 if( _wfindnext(dirp->d_handle, &data)==-1 ){
1969 closedir(dirp);
1970 return NULL;
1971 }
1972
1973 /* TODO: Remove this block to allow hidden and/or system files. */
1974 if( is_filtered(data) ) goto next;
1975 }
1976
1977 dirp->d_first.d_attributes = data.attrib;
1978 WideCharToMultiByte(CP_UTF8, 0, data.name, -1,
1979 dirp->d_first.d_name, DIRENT_NAME_MAX, 0, 0);
1980 return dirp;
1981}
1982
1983/*
1984** Implementation of the POSIX readdir() function using the MSVCRT.
1985*/
1986LPDIRENT readdir(
1987 LPDIR dirp
1988){
1989 struct _wfinddata_t data;
1990
1991 if( dirp==NULL ) return NULL;
1992
1993 if( dirp->d_first.d_ino==0 ){
1994 dirp->d_first.d_ino++;
1995 dirp->d_next.d_ino++;
1996
1997 return &dirp->d_first;
1998 }
1999
2000next:
2001
2002 memset(&data, 0, sizeof(data));
2003 if( _wfindnext(dirp->d_handle, &data)==-1 ) return NULL;
2004
2005 /* TODO: Remove this block to allow hidden and/or system files. */
2006 if( is_filtered(data) ) goto next;
2007
2008 dirp->d_next.d_ino++;
2009 dirp->d_next.d_attributes = data.attrib;
2010 WideCharToMultiByte(CP_UTF8, 0, data.name, -1,
2011 dirp->d_next.d_name, DIRENT_NAME_MAX, 0, 0);
2012 return &dirp->d_next;
2013}
2014
2015/*
2016** Implementation of the POSIX closedir() function using the MSVCRT.
2017*/
2018INT closedir(
2019 LPDIR dirp
2020){
2021 INT result = 0;
2022
2023 if( dirp==NULL ) return EINVAL;
2024
2025 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
2026 result = _findclose(dirp->d_handle);
2027 }
2028
2029 sqlite3_free(dirp);
2030 return result;
2031}
2032
2033#endif /* defined(WIN32) && defined(_MSC_VER) */
2034
2035/************************* End test_windirent.c ********************/
2036#define dirent DIRENT
2037#endif
2038/************************* Begin ../ext/misc/memtrace.c ******************/
2039/*
2040** 2019-01-21
2041**
2042** The author disclaims copyright to this source code. In place of
2043** a legal notice, here is a blessing:
2044**
2045** May you do good and not evil.
2046** May you find forgiveness for yourself and forgive others.
2047** May you share freely, never taking more than you give.
2048**
2049*************************************************************************
2050**
2051** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
2052** mechanism to add a tracing layer on top of SQLite. If this extension
2053** is registered prior to sqlite3_initialize(), it will cause all memory
2054** allocation activities to be logged on standard output, or to some other
2055** FILE specified by the initializer.
2056**
2057** This file needs to be compiled into the application that uses it.
2058**
2059** This extension is used to implement the --memtrace option of the
2060** command-line shell.
2061*/
2062#include <assert.h>
2063#include <string.h>
2064#include <stdio.h>
2065
2066/* The original memory allocation routines */
2067static sqlite3_mem_methods memtraceBase;
2068static FILE *memtraceOut;
2069
2070/* Methods that trace memory allocations */
2071static void *memtraceMalloc(int n){
2072 if( memtraceOut ){
2073 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
2075 }
2076 return memtraceBase.xMalloc(n);
2077}
2078static void memtraceFree(void *p){
2079 if( p==0 ) return;
2080 if( memtraceOut ){
2081 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
2082 }
2084}
2085static void *memtraceRealloc(void *p, int n){
2086 if( p==0 ) return memtraceMalloc(n);
2087 if( n==0 ){
2089 return 0;
2090 }
2091 if( memtraceOut ){
2092 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
2094 }
2095 return memtraceBase.xRealloc(p, n);
2096}
2097static int memtraceSize(void *p){
2098 return memtraceBase.xSize(p);
2099}
2100static int memtraceRoundup(int n){
2102}
2103static int memtraceInit(void *p){
2104 return memtraceBase.xInit(p);
2105}
2106static void memtraceShutdown(void *p){
2108}
2109
2110/* The substitute memory allocator */
2111static sqlite3_mem_methods ersaztMethods = {
2119 0
2120};
2121
2122/* Begin tracing memory allocations to out. */
2124 int rc = SQLITE_OK;
2125 if( memtraceBase.xMalloc==0 ){
2127 if( rc==SQLITE_OK ){
2129 }
2130 }
2131 memtraceOut = out;
2132 return rc;
2133}
2134
2135/* Deactivate memory tracing */
2137 int rc = SQLITE_OK;
2138 if( memtraceBase.xMalloc!=0 ){
2140 if( rc==SQLITE_OK ){
2141 memset(&memtraceBase, 0, sizeof(memtraceBase));
2142 }
2143 }
2144 memtraceOut = 0;
2145 return rc;
2146}
2147
2148/************************* End ../ext/misc/memtrace.c ********************/
2149/************************* Begin ../ext/misc/pcachetrace.c ******************/
2150/*
2151** 2023-06-21
2152**
2153** The author disclaims copyright to this source code. In place of
2154** a legal notice, here is a blessing:
2155**
2156** May you do good and not evil.
2157** May you find forgiveness for yourself and forgive others.
2158** May you share freely, never taking more than you give.
2159**
2160*************************************************************************
2161**
2162** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
2163** mechanism to add a tracing layer on top of pluggable page cache of
2164** SQLite. If this extension is registered prior to sqlite3_initialize(),
2165** it will cause all page cache activities to be logged on standard output,
2166** or to some other FILE specified by the initializer.
2167**
2168** This file needs to be compiled into the application that uses it.
2169**
2170** This extension is used to implement the --pcachetrace option of the
2171** command-line shell.
2172*/
2173#include <assert.h>
2174#include <string.h>
2175#include <stdio.h>
2176
2177/* The original page cache routines */
2178static sqlite3_pcache_methods2 pcacheBase;
2179static FILE *pcachetraceOut;
2180
2181/* Methods that trace pcache activity */
2182static int pcachetraceInit(void *pArg){
2183 int nRes;
2184 if( pcachetraceOut ){
2185 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
2186 }
2187 nRes = pcacheBase.xInit(pArg);
2188 if( pcachetraceOut ){
2189 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
2190 }
2191 return nRes;
2192}
2193static void pcachetraceShutdown(void *pArg){
2194 if( pcachetraceOut ){
2195 fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
2196 }
2198}
2199static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
2200 sqlite3_pcache *pRes;
2201 if( pcachetraceOut ){
2202 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
2203 szPage, szExtra, bPurge);
2204 }
2205 pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
2206 if( pcachetraceOut ){
2207 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
2208 szPage, szExtra, bPurge, pRes);
2209 }
2210 return pRes;
2211}
2212static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
2213 if( pcachetraceOut ){
2214 fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
2215 }
2216 pcacheBase.xCachesize(p, nCachesize);
2217}
2218static int pcachetracePagecount(sqlite3_pcache *p){
2219 int nRes;
2220 if( pcachetraceOut ){
2221 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
2222 }
2224 if( pcachetraceOut ){
2225 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
2226 }
2227 return nRes;
2228}
2229static sqlite3_pcache_page *pcachetraceFetch(
2230 sqlite3_pcache *p,
2231 unsigned key,
2232 int crFg
2233){
2234 sqlite3_pcache_page *pRes;
2235 if( pcachetraceOut ){
2236 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
2237 }
2238 pRes = pcacheBase.xFetch(p, key, crFg);
2239 if( pcachetraceOut ){
2240 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
2241 p, key, crFg, pRes);
2242 }
2243 return pRes;
2244}
2246 sqlite3_pcache *p,
2247 sqlite3_pcache_page *pPg,
2248 int bDiscard
2249){
2250 if( pcachetraceOut ){
2251 fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
2252 p, pPg, bDiscard);
2253 }
2254 pcacheBase.xUnpin(p, pPg, bDiscard);
2255}
2257 sqlite3_pcache *p,
2258 sqlite3_pcache_page *pPg,
2259 unsigned oldKey,
2260 unsigned newKey
2261){
2262 if( pcachetraceOut ){
2263 fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
2264 p, pPg, oldKey, newKey);
2265 }
2266 pcacheBase.xRekey(p, pPg, oldKey, newKey);
2267}
2268static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
2269 if( pcachetraceOut ){
2270 fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
2271 }
2273}
2274static void pcachetraceDestroy(sqlite3_pcache *p){
2275 if( pcachetraceOut ){
2276 fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
2277 }
2279}
2280static void pcachetraceShrink(sqlite3_pcache *p){
2281 if( pcachetraceOut ){
2282 fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
2283 }
2285}
2286
2287/* The substitute pcache methods */
2303
2304/* Begin tracing memory allocations to out. */
2306 int rc = SQLITE_OK;
2307 if( pcacheBase.xFetch==0 ){
2309 if( rc==SQLITE_OK ){
2311 }
2312 }
2313 pcachetraceOut = out;
2314 return rc;
2315}
2316
2317/* Deactivate memory tracing */
2319 int rc = SQLITE_OK;
2320 if( pcacheBase.xFetch!=0 ){
2322 if( rc==SQLITE_OK ){
2323 memset(&pcacheBase, 0, sizeof(pcacheBase));
2324 }
2325 }
2326 pcachetraceOut = 0;
2327 return rc;
2328}
2329
2330/************************* End ../ext/misc/pcachetrace.c ********************/
2331/************************* Begin ../ext/misc/shathree.c ******************/
2332/*
2333** 2017-03-08
2334**
2335** The author disclaims copyright to this source code. In place of
2336** a legal notice, here is a blessing:
2337**
2338** May you do good and not evil.
2339** May you find forgiveness for yourself and forgive others.
2340** May you share freely, never taking more than you give.
2341**
2342******************************************************************************
2343**
2344** This SQLite extension implements functions that compute SHA3 hashes
2345** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
2346** Three SQL functions are implemented:
2347**
2348** sha3(X,SIZE)
2349** sha3_agg(Y,SIZE)
2350** sha3_query(Z,SIZE)
2351**
2352** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
2353** X is NULL. If inputs X is text, the UTF-8 rendering of that text is
2354** used to compute the hash. If X is a BLOB, then the binary data of the
2355** blob is used to compute the hash. If X is an integer or real number,
2356** then that number if converted into UTF-8 text and the hash is computed
2357** over the text.
2358**
2359** The sha3_agg(Y) function computes the SHA3 hash of all Y inputs. Since
2360** order is important for the hash, it is recommended that the Y expression
2361** by followed by an ORDER BY clause to guarantee that the inputs occur
2362** in the desired order.
2363**
2364** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
2365** and returns a hash of their results.
2366**
2367** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm
2368** is used. If SIZE is included it must be one of the integers 224, 256,
2369** 384, or 512, to determine SHA3 hash variant that is computed.
2370**
2371** Because the sha3_agg() and sha3_query() functions compute a hash over
2372** multiple values, the values are encode to use include type information.
2373**
2374** In sha3_agg(), the sequence of bytes that gets hashed for each input
2375** Y depends on the datatype of Y:
2376**
2377** typeof(Y)='null' A single "N" is hashed. (One byte)
2378**
2379** typeof(Y)='integer' The data hash is the character "I" followed
2380** by an 8-byte big-endian binary of the
2381** 64-bit signed integer. (Nine bytes total.)
2382**
2383** typeof(Y)='real' The character "F" followed by an 8-byte
2384** big-ending binary of the double. (Nine
2385** bytes total.)
2386**
2387** typeof(Y)='text' The hash is over prefix "Tnnn:" followed
2388** by the UTF8 encoding of the text. The "nnn"
2389** in the prefix is the minimum-length decimal
2390** representation of the octet_length of the text.
2391** Notice the ":" at the end of the prefix, which
2392** is needed to separate the prefix from the
2393** content in cases where the content starts
2394** with a digit.
2395**
2396** typeof(Y)='blob' The hash is taken over prefix "Bnnn:" followed
2397** by the binary content of the blob. The "nnn"
2398** in the prefix is the minimum-length decimal
2399** representation of the byte-length of the blob.
2400**
2401** According to the rules above, all of the following SELECT statements
2402** should return TRUE:
2403**
2404** SELECT sha3(1) = sha3('1');
2405**
2406** SELECT sha3('hello') = sha3(x'68656c6c6f');
2407**
2408** WITH a(x) AS (VALUES('xyzzy'))
2409** SELECT sha3_agg(x) = sha3('T5:xyzzy') FROM a;
2410**
2411** WITH a(x) AS (VALUES(x'010203'))
2412** SELECT sha3_agg(x) = sha3(x'42333a010203') FROM a;
2413**
2414** WITH a(x) AS (VALUES(0x123456))
2415** SELECT sha3_agg(x) = sha3(x'490000000000123456') FROM a;
2416**
2417** WITH a(x) AS (VALUES(100.015625))
2418** SELECT sha3_agg(x) = sha3(x'464059010000000000') FROM a;
2419**
2420** WITH a(x) AS (VALUES(NULL))
2421** SELECT sha3_agg(x) = sha3('N') FROM a;
2422**
2423**
2424** In sha3_query(), individual column values are encoded as with
2425** sha3_agg(), but with the addition that a single "R" character is
2426** inserted at the start of each row.
2427**
2428** Note that sha3_agg() hashes rows for which Y is NULL. Add a FILTER
2429** clause if NULL rows should be excluded:
2430**
2431** SELECT sha3_agg(x ORDER BY rowid) FILTER(WHERE x NOT NULL) FROM t1;
2432*/
2433/* #include "sqlite3ext.h" */
2435#include <assert.h>
2436#include <string.h>
2437#include <stdarg.h>
2438
2439#ifndef SQLITE_AMALGAMATION
2440/* typedef sqlite3_uint64 u64; */
2441#endif /* SQLITE_AMALGAMATION */
2442
2443/******************************************************************************
2444** The Hash Engine
2445*/
2446/*
2447** Macros to determine whether the machine is big or little endian,
2448** and whether or not that determination is run-time or compile-time.
2449**
2450** For best performance, an attempt is made to guess at the byte-order
2451** using C-preprocessor macros. If that is unsuccessful, or if
2452** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
2453** at run-time.
2454*/
2455#ifndef SHA3_BYTEORDER
2456# if defined(i386) || defined(__i386__) || defined(_M_IX86) ||
2457 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) ||
2458 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) ||
2459 defined(__arm__)
2460# define SHA3_BYTEORDER 1234
2461# elif defined(sparc) || defined(__ppc__)
2462# define SHA3_BYTEORDER 4321
2463# else
2464# define SHA3_BYTEORDER 0
2465# endif
2466#endif
2467
2468
2469/*
2470** State structure for a SHA3 hash in progress
2471*/
2472typedef struct SHA3Context SHA3Context;
2474 union {
2475 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
2476 unsigned char x[1600]; /* ... or 1600 bytes */
2477 } u;
2478 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
2479 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
2480 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
2481 unsigned iSize; /* 224, 256, 358, or 512 */
2482};
2483
2484/*
2485** A single step of the Keccak mixing function for a 1600-bit state
2486*/
2487static void KeccakF1600Step(SHA3Context *p){
2488 int i;
2489 u64 b0, b1, b2, b3, b4;
2490 u64 c0, c1, c2, c3, c4;
2491 u64 d0, d1, d2, d3, d4;
2492 static const u64 RC[] = {
2493 0x0000000000000001ULL, 0x0000000000008082ULL,
2494 0x800000000000808aULL, 0x8000000080008000ULL,
2495 0x000000000000808bULL, 0x0000000080000001ULL,
2496 0x8000000080008081ULL, 0x8000000000008009ULL,
2497 0x000000000000008aULL, 0x0000000000000088ULL,
2498 0x0000000080008009ULL, 0x000000008000000aULL,
2499 0x000000008000808bULL, 0x800000000000008bULL,
2500 0x8000000000008089ULL, 0x8000000000008003ULL,
2501 0x8000000000008002ULL, 0x8000000000000080ULL,
2502 0x000000000000800aULL, 0x800000008000000aULL,
2503 0x8000000080008081ULL, 0x8000000000008080ULL,
2504 0x0000000080000001ULL, 0x8000000080008008ULL
2505 };
2506# define a00 (p->u.s[0])
2507# define a01 (p->u.s[1])
2508# define a02 (p->u.s[2])
2509# define a03 (p->u.s[3])
2510# define a04 (p->u.s[4])
2511# define a10 (p->u.s[5])
2512# define a11 (p->u.s[6])
2513# define a12 (p->u.s[7])
2514# define a13 (p->u.s[8])
2515# define a14 (p->u.s[9])
2516# define a20 (p->u.s[10])
2517# define a21 (p->u.s[11])
2518# define a22 (p->u.s[12])
2519# define a23 (p->u.s[13])
2520# define a24 (p->u.s[14])
2521# define a30 (p->u.s[15])
2522# define a31 (p->u.s[16])
2523# define a32 (p->u.s[17])
2524# define a33 (p->u.s[18])
2525# define a34 (p->u.s[19])
2526# define a40 (p->u.s[20])
2527# define a41 (p->u.s[21])
2528# define a42 (p->u.s[22])
2529# define a43 (p->u.s[23])
2530# define a44 (p->u.s[24])
2531# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
2532
2533 for(i=0; i<24; i+=4){
2534 c0 = a00^a10^a20^a30^a40;
2535 c1 = a01^a11^a21^a31^a41;
2536 c2 = a02^a12^a22^a32^a42;
2537 c3 = a03^a13^a23^a33^a43;
2538 c4 = a04^a14^a24^a34^a44;
2539 d0 = c4^ROL64(c1, 1);
2540 d1 = c0^ROL64(c2, 1);
2541 d2 = c1^ROL64(c3, 1);
2542 d3 = c2^ROL64(c4, 1);
2543 d4 = c3^ROL64(c0, 1);
2544
2545 b0 = (a00^d0);
2546 b1 = ROL64((a11^d1), 44);
2547 b2 = ROL64((a22^d2), 43);
2548 b3 = ROL64((a33^d3), 21);
2549 b4 = ROL64((a44^d4), 14);
2550 a00 = b0 ^((~b1)& b2 );
2551 a00 ^= RC[i];
2552 a11 = b1 ^((~b2)& b3 );
2553 a22 = b2 ^((~b3)& b4 );
2554 a33 = b3 ^((~b4)& b0 );
2555 a44 = b4 ^((~b0)& b1 );
2556
2557 b2 = ROL64((a20^d0), 3);
2558 b3 = ROL64((a31^d1), 45);
2559 b4 = ROL64((a42^d2), 61);
2560 b0 = ROL64((a03^d3), 28);
2561 b1 = ROL64((a14^d4), 20);
2562 a20 = b0 ^((~b1)& b2 );
2563 a31 = b1 ^((~b2)& b3 );
2564 a42 = b2 ^((~b3)& b4 );
2565 a03 = b3 ^((~b4)& b0 );
2566 a14 = b4 ^((~b0)& b1 );
2567
2568 b4 = ROL64((a40^d0), 18);
2569 b0 = ROL64((a01^d1), 1);
2570 b1 = ROL64((a12^d2), 6);
2571 b2 = ROL64((a23^d3), 25);
2572 b3 = ROL64((a34^d4), 8);
2573 a40 = b0 ^((~b1)& b2 );
2574 a01 = b1 ^((~b2)& b3 );
2575 a12 = b2 ^((~b3)& b4 );
2576 a23 = b3 ^((~b4)& b0 );
2577 a34 = b4 ^((~b0)& b1 );
2578
2579 b1 = ROL64((a10^d0), 36);
2580 b2 = ROL64((a21^d1), 10);
2581 b3 = ROL64((a32^d2), 15);
2582 b4 = ROL64((a43^d3), 56);
2583 b0 = ROL64((a04^d4), 27);
2584 a10 = b0 ^((~b1)& b2 );
2585 a21 = b1 ^((~b2)& b3 );
2586 a32 = b2 ^((~b3)& b4 );
2587 a43 = b3 ^((~b4)& b0 );
2588 a04 = b4 ^((~b0)& b1 );
2589
2590 b3 = ROL64((a30^d0), 41);
2591 b4 = ROL64((a41^d1), 2);
2592 b0 = ROL64((a02^d2), 62);
2593 b1 = ROL64((a13^d3), 55);
2594 b2 = ROL64((a24^d4), 39);
2595 a30 = b0 ^((~b1)& b2 );
2596 a41 = b1 ^((~b2)& b3 );
2597 a02 = b2 ^((~b3)& b4 );
2598 a13 = b3 ^((~b4)& b0 );
2599 a24 = b4 ^((~b0)& b1 );
2600
2601 c0 = a00^a20^a40^a10^a30;
2602 c1 = a11^a31^a01^a21^a41;
2603 c2 = a22^a42^a12^a32^a02;
2604 c3 = a33^a03^a23^a43^a13;
2605 c4 = a44^a14^a34^a04^a24;
2606 d0 = c4^ROL64(c1, 1);
2607 d1 = c0^ROL64(c2, 1);
2608 d2 = c1^ROL64(c3, 1);
2609 d3 = c2^ROL64(c4, 1);
2610 d4 = c3^ROL64(c0, 1);
2611
2612 b0 = (a00^d0);
2613 b1 = ROL64((a31^d1), 44);
2614 b2 = ROL64((a12^d2), 43);
2615 b3 = ROL64((a43^d3), 21);
2616 b4 = ROL64((a24^d4), 14);
2617 a00 = b0 ^((~b1)& b2 );
2618 a00 ^= RC[i+1];
2619 a31 = b1 ^((~b2)& b3 );
2620 a12 = b2 ^((~b3)& b4 );
2621 a43 = b3 ^((~b4)& b0 );
2622 a24 = b4 ^((~b0)& b1 );
2623
2624 b2 = ROL64((a40^d0), 3);
2625 b3 = ROL64((a21^d1), 45);
2626 b4 = ROL64((a02^d2), 61);
2627 b0 = ROL64((a33^d3), 28);
2628 b1 = ROL64((a14^d4), 20);
2629 a40 = b0 ^((~b1)& b2 );
2630 a21 = b1 ^((~b2)& b3 );
2631 a02 = b2 ^((~b3)& b4 );
2632 a33 = b3 ^((~b4)& b0 );
2633 a14 = b4 ^((~b0)& b1 );
2634
2635 b4 = ROL64((a30^d0), 18);
2636 b0 = ROL64((a11^d1), 1);
2637 b1 = ROL64((a42^d2), 6);
2638 b2 = ROL64((a23^d3), 25);
2639 b3 = ROL64((a04^d4), 8);
2640 a30 = b0 ^((~b1)& b2 );
2641 a11 = b1 ^((~b2)& b3 );
2642 a42 = b2 ^((~b3)& b4 );
2643 a23 = b3 ^((~b4)& b0 );
2644 a04 = b4 ^((~b0)& b1 );
2645
2646 b1 = ROL64((a20^d0), 36);
2647 b2 = ROL64((a01^d1), 10);
2648 b3 = ROL64((a32^d2), 15);
2649 b4 = ROL64((a13^d3), 56);
2650 b0 = ROL64((a44^d4), 27);
2651 a20 = b0 ^((~b1)& b2 );
2652 a01 = b1 ^((~b2)& b3 );
2653 a32 = b2 ^((~b3)& b4 );
2654 a13 = b3 ^((~b4)& b0 );
2655 a44 = b4 ^((~b0)& b1 );
2656
2657 b3 = ROL64((a10^d0), 41);
2658 b4 = ROL64((a41^d1), 2);
2659 b0 = ROL64((a22^d2), 62);
2660 b1 = ROL64((a03^d3), 55);
2661 b2 = ROL64((a34^d4), 39);
2662 a10 = b0 ^((~b1)& b2 );
2663 a41 = b1 ^((~b2)& b3 );
2664 a22 = b2 ^((~b3)& b4 );
2665 a03 = b3 ^((~b4)& b0 );
2666 a34 = b4 ^((~b0)& b1 );
2667
2668 c0 = a00^a40^a30^a20^a10;
2669 c1 = a31^a21^a11^a01^a41;
2670 c2 = a12^a02^a42^a32^a22;
2671 c3 = a43^a33^a23^a13^a03;
2672 c4 = a24^a14^a04^a44^a34;
2673 d0 = c4^ROL64(c1, 1);
2674 d1 = c0^ROL64(c2, 1);
2675 d2 = c1^ROL64(c3, 1);
2676 d3 = c2^ROL64(c4, 1);
2677 d4 = c3^ROL64(c0, 1);
2678
2679 b0 = (a00^d0);
2680 b1 = ROL64((a21^d1), 44);
2681 b2 = ROL64((a42^d2), 43);
2682 b3 = ROL64((a13^d3), 21);
2683 b4 = ROL64((a34^d4), 14);
2684 a00 = b0 ^((~b1)& b2 );
2685 a00 ^= RC[i+2];
2686 a21 = b1 ^((~b2)& b3 );
2687 a42 = b2 ^((~b3)& b4 );
2688 a13 = b3 ^((~b4)& b0 );
2689 a34 = b4 ^((~b0)& b1 );
2690
2691 b2 = ROL64((a30^d0), 3);
2692 b3 = ROL64((a01^d1), 45);
2693 b4 = ROL64((a22^d2), 61);
2694 b0 = ROL64((a43^d3), 28);
2695 b1 = ROL64((a14^d4), 20);
2696 a30 = b0 ^((~b1)& b2 );
2697 a01 = b1 ^((~b2)& b3 );
2698 a22 = b2 ^((~b3)& b4 );
2699 a43 = b3 ^((~b4)& b0 );
2700 a14 = b4 ^((~b0)& b1 );
2701
2702 b4 = ROL64((a10^d0), 18);
2703 b0 = ROL64((a31^d1), 1);
2704 b1 = ROL64((a02^d2), 6);
2705 b2 = ROL64((a23^d3), 25);
2706 b3 = ROL64((a44^d4), 8);
2707 a10 = b0 ^((~b1)& b2 );
2708 a31 = b1 ^((~b2)& b3 );
2709 a02 = b2 ^((~b3)& b4 );
2710 a23 = b3 ^((~b4)& b0 );
2711 a44 = b4 ^((~b0)& b1 );
2712
2713 b1 = ROL64((a40^d0), 36);
2714 b2 = ROL64((a11^d1), 10);
2715 b3 = ROL64((a32^d2), 15);
2716 b4 = ROL64((a03^d3), 56);
2717 b0 = ROL64((a24^d4), 27);
2718 a40 = b0 ^((~b1)& b2 );
2719 a11 = b1 ^((~b2)& b3 );
2720 a32 = b2 ^((~b3)& b4 );
2721 a03 = b3 ^((~b4)& b0 );
2722 a24 = b4 ^((~b0)& b1 );
2723
2724 b3 = ROL64((a20^d0), 41);
2725 b4 = ROL64((a41^d1), 2);
2726 b0 = ROL64((a12^d2), 62);
2727 b1 = ROL64((a33^d3), 55);
2728 b2 = ROL64((a04^d4), 39);
2729 a20 = b0 ^((~b1)& b2 );
2730 a41 = b1 ^((~b2)& b3 );
2731 a12 = b2 ^((~b3)& b4 );
2732 a33 = b3 ^((~b4)& b0 );
2733 a04 = b4 ^((~b0)& b1 );
2734
2735 c0 = a00^a30^a10^a40^a20;
2736 c1 = a21^a01^a31^a11^a41;
2737 c2 = a42^a22^a02^a32^a12;
2738 c3 = a13^a43^a23^a03^a33;
2739 c4 = a34^a14^a44^a24^a04;
2740 d0 = c4^ROL64(c1, 1);
2741 d1 = c0^ROL64(c2, 1);
2742 d2 = c1^ROL64(c3, 1);
2743 d3 = c2^ROL64(c4, 1);
2744 d4 = c3^ROL64(c0, 1);
2745
2746 b0 = (a00^d0);
2747 b1 = ROL64((a01^d1), 44);
2748 b2 = ROL64((a02^d2), 43);
2749 b3 = ROL64((a03^d3), 21);
2750 b4 = ROL64((a04^d4), 14);
2751 a00 = b0 ^((~b1)& b2 );
2752 a00 ^= RC[i+3];
2753 a01 = b1 ^((~b2)& b3 );
2754 a02 = b2 ^((~b3)& b4 );
2755 a03 = b3 ^((~b4)& b0 );
2756 a04 = b4 ^((~b0)& b1 );
2757
2758 b2 = ROL64((a10^d0), 3);
2759 b3 = ROL64((a11^d1), 45);
2760 b4 = ROL64((a12^d2), 61);
2761 b0 = ROL64((a13^d3), 28);
2762 b1 = ROL64((a14^d4), 20);
2763 a10 = b0 ^((~b1)& b2 );
2764 a11 = b1 ^((~b2)& b3 );
2765 a12 = b2 ^((~b3)& b4 );
2766 a13 = b3 ^((~b4)& b0 );
2767 a14 = b4 ^((~b0)& b1 );
2768
2769 b4 = ROL64((a20^d0), 18);
2770 b0 = ROL64((a21^d1), 1);
2771 b1 = ROL64((a22^d2), 6);
2772 b2 = ROL64((a23^d3), 25);
2773 b3 = ROL64((a24^d4), 8);
2774 a20 = b0 ^((~b1)& b2 );
2775 a21 = b1 ^((~b2)& b3 );
2776 a22 = b2 ^((~b3)& b4 );
2777 a23 = b3 ^((~b4)& b0 );
2778 a24 = b4 ^((~b0)& b1 );
2779
2780 b1 = ROL64((a30^d0), 36);
2781 b2 = ROL64((a31^d1), 10);
2782 b3 = ROL64((a32^d2), 15);
2783 b4 = ROL64((a33^d3), 56);
2784 b0 = ROL64((a34^d4), 27);
2785 a30 = b0 ^((~b1)& b2 );
2786 a31 = b1 ^((~b2)& b3 );
2787 a32 = b2 ^((~b3)& b4 );
2788 a33 = b3 ^((~b4)& b0 );
2789 a34 = b4 ^((~b0)& b1 );
2790
2791 b3 = ROL64((a40^d0), 41);
2792 b4 = ROL64((a41^d1), 2);
2793 b0 = ROL64((a42^d2), 62);
2794 b1 = ROL64((a43^d3), 55);
2795 b2 = ROL64((a44^d4), 39);
2796 a40 = b0 ^((~b1)& b2 );
2797 a41 = b1 ^((~b2)& b3 );
2798 a42 = b2 ^((~b3)& b4 );
2799 a43 = b3 ^((~b4)& b0 );
2800 a44 = b4 ^((~b0)& b1 );
2801 }
2802}
2803
2804/*
2805** Initialize a new hash. iSize determines the size of the hash
2806** in bits and should be one of 224, 256, 384, or 512. Or iSize
2807** can be zero to use the default hash size of 256 bits.
2808*/
2809static void SHA3Init(SHA3Context *p, int iSize){
2810 memset(p, 0, sizeof(*p));
2811 p->iSize = iSize;
2812 if( iSize>=128 && iSize<=512 ){
2813 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
2814 }else{
2815 p->nRate = (1600 - 2*256)/8;
2816 }
2817#if SHA3_BYTEORDER==1234
2818 /* Known to be little-endian at compile-time. No-op */
2819#elif SHA3_BYTEORDER==4321
2820 p->ixMask = 7; /* Big-endian */
2821#else
2822 {
2823 static unsigned int one = 1;
2824 if( 1==*(unsigned char*)&one ){
2825 /* Little endian. No byte swapping. */
2826 p->ixMask = 0;
2827 }else{
2828 /* Big endian. Byte swap. */
2829 p->ixMask = 7;
2830 }
2831 }
2832#endif
2833}
2834
2835/*
2836** Make consecutive calls to the SHA3Update function to add new content
2837** to the hash
2838*/
2839static void SHA3Update(
2840 SHA3Context *p,
2841 const unsigned char *aData,
2842 unsigned int nData
2843){
2844 unsigned int i = 0;
2845 if( aData==0 ) return;
2846#if SHA3_BYTEORDER==1234
2847 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
2848 for(; i+7<nData; i+=8){
2849 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
2850 p->nLoaded += 8;
2851 if( p->nLoaded>=p->nRate ){
2853 p->nLoaded = 0;
2854 }
2855 }
2856 }
2857#endif
2858 for(; i<nData; i++){
2859#if SHA3_BYTEORDER==1234
2860 p->u.x[p->nLoaded] ^= aData[i];
2861#elif SHA3_BYTEORDER==4321
2862 p->u.x[p->nLoaded^0x07] ^= aData[i];
2863#else
2864 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
2865#endif
2866 p->nLoaded++;
2867 if( p->nLoaded==p->nRate ){
2869 p->nLoaded = 0;
2870 }
2871 }
2872}
2873
2874/*
2875** After all content has been added, invoke SHA3Final() to compute
2876** the final hash. The function returns a pointer to the binary
2877** hash value.
2878*/
2879static unsigned char *SHA3Final(SHA3Context *p){
2880 unsigned int i;
2881 if( p->nLoaded==p->nRate-1 ){
2882 const unsigned char c1 = 0x86;
2883 SHA3Update(p, &c1, 1);
2884 }else{
2885 const unsigned char c2 = 0x06;
2886 const unsigned char c3 = 0x80;
2887 SHA3Update(p, &c2, 1);
2888 p->nLoaded = p->nRate - 1;
2889 SHA3Update(p, &c3, 1);
2890 }
2891 for(i=0; i<p->nRate; i++){
2892 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
2893 }
2894 return &p->u.x[p->nRate];
2895}
2896/* End of the hashing logic
2897*****************************************************************************/
2898
2899/*
2900** Implementation of the sha3(X,SIZE) function.
2901**
2902** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
2903** size is 256. If X is a BLOB, it is hashed as is.
2904** For all other non-NULL types of input, X is converted into a UTF-8 string
2905** and the string is hashed without the trailing 0x00 terminator. The hash
2906** of a NULL value is NULL.
2907*/
2908static void sha3Func(
2909 sqlite3_context *context,
2910 int argc,
2911 sqlite3_value **argv
2912){
2913 SHA3Context cx;
2914 int eType = sqlite3_value_type(argv[0]);
2915 int nByte = sqlite3_value_bytes(argv[0]);
2916 int iSize;
2917 if( argc==1 ){
2918 iSize = 256;
2919 }else{
2920 iSize = sqlite3_value_int(argv[1]);
2921 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
2922 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
2923 "384 512", -1);
2924 return;
2925 }
2926 }
2927 if( eType==SQLITE_NULL ) return;
2928 SHA3Init(&cx, iSize);
2929 if( eType==SQLITE_BLOB ){
2930 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
2931 }else{
2932 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
2933 }
2935}
2936
2937/* Compute a string using sqlite3_vsnprintf() with a maximum length
2938** of 50 bytes and add it to the hash.
2939*/
2941 SHA3Context *p, /* Add content to this context */
2942 const char *zFormat,
2943 ...
2944){
2945 va_list ap;
2946 int n;
2947 char zBuf[50];
2948 va_start(ap, zFormat);
2949 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
2950 va_end(ap);
2951 n = (int)strlen(zBuf);
2952 SHA3Update(p, (unsigned char*)zBuf, n);
2953}
2954
2955/*
2956** Update a SHA3Context using a single sqlite3_value.
2957*/
2958static void sha3UpdateFromValue(SHA3Context *p, sqlite3_value *pVal){
2959 switch( sqlite3_value_type(pVal) ){
2960 case SQLITE_NULL: {
2961 SHA3Update(p, (const unsigned char*)"N",1);
2962 break;
2963 }
2964 case SQLITE_INTEGER: {
2966 int j;
2967 unsigned char x[9];
2969 memcpy(&u, &v, 8);
2970 for(j=8; j>=1; j--){
2971 x[j] = u & 0xff;
2972 u >>= 8;
2973 }
2974 x[0] = 'I';
2975 SHA3Update(p, x, 9);
2976 break;
2977 }
2978 case SQLITE_FLOAT: {
2980 int j;
2981 unsigned char x[9];
2982 double r = sqlite3_value_double(pVal);
2983 memcpy(&u, &r, 8);
2984 for(j=8; j>=1; j--){
2985 x[j] = u & 0xff;
2986 u >>= 8;
2987 }
2988 x[0] = 'F';
2989 SHA3Update(p,x,9);
2990 break;
2991 }
2992 case SQLITE_TEXT: {
2993 int n2 = sqlite3_value_bytes(pVal);
2994 const unsigned char *z2 = sqlite3_value_text(pVal);
2995 sha3_step_vformat(p,"T%d:",n2);
2996 SHA3Update(p, z2, n2);
2997 break;
2998 }
2999 case SQLITE_BLOB: {
3000 int n2 = sqlite3_value_bytes(pVal);
3001 const unsigned char *z2 = sqlite3_value_blob(pVal);
3002 sha3_step_vformat(p,"B%d:",n2);
3003 SHA3Update(p, z2, n2);
3004 break;
3005 }
3006 }
3007}
3008
3009/*
3010** Implementation of the sha3_query(SQL,SIZE) function.
3011**
3012** This function compiles and runs the SQL statement(s) given in the
3013** argument. The results are hashed using a SIZE-bit SHA3. The default
3014** size is 256.
3015**
3016** The format of the byte stream that is hashed is summarized as follows:
3017**
3018** S<n>:<sql>
3019** R
3020** N
3021** I<int>
3022** F<ieee-float>
3023** B<size>:<bytes>
3024** T<size>:<text>
3025**
3026** <sql> is the original SQL text for each statement run and <n> is
3027** the size of that text. The SQL text is UTF-8. A single R character
3028** occurs before the start of each row. N means a NULL value.
3029** I mean an 8-byte little-endian integer <int>. F is a floating point
3030** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
3031** B means blobs of <size> bytes. T means text rendered as <size>
3032** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
3033** text integers.
3034**
3035** For each SQL statement in the X input, there is one S segment. Each
3036** S segment is followed by zero or more R segments, one for each row in the
3037** result set. After each R, there are one or more N, I, F, B, or T segments,
3038** one for each column in the result set. Segments are concatentated directly
3039** with no delimiters of any kind.
3040*/
3041static void sha3QueryFunc(
3042 sqlite3_context *context,
3043 int argc,
3044 sqlite3_value **argv
3045){
3046 sqlite3 *db = sqlite3_context_db_handle(context);
3047 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
3048 sqlite3_stmt *pStmt = 0;
3049 int nCol; /* Number of columns in the result set */
3050 int i; /* Loop counter */
3051 int rc;
3052 int n;
3053 const char *z;
3054 SHA3Context cx;
3055 int iSize;
3056
3057 if( argc==1 ){
3058 iSize = 256;
3059 }else{
3060 iSize = sqlite3_value_int(argv[1]);
3061 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
3062 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
3063 "384 512", -1);
3064 return;
3065 }
3066 }
3067 if( zSql==0 ) return;
3068 SHA3Init(&cx, iSize);
3069 while( zSql[0] ){
3070 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
3071 if( rc ){
3072 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
3073 zSql, sqlite3_errmsg(db));
3074 sqlite3_finalize(pStmt);
3075 sqlite3_result_error(context, zMsg, -1);
3076 sqlite3_free(zMsg);
3077 return;
3078 }
3079 if( !sqlite3_stmt_readonly(pStmt) ){
3080 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
3081 sqlite3_finalize(pStmt);
3082 sqlite3_result_error(context, zMsg, -1);
3083 sqlite3_free(zMsg);
3084 return;
3085 }
3086 nCol = sqlite3_column_count(pStmt);
3087 z = sqlite3_sql(pStmt);
3088 if( z ){
3089 n = (int)strlen(z);
3090 sha3_step_vformat(&cx,"S%d:",n);
3091 SHA3Update(&cx,(unsigned char*)z,n);
3092 }
3093
3094 /* Compute a hash over the result of the query */
3095 while( SQLITE_ROW==sqlite3_step(pStmt) ){
3096 SHA3Update(&cx,(const unsigned char*)"R",1);
3097 for(i=0; i<nCol; i++){
3099 }
3100 }
3101 sqlite3_finalize(pStmt);
3102 }
3104}
3105
3106/*
3107** xStep function for sha3_agg().
3108*/
3109static void sha3AggStep(
3110 sqlite3_context *context,
3111 int argc,
3112 sqlite3_value **argv
3113){
3114 SHA3Context *p;
3115 p = (SHA3Context*)sqlite3_aggregate_context(context, sizeof(*p));
3116 if( p==0 ) return;
3117 if( p->nRate==0 ){
3118 int sz = 256;
3119 if( argc==2 ){
3120 sz = sqlite3_value_int(argv[1]);
3121 if( sz!=224 && sz!=384 && sz!=512 ){
3122 sz = 256;
3123 }
3124 }
3125 SHA3Init(p, sz);
3126 }
3127 sha3UpdateFromValue(p, argv[0]);
3128}
3129
3130
3131/*
3132** xFinal function for sha3_agg().
3133*/
3134static void sha3AggFinal(sqlite3_context *context){
3135 SHA3Context *p;
3136 p = (SHA3Context*)sqlite3_aggregate_context(context, sizeof(*p));
3137 if( p==0 ) return;
3138 if( p->iSize ){
3140 }
3141}
3142
3143
3144
3145#ifdef _WIN32
3146
3147#endif
3149 sqlite3 *db,
3150 char **pzErrMsg,
3151 const sqlite3_api_routines *pApi
3152){
3153 int rc = SQLITE_OK;
3155 (void)pzErrMsg; /* Unused parameter */
3156 rc = sqlite3_create_function(db, "sha3", 1,
3158 0, sha3Func, 0, 0);
3159 if( rc==SQLITE_OK ){
3160 rc = sqlite3_create_function(db, "sha3", 2,
3162 0, sha3Func, 0, 0);
3163 }
3164 if( rc==SQLITE_OK ){
3165 rc = sqlite3_create_function(db, "sha3_agg", 1,
3168 }
3169 if( rc==SQLITE_OK ){
3170 rc = sqlite3_create_function(db, "sha3_agg", 2,
3173 }
3174 if( rc==SQLITE_OK ){
3175 rc = sqlite3_create_function(db, "sha3_query", 1,
3177 0, sha3QueryFunc, 0, 0);
3178 }
3179 if( rc==SQLITE_OK ){
3180 rc = sqlite3_create_function(db, "sha3_query", 2,
3182 0, sha3QueryFunc, 0, 0);
3183 }
3184 return rc;
3185}
3186
3187/************************* End ../ext/misc/shathree.c ********************/
3188/************************* Begin ../ext/misc/sha1.c ******************/
3189/*
3190** 2017-01-27
3191**
3192** The author disclaims copyright to this source code. In place of
3193** a legal notice, here is a blessing:
3194**
3195** May you do good and not evil.
3196** May you find forgiveness for yourself and forgive others.
3197** May you share freely, never taking more than you give.
3198**
3199******************************************************************************
3200**
3201** This SQLite extension implements functions that compute SHA1 hashes.
3202** Two SQL functions are implemented:
3203**
3204** sha1(X)
3205** sha1_query(Y)
3206**
3207** The sha1(X) function computes the SHA1 hash of the input X, or NULL if
3208** X is NULL.
3209**
3210** The sha1_query(Y) function evalutes all queries in the SQL statements of Y
3211** and returns a hash of their results.
3212*/
3213/* #include "sqlite3ext.h" */
3215#include <assert.h>
3216#include <string.h>
3217#include <stdarg.h>
3218
3219/******************************************************************************
3220** The Hash Engine
3221*/
3222/* Context for the SHA1 hash */
3223typedef struct SHA1Context SHA1Context;
3225 unsigned int state[5];
3226 unsigned int count[2];
3227 unsigned char buffer[64];
3228};
3229
3230#define SHA_ROT(x,l,r) ((x) << (l) | (x) >> (r))
3231#define rol(x,k) SHA_ROT(x,k,32-(k))
3232#define ror(x,k) SHA_ROT(x,32-(k),k)
3233
3234#define blk0le(i) (block[i] = (ror(block[i],8)&0xFF00FF00)
3235 |(rol(block[i],8)&0x00FF00FF))
3236#define blk0be(i) block[i]
3237#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15]
3238 ^block[(i+2)&15]^block[i&15],1))
3239
3240/*
3241 * (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1
3242 *
3243 * Rl0() for little-endian and Rb0() for big-endian. Endianness is
3244 * determined at run-time.
3245 */
3246#define Rl0(v,w,x,y,z,i)
3247 z+=((w&(x^y))^y)+blk0le(i)+0x5A827999+rol(v,5);w=ror(w,2);
3248#define Rb0(v,w,x,y,z,i)
3249 z+=((w&(x^y))^y)+blk0be(i)+0x5A827999+rol(v,5);w=ror(w,2);
3250#define R1(v,w,x,y,z,i)
3251 z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=ror(w,2);
3252#define R2(v,w,x,y,z,i)
3253 z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=ror(w,2);
3254#define R3(v,w,x,y,z,i)
3255 z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=ror(w,2);
3256#define R4(v,w,x,y,z,i)
3257 z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=ror(w,2);
3258
3259/*
3260 * Hash a single 512-bit block. This is the core of the algorithm.
3261 */
3262static void SHA1Transform(unsigned int state[5], const unsigned char buffer[64]){
3263 unsigned int qq[5]; /* a, b, c, d, e; */
3264 static int one = 1;
3265 unsigned int block[16];
3266 memcpy(block, buffer, 64);
3267 memcpy(qq,state,5*sizeof(unsigned int));
3268
3269#define a qq[0]
3270#define b qq[1]
3271#define c qq[2]
3272#define d qq[3]
3273#define e qq[4]
3274
3275 /* Copy p->state[] to working vars */
3276 /*
3277 a = state[0];
3278 b = state[1];
3279 c = state[2];
3280 d = state[3];
3281 e = state[4];
3282 */
3283
3284 /* 4 rounds of 20 operations each. Loop unrolled. */
3285 if( 1 == *(unsigned char*)&one ){
3286 Rl0(a,b,c,d,e, 0); Rl0(e,a,b,c,d, 1); Rl0(d,e,a,b,c, 2); Rl0(c,d,e,a,b, 3);
3287 Rl0(b,c,d,e,a, 4); Rl0(a,b,c,d,e, 5); Rl0(e,a,b,c,d, 6); Rl0(d,e,a,b,c, 7);
3288 Rl0(c,d,e,a,b, 8); Rl0(b,c,d,e,a, 9); Rl0(a,b,c,d,e,10); Rl0(e,a,b,c,d,11);
3289 Rl0(d,e,a,b,c,12); Rl0(c,d,e,a,b,13); Rl0(b,c,d,e,a,14); Rl0(a,b,c,d,e,15);
3290 }else{
3291 Rb0(a,b,c,d,e, 0); Rb0(e,a,b,c,d, 1); Rb0(d,e,a,b,c, 2); Rb0(c,d,e,a,b, 3);
3292 Rb0(b,c,d,e,a, 4); Rb0(a,b,c,d,e, 5); Rb0(e,a,b,c,d, 6); Rb0(d,e,a,b,c, 7);
3293 Rb0(c,d,e,a,b, 8); Rb0(b,c,d,e,a, 9); Rb0(a,b,c,d,e,10); Rb0(e,a,b,c,d,11);
3294 Rb0(d,e,a,b,c,12); Rb0(c,d,e,a,b,13); Rb0(b,c,d,e,a,14); Rb0(a,b,c,d,e,15);
3295 }
3296 R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
3297 R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
3298 R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
3299 R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
3300 R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
3301 R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
3302 R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
3303 R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
3304 R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
3305 R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
3306 R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
3307 R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
3308 R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
3309 R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
3310 R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
3311 R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
3312
3313 /* Add the working vars back into context.state[] */
3314 state[0] += a;
3315 state[1] += b;
3316 state[2] += c;
3317 state[3] += d;
3318 state[4] += e;
3319
3320#undef a
3321#undef b
3322#undef c
3323#undef d
3324#undef e
3325}
3326
3327
3328/* Initialize a SHA1 context */
3329static void hash_init(SHA1Context *p){
3330 /* SHA1 initialization constants */
3331 p->state[0] = 0x67452301;
3332 p->state[1] = 0xEFCDAB89;
3333 p->state[2] = 0x98BADCFE;
3334 p->state[3] = 0x10325476;
3335 p->state[4] = 0xC3D2E1F0;
3336 p->count[0] = p->count[1] = 0;
3337}
3338
3339/* Add new content to the SHA1 hash */
3340static void hash_step(
3341 SHA1Context *p, /* Add content to this context */
3342 const unsigned char *data, /* Data to be added */
3343 unsigned int len /* Number of bytes in data */
3344){
3345 unsigned int i, j;
3346
3347 j = p->count[0];
3348 if( (p->count[0] += len << 3) < j ){
3349 p->count[1] += (len>>29)+1;
3350 }
3351 j = (j >> 3) & 63;
3352 if( (j + len) > 63 ){
3353 (void)memcpy(&p->buffer[j], data, (i = 64-j));
3355 for(; i + 63 < len; i += 64){
3356 SHA1Transform(p->state, &data[i]);
3357 }
3358 j = 0;
3359 }else{
3360 i = 0;
3361 }
3362 (void)memcpy(&p->buffer[j], &data[i], len - i);
3363}
3364
3365/* Compute a string using sqlite3_vsnprintf() and hash it */
3367 SHA1Context *p, /* Add content to this context */
3368 const char *zFormat,
3369 ...
3370){
3371 va_list ap;
3372 int n;
3373 char zBuf[50];
3374 va_start(ap, zFormat);
3375 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
3376 va_end(ap);
3377 n = (int)strlen(zBuf);
3378 hash_step(p, (unsigned char*)zBuf, n);
3379}
3380
3381
3382/* Add padding and compute the message digest. Render the
3383** message digest as lower-case hexadecimal and put it into
3384** zOut[]. zOut[] must be at least 41 bytes long. */
3385static void hash_finish(
3386 SHA1Context *p, /* The SHA1 context to finish and render */
3387 char *zOut, /* Store hex or binary hash here */
3388 int bAsBinary /* 1 for binary hash, 0 for hex hash */
3389){
3390 unsigned int i;
3391 unsigned char finalcount[8];
3392 unsigned char digest[20];
3393 static const char zEncode[] = "0123456789abcdef";
3394
3395 for (i = 0; i < 8; i++){
3396 finalcount[i] = (unsigned char)((p->count[(i >= 4 ? 0 : 1)]
3397 >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
3398 }
3399 hash_step(p, (const unsigned char *)"\200", 1);
3400 while ((p->count[0] & 504) != 448){
3401 hash_step(p, (const unsigned char *)"\0", 1);
3402 }
3403 hash_step(p, finalcount, 8); /* Should cause a SHA1Transform() */
3404 for (i = 0; i < 20; i++){
3405 digest[i] = (unsigned char)((p->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
3406 }
3407 if( bAsBinary ){
3408 memcpy(zOut, digest, 20);
3409 }else{
3410 for(i=0; i<20; i++){
3411 zOut[i*2] = zEncode[(digest[i]>>4)&0xf];
3412 zOut[i*2+1] = zEncode[digest[i] & 0xf];
3413 }
3414 zOut[i*2]= 0;
3415 }
3416}
3417/* End of the hashing logic
3418*****************************************************************************/
3419
3420/*
3421** Implementation of the sha1(X) function.
3422**
3423** Return a lower-case hexadecimal rendering of the SHA1 hash of the
3424** argument X. If X is a BLOB, it is hashed as is. For all other
3425** types of input, X is converted into a UTF-8 string and the string
3426** is hash without the trailing 0x00 terminator. The hash of a NULL
3427** value is NULL.
3428*/
3429static void sha1Func(
3430 sqlite3_context *context,
3431 int argc,
3432 sqlite3_value **argv
3433){
3434 SHA1Context cx;
3435 int eType = sqlite3_value_type(argv[0]);
3436 int nByte = sqlite3_value_bytes(argv[0]);
3437 char zOut[44];
3438
3439 assert( argc==1 );
3440 if( eType==SQLITE_NULL ) return;
3441 hash_init(&cx);
3442 if( eType==SQLITE_BLOB ){
3443 hash_step(&cx, sqlite3_value_blob(argv[0]), nByte);
3444 }else{
3445 hash_step(&cx, sqlite3_value_text(argv[0]), nByte);
3446 }
3447 if( sqlite3_user_data(context)!=0 ){
3448 hash_finish(&cx, zOut, 1);
3450 }else{
3451 hash_finish(&cx, zOut, 0);
3453 }
3454}
3455
3456/*
3457** Implementation of the sha1_query(SQL) function.
3458**
3459** This function compiles and runs the SQL statement(s) given in the
3460** argument. The results are hashed using SHA1 and that hash is returned.
3461**
3462** The original SQL text is included as part of the hash.
3463**
3464** The hash is not just a concatenation of the outputs. Each query
3465** is delimited and each row and value within the query is delimited,
3466** with all values being marked with their datatypes.
3467*/
3468static void sha1QueryFunc(
3469 sqlite3_context *context,
3470 int argc,
3471 sqlite3_value **argv
3472){
3473 sqlite3 *db = sqlite3_context_db_handle(context);
3474 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
3475 sqlite3_stmt *pStmt = 0;
3476 int nCol; /* Number of columns in the result set */
3477 int i; /* Loop counter */
3478 int rc;
3479 int n;
3480 const char *z;
3481 SHA1Context cx;
3482 char zOut[44];
3483
3484 assert( argc==1 );
3485 if( zSql==0 ) return;
3486 hash_init(&cx);
3487 while( zSql[0] ){
3488 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
3489 if( rc ){
3490 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
3491 zSql, sqlite3_errmsg(db));
3492 sqlite3_finalize(pStmt);
3493 sqlite3_result_error(context, zMsg, -1);
3494 sqlite3_free(zMsg);
3495 return;
3496 }
3497 if( !sqlite3_stmt_readonly(pStmt) ){
3498 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
3499 sqlite3_finalize(pStmt);
3500 sqlite3_result_error(context, zMsg, -1);
3501 sqlite3_free(zMsg);
3502 return;
3503 }
3504 nCol = sqlite3_column_count(pStmt);
3505 z = sqlite3_sql(pStmt);
3506 n = (int)strlen(z);
3507 hash_step_vformat(&cx,"S%d:",n);
3508 hash_step(&cx,(unsigned char*)z,n);
3509
3510 /* Compute a hash over the result of the query */
3511 while( SQLITE_ROW==sqlite3_step(pStmt) ){
3512 hash_step(&cx,(const unsigned char*)"R",1);
3513 for(i=0; i<nCol; i++){
3514 switch( sqlite3_column_type(pStmt,i) ){
3515 case SQLITE_NULL: {
3516 hash_step(&cx, (const unsigned char*)"N",1);
3517 break;
3518 }
3519 case SQLITE_INTEGER: {
3521 int j;
3522 unsigned char x[9];
3524 memcpy(&u, &v, 8);
3525 for(j=8; j>=1; j--){
3526 x[j] = u & 0xff;
3527 u >>= 8;
3528 }
3529 x[0] = 'I';
3530 hash_step(&cx, x, 9);
3531 break;
3532 }
3533 case SQLITE_FLOAT: {
3535 int j;
3536 unsigned char x[9];
3537 double r = sqlite3_column_double(pStmt,i);
3538 memcpy(&u, &r, 8);
3539 for(j=8; j>=1; j--){
3540 x[j] = u & 0xff;
3541 u >>= 8;
3542 }
3543 x[0] = 'F';
3544 hash_step(&cx,x,9);
3545 break;
3546 }
3547 case SQLITE_TEXT: {
3548 int n2 = sqlite3_column_bytes(pStmt, i);
3549 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
3550 hash_step_vformat(&cx,"T%d:",n2);
3551 hash_step(&cx, z2, n2);
3552 break;
3553 }
3554 case SQLITE_BLOB: {
3555 int n2 = sqlite3_column_bytes(pStmt, i);
3556 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
3557 hash_step_vformat(&cx,"B%d:",n2);
3558 hash_step(&cx, z2, n2);
3559 break;
3560 }
3561 }
3562 }
3563 }
3564 sqlite3_finalize(pStmt);
3565 }
3566 hash_finish(&cx, zOut, 0);
3568}
3569
3570
3571#ifdef _WIN32
3572
3573#endif
3575 sqlite3 *db,
3576 char **pzErrMsg,
3577 const sqlite3_api_routines *pApi
3578){
3579 int rc = SQLITE_OK;
3580 static int one = 1;
3582 (void)pzErrMsg; /* Unused parameter */
3583 rc = sqlite3_create_function(db, "sha1", 1,
3585 0, sha1Func, 0, 0);
3586 if( rc==SQLITE_OK ){
3587 rc = sqlite3_create_function(db, "sha1b", 1,
3589 (void*)&one, sha1Func, 0, 0);
3590 }
3591 if( rc==SQLITE_OK ){
3592 rc = sqlite3_create_function(db, "sha1_query", 1,
3594 sha1QueryFunc, 0, 0);
3595 }
3596 return rc;
3597}
3598
3599/************************* End ../ext/misc/sha1.c ********************/
3600/************************* Begin ../ext/misc/uint.c ******************/
3601/*
3602** 2020-04-14
3603**
3604** The author disclaims copyright to this source code. In place of
3605** a legal notice, here is a blessing:
3606**
3607** May you do good and not evil.
3608** May you find forgiveness for yourself and forgive others.
3609** May you share freely, never taking more than you give.
3610**
3611******************************************************************************
3612**
3613** This SQLite extension implements the UINT collating sequence.
3614**
3615** UINT works like BINARY for text, except that embedded strings
3616** of digits compare in numeric order.
3617**
3618** * Leading zeros are handled properly, in the sense that
3619** they do not mess of the magnitude comparison of embedded
3620** strings of digits. "x00123y" is equal to "x123y".
3621**
3622** * Only unsigned integers are recognized. Plus and minus
3623** signs are ignored. Decimal points and exponential notation
3624** are ignored.
3625**
3626** * Embedded integers can be of arbitrary length. Comparison
3627** is *not* limited integers that can be expressed as a
3628** 64-bit machine integer.
3629*/
3630/* #include "sqlite3ext.h" */
3632#include <assert.h>
3633#include <string.h>
3634#include <ctype.h>
3635
3636/*
3637** Compare text in lexicographic order, except strings of digits
3638** compare in numeric order.
3639*/
3640static int uintCollFunc(
3641 void *notUsed,
3642 int nKey1, const void *pKey1,
3643 int nKey2, const void *pKey2
3644){
3645 const unsigned char *zA = (const unsigned char*)pKey1;
3646 const unsigned char *zB = (const unsigned char*)pKey2;
3647 int i=0, j=0, x;
3648 (void)notUsed;
3649 while( i<nKey1 && j<nKey2 ){
3650 x = zA[i] - zB[j];
3651 if( isdigit(zA[i]) ){
3652 int k;
3653 if( !isdigit(zB[j]) ) return x;
3654 while( i<nKey1 && zA[i]=='0' ){ i++; }
3655 while( j<nKey2 && zB[j]=='0' ){ j++; }
3656 k = 0;
3657 while( i+k<nKey1 && isdigit(zA[i+k])
3658 && j+k<nKey2 && isdigit(zB[j+k]) ){
3659 k++;
3660 }
3661 if( i+k<nKey1 && isdigit(zA[i+k]) ){
3662 return +1;
3663 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
3664 return -1;
3665 }else{
3666 x = memcmp(zA+i, zB+j, k);
3667 if( x ) return x;
3668 i += k;
3669 j += k;
3670 }
3671 }else if( x ){
3672 return x;
3673 }else{
3674 i++;
3675 j++;
3676 }
3677 }
3678 return (nKey1 - i) - (nKey2 - j);
3679}
3680
3681#ifdef _WIN32
3682
3683#endif
3685 sqlite3 *db,
3686 char **pzErrMsg,
3687 const sqlite3_api_routines *pApi
3688){
3690 (void)pzErrMsg; /* Unused parameter */
3692}
3693
3694/************************* End ../ext/misc/uint.c ********************/
3695/************************* Begin ../ext/misc/decimal.c ******************/
3696/*
3697** 2020-06-22
3698**
3699** The author disclaims copyright to this source code. In place of
3700** a legal notice, here is a blessing:
3701**
3702** May you do good and not evil.
3703** May you find forgiveness for yourself and forgive others.
3704** May you share freely, never taking more than you give.
3705**
3706******************************************************************************
3707**
3708** Routines to implement arbitrary-precision decimal math.
3709**
3710** The focus here is on simplicity and correctness, not performance.
3711*/
3712/* #include "sqlite3ext.h" */
3714#include <assert.h>
3715#include <string.h>
3716#include <ctype.h>
3717#include <stdlib.h>
3718
3719/* Mark a function parameter as unused, to suppress nuisance compiler
3720** warnings. */
3721#ifndef UNUSED_PARAMETER
3722# define UNUSED_PARAMETER(X) (void)(X)
3723#endif
3724
3725#ifndef IsSpace
3726#define IsSpace(X) isspace((unsigned char)X)
3727#endif
3728
3729/* A decimal object */
3730typedef struct Decimal Decimal;
3731struct Decimal {
3732 char sign; /* 0 for positive, 1 for negative */
3733 char oom; /* True if an OOM is encountered */
3734 char isNull; /* True if holds a NULL rather than a number */
3735 char isInit; /* True upon initialization */
3736 int nDigit; /* Total number of digits */
3737 int nFrac; /* Number of digits to the right of the decimal point */
3738 signed char *a; /* Array of digits. Most significant first. */
3739};
3740
3741/*
3742** Release memory held by a Decimal, but do not free the object itself.
3743*/
3744static void decimal_clear(Decimal *p){
3746}
3747
3748/*
3749** Destroy a Decimal object
3750*/
3751static void decimal_free(Decimal *p){
3752 if( p ){
3755 }
3756}
3757
3758/*
3759** Allocate a new Decimal object initialized to the text in zIn[].
3760** Return NULL if any kind of error occurs.
3761*/
3762static Decimal *decimalNewFromText(const char *zIn, int n){
3763 Decimal *p = 0;
3764 int i;
3765 int iExp = 0;
3766
3767 p = sqlite3_malloc( sizeof(*p) );
3768 if( p==0 ) goto new_from_text_failed;
3769 p->sign = 0;
3770 p->oom = 0;
3771 p->isInit = 1;
3772 p->isNull = 0;
3773 p->nDigit = 0;
3774 p->nFrac = 0;
3775 p->a = sqlite3_malloc64( n+1 );
3776 if( p->a==0 ) goto new_from_text_failed;
3777 for(i=0; IsSpace(zIn[i]); i++){}
3778 if( zIn[i]=='-' ){
3779 p->sign = 1;
3780 i++;
3781 }else if( zIn[i]=='+' ){
3782 i++;
3783 }
3784 while( i<n && zIn[i]=='0' ) i++;
3785 while( i<n ){
3786 char c = zIn[i];
3787 if( c>='0' && c<='9' ){
3788 p->a[p->nDigit++] = c - '0';
3789 }else if( c=='.' ){
3790 p->nFrac = p->nDigit + 1;
3791 }else if( c=='e' || c=='E' ){
3792 int j = i+1;
3793 int neg = 0;
3794 if( j>=n ) break;
3795 if( zIn[j]=='-' ){
3796 neg = 1;
3797 j++;
3798 }else if( zIn[j]=='+' ){
3799 j++;
3800 }
3801 while( j<n && iExp<1000000 ){
3802 if( zIn[j]>='0' && zIn[j]<='9' ){
3803 iExp = iExp*10 + zIn[j] - '0';
3804 }
3805 j++;
3806 }
3807 if( neg ) iExp = -iExp;
3808 break;
3809 }
3810 i++;
3811 }
3812 if( p->nFrac ){
3813 p->nFrac = p->nDigit - (p->nFrac - 1);
3814 }
3815 if( iExp>0 ){
3816 if( p->nFrac>0 ){
3817 if( iExp<=p->nFrac ){
3818 p->nFrac -= iExp;
3819 iExp = 0;
3820 }else{
3821 iExp -= p->nFrac;
3822 p->nFrac = 0;
3823 }
3824 }
3825 if( iExp>0 ){
3826 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
3827 if( p->a==0 ) goto new_from_text_failed;
3828 memset(p->a+p->nDigit, 0, iExp);
3829 p->nDigit += iExp;
3830 }
3831 }else if( iExp<0 ){
3832 int nExtra;
3833 iExp = -iExp;
3834 nExtra = p->nDigit - p->nFrac - 1;
3835 if( nExtra ){
3836 if( nExtra>=iExp ){
3837 p->nFrac += iExp;
3838 iExp = 0;
3839 }else{
3840 iExp -= nExtra;
3841 p->nFrac = p->nDigit - 1;
3842 }
3843 }
3844 if( iExp>0 ){
3845 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
3846 if( p->a==0 ) goto new_from_text_failed;
3847 memmove(p->a+iExp, p->a, p->nDigit);
3848 memset(p->a, 0, iExp);
3849 p->nDigit += iExp;
3850 p->nFrac += iExp;
3851 }
3852 }
3853 return p;
3854
3855new_from_text_failed:
3856 if( p ){
3857 if( p->a ) sqlite3_free(p->a);
3859 }
3860 return 0;
3861}
3862
3863/* Forward reference */
3864static Decimal *decimalFromDouble(double);
3865
3866/*
3867** Allocate a new Decimal object from an sqlite3_value. Return a pointer
3868** to the new object, or NULL if there is an error. If the pCtx argument
3869** is not NULL, then errors are reported on it as well.
3870**
3871** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
3872** directly into a Decimal. For SQLITE_FLOAT or for SQLITE_BLOB of length
3873** 8 bytes, the resulting double value is expanded into its decimal equivalent.
3874** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
3875** then NULL is returned.
3876*/
3877static Decimal *decimal_new(
3878 sqlite3_context *pCtx, /* Report error here, if not null */
3879 sqlite3_value *pIn, /* Construct the decimal object from this */
3880 int bTextOnly /* Always interpret pIn as text if true */
3881){
3882 Decimal *p = 0;
3883 int eType = sqlite3_value_type(pIn);
3884 if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
3885 eType = SQLITE_TEXT;
3886 }
3887 switch( eType ){
3888 case SQLITE_TEXT:
3889 case SQLITE_INTEGER: {
3890 const char *zIn = (const char*)sqlite3_value_text(pIn);
3891 int n = sqlite3_value_bytes(pIn);
3892 p = decimalNewFromText(zIn, n);
3893 if( p==0 ) goto new_failed;
3894 break;
3895 }
3896
3897 case SQLITE_FLOAT: {
3899 break;
3900 }
3901
3902 case SQLITE_BLOB: {
3903 const unsigned char *x;
3904 unsigned int i;
3905 sqlite3_uint64 v = 0;
3906 double r;
3907
3908 if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
3909 x = sqlite3_value_blob(pIn);
3910 for(i=0; i<sizeof(r); i++){
3911 v = (v<<8) | x[i];
3912 }
3913 memcpy(&r, &v, sizeof(r));
3915 break;
3916 }
3917
3918 case SQLITE_NULL: {
3919 break;
3920 }
3921 }
3922 return p;
3923
3924new_failed:
3925 if( pCtx ) sqlite3_result_error_nomem(pCtx);
3927 return 0;
3928}
3929
3930/*
3931** Make the given Decimal the result.
3932*/
3933static void decimal_result(sqlite3_context *pCtx, Decimal *p){
3934 char *z;
3935 int i, j;
3936 int n;
3937 if( p==0 || p->oom ){
3939 return;
3940 }
3941 if( p->isNull ){
3943 return;
3944 }
3945 z = sqlite3_malloc( p->nDigit+4 );
3946 if( z==0 ){
3948 return;
3949 }
3950 i = 0;
3951 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
3952 p->sign = 0;
3953 }
3954 if( p->sign ){
3955 z[0] = '-';
3956 i = 1;
3957 }
3958 n = p->nDigit - p->nFrac;
3959 if( n<=0 ){
3960 z[i++] = '0';
3961 }
3962 j = 0;
3963 while( n>1 && p->a[j]==0 ){
3964 j++;
3965 n--;
3966 }
3967 while( n>0 ){
3968 z[i++] = p->a[j] + '0';
3969 j++;
3970 n--;
3971 }
3972 if( p->nFrac ){
3973 z[i++] = '.';
3974 do{
3975 z[i++] = p->a[j] + '0';
3976 j++;
3977 }while( j<p->nDigit );
3978 }
3979 z[i] = 0;
3981}
3982
3983/*
3984** Make the given Decimal the result in an format similar to '%+#e'.
3985** In other words, show exponential notation with leading and trailing
3986** zeros omitted.
3987*/
3988static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
3989 char *z; /* The output buffer */
3990 int i; /* Loop counter */
3991 int nZero; /* Number of leading zeros */
3992 int nDigit; /* Number of digits not counting trailing zeros */
3993 int nFrac; /* Digits to the right of the decimal point */
3994 int exp; /* Exponent value */
3995 signed char zero; /* Zero value */
3996 signed char *a; /* Array of digits */
3997
3998 if( p==0 || p->oom ){
4000 return;
4001 }
4002 if( p->isNull ){
4004 return;
4005 }
4006 for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
4007 for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
4008 nFrac = p->nFrac + (nDigit - p->nDigit);
4009 nDigit -= nZero;
4010 z = sqlite3_malloc( nDigit+20 );
4011 if( z==0 ){
4013 return;
4014 }
4015 if( nDigit==0 ){
4016 zero = 0;
4017 a = &zero;
4018 nDigit = 1;
4019 nFrac = 0;
4020 }else{
4021 a = &p->a[nZero];
4022 }
4023 if( p->sign && nDigit>0 ){
4024 z[0] = '-';
4025 }else{
4026 z[0] = '+';
4027 }
4028 z[1] = a[0]+'0';
4029 z[2] = '.';
4030 if( nDigit==1 ){
4031 z[3] = '0';
4032 i = 4;
4033 }else{
4034 for(i=1; i<nDigit; i++){
4035 z[2+i] = a[i]+'0';
4036 }
4037 i = nDigit+2;
4038 }
4039 exp = nDigit - nFrac - 1;
4040 sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
4042}
4043
4044/*
4045** Compare to Decimal objects. Return negative, 0, or positive if the
4046** first object is less than, equal to, or greater than the second.
4047**
4048** Preconditions for this routine:
4049**
4050** pA!=0
4051** pA->isNull==0
4052** pB!=0
4053** pB->isNull==0
4054*/
4055static int decimal_cmp(const Decimal *pA, const Decimal *pB){
4056 int nASig, nBSig, rc, n;
4057 if( pA->sign!=pB->sign ){
4058 return pA->sign ? -1 : +1;
4059 }
4060 if( pA->sign ){
4061 const Decimal *pTemp = pA;
4062 pA = pB;
4063 pB = pTemp;
4064 }
4065 nASig = pA->nDigit - pA->nFrac;
4066 nBSig = pB->nDigit - pB->nFrac;
4067 if( nASig!=nBSig ){
4068 return nASig - nBSig;
4069 }
4070 n = pA->nDigit;
4071 if( n>pB->nDigit ) n = pB->nDigit;
4072 rc = memcmp(pA->a, pB->a, n);
4073 if( rc==0 ){
4074 rc = pA->nDigit - pB->nDigit;
4075 }
4076 return rc;
4077}
4078
4079/*
4080** SQL Function: decimal_cmp(X, Y)
4081**
4082** Return negative, zero, or positive if X is less then, equal to, or
4083** greater than Y.
4084*/
4085static void decimalCmpFunc(
4086 sqlite3_context *context,
4087 int argc,
4088 sqlite3_value **argv
4089){
4090 Decimal *pA = 0, *pB = 0;
4091 int rc;
4092
4093 UNUSED_PARAMETER(argc);
4094 pA = decimal_new(context, argv[0], 1);
4095 if( pA==0 || pA->isNull ) goto cmp_done;
4096 pB = decimal_new(context, argv[1], 1);
4097 if( pB==0 || pB->isNull ) goto cmp_done;
4098 rc = decimal_cmp(pA, pB);
4099 if( rc<0 ) rc = -1;
4100 else if( rc>0 ) rc = +1;
4101 sqlite3_result_int(context, rc);
4102cmp_done:
4105}
4106
4107/*
4108** Expand the Decimal so that it has a least nDigit digits and nFrac
4109** digits to the right of the decimal point.
4110*/
4111static void decimal_expand(Decimal *p, int nDigit, int nFrac){
4112 int nAddSig;
4113 int nAddFrac;
4114 if( p==0 ) return;
4115 nAddFrac = nFrac - p->nFrac;
4116 nAddSig = (nDigit - p->nDigit) - nAddFrac;
4117 if( nAddFrac==0 && nAddSig==0 ) return;
4118 p->a = sqlite3_realloc64(p->a, nDigit+1);
4119 if( p->a==0 ){
4120 p->oom = 1;
4121 return;
4122 }
4123 if( nAddSig ){
4124 memmove(p->a+nAddSig, p->a, p->nDigit);
4125 memset(p->a, 0, nAddSig);
4126 p->nDigit += nAddSig;
4127 }
4128 if( nAddFrac ){
4129 memset(p->a+p->nDigit, 0, nAddFrac);
4130 p->nDigit += nAddFrac;
4131 p->nFrac += nAddFrac;
4132 }
4133}
4134
4135/*
4136** Add the value pB into pA. A := A + B.
4137**
4138** Both pA and pB might become denormalized by this routine.
4139*/
4140static void decimal_add(Decimal *pA, Decimal *pB){
4141 int nSig, nFrac, nDigit;
4142 int i, rc;
4143 if( pA==0 ){
4144 return;
4145 }
4146 if( pA->oom || pB==0 || pB->oom ){
4147 pA->oom = 1;
4148 return;
4149 }
4150 if( pA->isNull || pB->isNull ){
4151 pA->isNull = 1;
4152 return;
4153 }
4154 nSig = pA->nDigit - pA->nFrac;
4155 if( nSig && pA->a[0]==0 ) nSig--;
4156 if( nSig<pB->nDigit-pB->nFrac ){
4157 nSig = pB->nDigit - pB->nFrac;
4158 }
4159 nFrac = pA->nFrac;
4160 if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
4161 nDigit = nSig + nFrac + 1;
4162 decimal_expand(pA, nDigit, nFrac);
4163 decimal_expand(pB, nDigit, nFrac);
4164 if( pA->oom || pB->oom ){
4165 pA->oom = 1;
4166 }else{
4167 if( pA->sign==pB->sign ){
4168 int carry = 0;
4169 for(i=nDigit-1; i>=0; i--){
4170 int x = pA->a[i] + pB->a[i] + carry;
4171 if( x>=10 ){
4172 carry = 1;
4173 pA->a[i] = x - 10;
4174 }else{
4175 carry = 0;
4176 pA->a[i] = x;
4177 }
4178 }
4179 }else{
4180 signed char *aA, *aB;
4181 int borrow = 0;
4182 rc = memcmp(pA->a, pB->a, nDigit);
4183 if( rc<0 ){
4184 aA = pB->a;
4185 aB = pA->a;
4186 pA->sign = !pA->sign;
4187 }else{
4188 aA = pA->a;
4189 aB = pB->a;
4190 }
4191 for(i=nDigit-1; i>=0; i--){
4192 int x = aA[i] - aB[i] - borrow;
4193 if( x<0 ){
4194 pA->a[i] = x+10;
4195 borrow = 1;
4196 }else{
4197 pA->a[i] = x;
4198 borrow = 0;
4199 }
4200 }
4201 }
4202 }
4203}
4204
4205/*
4206** Multiply A by B. A := A * B
4207**
4208** All significant digits after the decimal point are retained.
4209** Trailing zeros after the decimal point are omitted as long as
4210** the number of digits after the decimal point is no less than
4211** either the number of digits in either input.
4212*/
4213static void decimalMul(Decimal *pA, Decimal *pB){
4214 signed char *acc = 0;
4215 int i, j, k;
4216 int minFrac;
4217
4218 if( pA==0 || pA->oom || pA->isNull
4219 || pB==0 || pB->oom || pB->isNull
4220 ){
4221 goto mul_end;
4222 }
4223 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
4224 if( acc==0 ){
4225 pA->oom = 1;
4226 goto mul_end;
4227 }
4228 memset(acc, 0, pA->nDigit + pB->nDigit + 2);
4229 minFrac = pA->nFrac;
4230 if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
4231 for(i=pA->nDigit-1; i>=0; i--){
4232 signed char f = pA->a[i];
4233 int carry = 0, x;
4234 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
4235 x = acc[k] + f*pB->a[j] + carry;
4236 acc[k] = x%10;
4237 carry = x/10;
4238 }
4239 x = acc[k] + carry;
4240 acc[k] = x%10;
4241 acc[k-1] += x/10;
4242 }
4244 pA->a = acc;
4245 acc = 0;
4246 pA->nDigit += pB->nDigit + 2;
4247 pA->nFrac += pB->nFrac;
4248 pA->sign ^= pB->sign;
4249 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
4250 pA->nFrac--;
4251 pA->nDigit--;
4252 }
4253
4254mul_end:
4255 sqlite3_free(acc);
4256}
4257
4258/*
4259** Create a new Decimal object that contains an integer power of 2.
4260*/
4261static Decimal *decimalPow2(int N){
4262 Decimal *pA = 0; /* The result to be returned */
4263 Decimal *pX = 0; /* Multiplier */
4264 if( N<-20000 || N>20000 ) goto pow2_fault;
4265 pA = decimalNewFromText("1.0", 3);
4266 if( pA==0 || pA->oom ) goto pow2_fault;
4267 if( N==0 ) return pA;
4268 if( N>0 ){
4269 pX = decimalNewFromText("2.0", 3);
4270 }else{
4271 N = -N;
4272 pX = decimalNewFromText("0.5", 3);
4273 }
4274 if( pX==0 || pX->oom ) goto pow2_fault;
4275 while( 1 /* Exit by break */ ){
4276 if( N & 1 ){
4277 decimalMul(pA, pX);
4278 if( pA->oom ) goto pow2_fault;
4279 }
4280 N >>= 1;
4281 if( N==0 ) break;
4282 decimalMul(pX, pX);
4283 }
4285 return pA;
4286
4287pow2_fault:
4290 return 0;
4291}
4292
4293/*
4294** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
4295*/
4296static Decimal *decimalFromDouble(double r){
4297 sqlite3_int64 m, a;
4298 int e;
4299 int isNeg;
4300 Decimal *pA;
4301 Decimal *pX;
4302 char zNum[100];
4303 if( r<0.0 ){
4304 isNeg = 1;
4305 r = -r;
4306 }else{
4307 isNeg = 0;
4308 }
4309 memcpy(&a,&r,sizeof(a));
4310 if( a==0 ){
4311 e = 0;
4312 m = 0;
4313 }else{
4314 e = a>>52;
4315 m = a & ((((sqlite3_int64)1)<<52)-1);
4316 if( e==0 ){
4317 m <<= 1;
4318 }else{
4319 m |= ((sqlite3_int64)1)<<52;
4320 }
4321 while( e<1075 && m>0 && (m&1)==0 ){
4322 m >>= 1;
4323 e++;
4324 }
4325 if( isNeg ) m = -m;
4326 e = e - 1075;
4327 if( e>971 ){
4328 return 0; /* A NaN or an Infinity */
4329 }
4330 }
4331
4332 /* At this point m is the integer significand and e is the exponent */
4333 sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
4334 pA = decimalNewFromText(zNum, (int)strlen(zNum));
4335 pX = decimalPow2(e);
4336 decimalMul(pA, pX);
4338 return pA;
4339}
4340
4341/*
4342** SQL Function: decimal(X)
4343** OR: decimal_exp(X)
4344**
4345** Convert input X into decimal and then back into text.
4346**
4347** If X is originally a float, then a full decimal expansion of that floating
4348** point value is done. Or if X is an 8-byte blob, it is interpreted
4349** as a float and similarly expanded.
4350**
4351** The decimal_exp(X) function returns the result in exponential notation.
4352** decimal(X) returns a complete decimal, without the e+NNN at the end.
4353*/
4354static void decimalFunc(
4355 sqlite3_context *context,
4356 int argc,
4357 sqlite3_value **argv
4358){
4359 Decimal *p = decimal_new(context, argv[0], 0);
4360 UNUSED_PARAMETER(argc);
4361 if( p ){
4362 if( sqlite3_user_data(context)!=0 ){
4363 decimal_result_sci(context, p);
4364 }else{
4365 decimal_result(context, p);
4366 }
4368 }
4369}
4370
4371/*
4372** Compare text in decimal order.
4373*/
4375 void *notUsed,
4376 int nKey1, const void *pKey1,
4377 int nKey2, const void *pKey2
4378){
4379 const unsigned char *zA = (const unsigned char*)pKey1;
4380 const unsigned char *zB = (const unsigned char*)pKey2;
4381 Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
4382 Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
4383 int rc;
4384 UNUSED_PARAMETER(notUsed);
4385 if( pA==0 || pB==0 ){
4386 rc = 0;
4387 }else{
4388 rc = decimal_cmp(pA, pB);
4389 }
4392 return rc;
4393}
4394
4395
4396/*
4397** SQL Function: decimal_add(X, Y)
4398** decimal_sub(X, Y)
4399**
4400** Return the sum or difference of X and Y.
4401*/
4402static void decimalAddFunc(
4403 sqlite3_context *context,
4404 int argc,
4405 sqlite3_value **argv
4406){
4407 Decimal *pA = decimal_new(context, argv[0], 1);
4408 Decimal *pB = decimal_new(context, argv[1], 1);
4409 UNUSED_PARAMETER(argc);
4410 decimal_add(pA, pB);
4411 decimal_result(context, pA);
4414}
4415static void decimalSubFunc(
4416 sqlite3_context *context,
4417 int argc,
4418 sqlite3_value **argv
4419){
4420 Decimal *pA = decimal_new(context, argv[0], 1);
4421 Decimal *pB = decimal_new(context, argv[1], 1);
4422 UNUSED_PARAMETER(argc);
4423 if( pB ){
4424 pB->sign = !pB->sign;
4425 decimal_add(pA, pB);
4426 decimal_result(context, pA);
4427 }
4430}
4431
4432/* Aggregate function: decimal_sum(X)
4433**
4434** Works like sum() except that it uses decimal arithmetic for unlimited
4435** precision.
4436*/
4437static void decimalSumStep(
4438 sqlite3_context *context,
4439 int argc,
4440 sqlite3_value **argv
4441){
4442 Decimal *p;
4443 Decimal *pArg;
4444 UNUSED_PARAMETER(argc);
4445 p = sqlite3_aggregate_context(context, sizeof(*p));
4446 if( p==0 ) return;
4447 if( !p->isInit ){
4448 p->isInit = 1;
4450 if( p->a==0 ){
4451 p->oom = 1;
4452 }else{
4453 p->a[0] = 0;
4454 }
4455 p->nDigit = 1;
4456 p->nFrac = 0;
4457 }
4458 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4459 pArg = decimal_new(context, argv[0], 1);
4460 decimal_add(p, pArg);
4461 decimal_free(pArg);
4462}
4464 sqlite3_context *context,
4465 int argc,
4466 sqlite3_value **argv
4467){
4468 Decimal *p;
4469 Decimal *pArg;
4470 UNUSED_PARAMETER(argc);
4471 p = sqlite3_aggregate_context(context, sizeof(*p));
4472 if( p==0 ) return;
4473 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4474 pArg = decimal_new(context, argv[0], 1);
4475 if( pArg ) pArg->sign = !pArg->sign;
4476 decimal_add(p, pArg);
4477 decimal_free(pArg);
4478}
4479static void decimalSumValue(sqlite3_context *context){
4480 Decimal *p = sqlite3_aggregate_context(context, 0);
4481 if( p==0 ) return;
4482 decimal_result(context, p);
4483}
4484static void decimalSumFinalize(sqlite3_context *context){
4485 Decimal *p = sqlite3_aggregate_context(context, 0);
4486 if( p==0 ) return;
4487 decimal_result(context, p);
4489}
4490
4491/*
4492** SQL Function: decimal_mul(X, Y)
4493**
4494** Return the product of X and Y.
4495*/
4496static void decimalMulFunc(
4497 sqlite3_context *context,
4498 int argc,
4499 sqlite3_value **argv
4500){
4501 Decimal *pA = decimal_new(context, argv[0], 1);
4502 Decimal *pB = decimal_new(context, argv[1], 1);
4503 UNUSED_PARAMETER(argc);
4504 if( pA==0 || pA->oom || pA->isNull
4505 || pB==0 || pB->oom || pB->isNull
4506 ){
4507 goto mul_end;
4508 }
4509 decimalMul(pA, pB);
4510 if( pA->oom ){
4511 goto mul_end;
4512 }
4513 decimal_result(context, pA);
4514
4515mul_end:
4518}
4519
4520/*
4521** SQL Function: decimal_pow2(N)
4522**
4523** Return the N-th power of 2. N must be an integer.
4524*/
4526 sqlite3_context *context,
4527 int argc,
4528 sqlite3_value **argv
4529){
4530 UNUSED_PARAMETER(argc);
4532 Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
4533 decimal_result_sci(context, pA);
4535 }
4536}
4537
4538#ifdef _WIN32
4539
4540#endif
4542 sqlite3 *db,
4543 char **pzErrMsg,
4544 const sqlite3_api_routines *pApi
4545){
4546 int rc = SQLITE_OK;
4547 static const struct {
4548 const char *zFuncName;
4549 int nArg;
4550 int iArg;
4551 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
4552 } aFunc[] = {
4553 { "decimal", 1, 0, decimalFunc },
4554 { "decimal_exp", 1, 1, decimalFunc },
4555 { "decimal_cmp", 2, 0, decimalCmpFunc },
4556 { "decimal_add", 2, 0, decimalAddFunc },
4557 { "decimal_sub", 2, 0, decimalSubFunc },
4558 { "decimal_mul", 2, 0, decimalMulFunc },
4559 { "decimal_pow2", 1, 0, decimalPow2Func },
4560 };
4561 unsigned int i;
4562 (void)pzErrMsg; /* Unused parameter */
4563
4565
4566 for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
4567 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
4569 aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
4570 }
4571 if( rc==SQLITE_OK ){
4572 rc = sqlite3_create_window_function(db, "decimal_sum", 1,
4576 }
4577 if( rc==SQLITE_OK ){
4580 }
4581 return rc;
4582}
4583
4584/************************* End ../ext/misc/decimal.c ********************/
4585/************************* Begin ../ext/misc/percentile.c ******************/
4586/*
4587** 2013-05-28
4588**
4589** The author disclaims copyright to this source code. In place of
4590** a legal notice, here is a blessing:
4591**
4592** May you do good and not evil.
4593** May you find forgiveness for yourself and forgive others.
4594** May you share freely, never taking more than you give.
4595**
4596******************************************************************************
4597**
4598** This file contains code to implement the percentile(Y,P) SQL function
4599** and similar as described below:
4600**
4601** (1) The percentile(Y,P) function is an aggregate function taking
4602** exactly two arguments.
4603**
4604** (2) If the P argument to percentile(Y,P) is not the same for every
4605** row in the aggregate then an error is thrown. The word "same"
4606** in the previous sentence means that the value differ by less
4607** than 0.001.
4608**
4609** (3) If the P argument to percentile(Y,P) evaluates to anything other
4610** than a number in the range of 0.0 to 100.0 inclusive then an
4611** error is thrown.
4612**
4613** (4) If any Y argument to percentile(Y,P) evaluates to a value that
4614** is not NULL and is not numeric then an error is thrown.
4615**
4616** (5) If any Y argument to percentile(Y,P) evaluates to plus or minus
4617** infinity then an error is thrown. (SQLite always interprets NaN
4618** values as NULL.)
4619**
4620** (6) Both Y and P in percentile(Y,P) can be arbitrary expressions,
4621** including CASE WHEN expressions.
4622**
4623** (7) The percentile(Y,P) aggregate is able to handle inputs of at least
4624** one million (1,000,000) rows.
4625**
4626** (8) If there are no non-NULL values for Y, then percentile(Y,P)
4627** returns NULL.
4628**
4629** (9) If there is exactly one non-NULL value for Y, the percentile(Y,P)
4630** returns the one Y value.
4631**
4632** (10) If there N non-NULL values of Y where N is two or more and
4633** the Y values are ordered from least to greatest and a graph is
4634** drawn from 0 to N-1 such that the height of the graph at J is
4635** the J-th Y value and such that straight lines are drawn between
4636** adjacent Y values, then the percentile(Y,P) function returns
4637** the height of the graph at P*(N-1)/100.
4638**
4639** (11) The percentile(Y,P) function always returns either a floating
4640** point number or NULL.
4641**
4642** (12) The percentile(Y,P) is implemented as a single C99 source-code
4643** file that compiles into a shared-library or DLL that can be loaded
4644** into SQLite using the sqlite3_load_extension() interface.
4645**
4646** (13) A separate median(Y) function is the equivalent percentile(Y,50).
4647**
4648** (14) A separate percentile_cont(Y,P) function is equivalent to
4649** percentile(Y,P/100.0). In other words, the fraction value in
4650** the second argument is in the range of 0 to 1 instead of 0 to 100.
4651**
4652** (15) A separate percentile_disc(Y,P) function is like
4653** percentile_cont(Y,P) except that instead of returning the weighted
4654** average of the nearest two input values, it returns the next lower
4655** value. So the percentile_disc(Y,P) will always return a value
4656** that was one of the inputs.
4657**
4658** (16) All of median(), percentile(Y,P), percentile_cont(Y,P) and
4659** percentile_disc(Y,P) can be used as window functions.
4660**
4661** Differences from standard SQL:
4662**
4663** * The percentile_cont(X,P) function is equivalent to the following in
4664** standard SQL:
4665**
4666** (percentile_cont(P) WITHIN GROUP (ORDER BY X))
4667**
4668** The SQLite syntax is much more compact. The standard SQL syntax
4669** is also supported if SQLite is compiled with the
4670** -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES option.
4671**
4672** * No median(X) function exists in the SQL standard. App developers
4673** are expected to write "percentile_cont(0.5)WITHIN GROUP(ORDER BY X)".
4674**
4675** * No percentile(Y,P) function exists in the SQL standard. Instead of
4676** percential(Y,P), developers must write this:
4677** "percentile_cont(P/100.0) WITHIN GROUP (ORDER BY Y)". Note that
4678** the fraction parameter to percentile() goes from 0 to 100 whereas
4679** the fraction parameter in SQL standard percentile_cont() goes from
4680** 0 to 1.
4681**
4682** Implementation notes as of 2024-08-31:
4683**
4684** * The regular aggregate-function versions of these routines work
4685** by accumulating all values in an array of doubles, then sorting
4686** that array using quicksort before computing the answer. Thus
4687** the runtime is O(NlogN) where N is the number of rows of input.
4688**
4689** * For the window-function versions of these routines, the array of
4690** inputs is sorted as soon as the first value is computed. Thereafter,
4691** the array is kept in sorted order using an insert-sort. This
4692** results in O(N*K) performance where K is the size of the window.
4693** One can imagine alternative implementations that give O(N*logN*logK)
4694** performance, but they require more complex logic and data structures.
4695** The developers have elected to keep the asymptotically slower
4696** algorithm for now, for simplicity, under the theory that window
4697** functions are seldom used and when they are, the window size K is
4698** often small. The developers might revisit that decision later,
4699** should the need arise.
4700*/
4701#if defined(SQLITE3_H)
4702 /* no-op */
4703#elif defined(SQLITE_STATIC_PERCENTILE)
4704/* # include "sqlite3.h" */
4705#else
4706/* # include "sqlite3ext.h" */
4707 SQLITE_EXTENSION_INIT1
4708#endif
4709#include <assert.h>
4710#include <string.h>
4711#include <stdlib.h>
4712
4713/* The following object is the group context for a single percentile()
4714** aggregate. Remember all input Y values until the very end.
4715** Those values are accumulated in the Percentile.a[] array.
4716*/
4717typedef struct Percentile Percentile;
4719 unsigned nAlloc; /* Number of slots allocated for a[] */
4720 unsigned nUsed; /* Number of slots actually used in a[] */
4721 char bSorted; /* True if a[] is already in sorted order */
4722 char bKeepSorted; /* True if advantageous to keep a[] sorted */
4723 char bPctValid; /* True if rPct is valid */
4724 double rPct; /* Fraction. 0.0 to 1.0 */
4725 double *a; /* Array of Y values */
4726};
4727
4728/* Details of each function in the percentile family */
4729typedef struct PercentileFunc PercentileFunc;
4731 const char *zName; /* Function name */
4732 char nArg; /* Number of arguments */
4733 char mxFrac; /* Maximum value of the "fraction" input */
4734 char bDiscrete; /* True for percentile_disc() */
4735};
4736static const PercentileFunc aPercentFunc[] = {
4737 { "median", 1, 1, 0 },
4738 { "percentile", 2, 100, 0 },
4739 { "percentile_cont", 2, 1, 0 },
4740 { "percentile_disc", 2, 1, 1 },
4741};
4742
4743/*
4744** Return TRUE if the input floating-point number is an infinity.
4745*/
4746static int percentIsInfinity(double r){
4748 assert( sizeof(u)==sizeof(r) );
4749 memcpy(&u, &r, sizeof(u));
4750 return ((u>>52)&0x7ff)==0x7ff;
4751}
4752
4753/*
4754** Return TRUE if two doubles differ by 0.001 or less.
4755*/
4756static int percentSameValue(double a, double b){
4757 a -= b;
4758 return a>=-0.001 && a<=0.001;
4759}
4760
4761/*
4762** Search p (which must have p->bSorted) looking for an entry with
4763** value y. Return the index of that entry.
4764**
4765** If bExact is true, return -1 if the entry is not found.
4766**
4767** If bExact is false, return the index at which a new entry with
4768** value y should be insert in order to keep the values in sorted
4769** order. The smallest return value in this case will be 0, and
4770** the largest return value will be p->nUsed.
4771*/
4772static int percentBinarySearch(Percentile *p, double y, int bExact){
4773 int iFirst = 0; /* First element of search range */
4774 int iLast = p->nUsed - 1; /* Last element of search range */
4775 while( iLast>=iFirst ){
4776 int iMid = (iFirst+iLast)/2;
4777 double x = p->a[iMid];
4778 if( x<y ){
4779 iFirst = iMid + 1;
4780 }else if( x>y ){
4781 iLast = iMid - 1;
4782 }else{
4783 return iMid;
4784 }
4785 }
4786 if( bExact ) return -1;
4787 return iFirst;
4788}
4789
4790/*
4791** Generate an error for a percentile function.
4792**
4793** The error format string must have exactly one occurrence of "%%s()"
4794** (with two '%' characters). That substring will be replaced by the name
4795** of the function.
4796*/
4797static void percentError(sqlite3_context *pCtx, const char *zFormat, ...){
4798 PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
4799 char *zMsg1;
4800 char *zMsg2;
4801 va_list ap;
4802
4803 va_start(ap, zFormat);
4804 zMsg1 = sqlite3_vmprintf(zFormat, ap);
4805 va_end(ap);
4806 zMsg2 = zMsg1 ? sqlite3_mprintf(zMsg1, pFunc->zName) : 0;
4807 sqlite3_result_error(pCtx, zMsg2, -1);
4808 sqlite3_free(zMsg1);
4809 sqlite3_free(zMsg2);
4810}
4811
4812/*
4813** The "step" function for percentile(Y,P) is called once for each
4814** input row.
4815*/
4816static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){
4817 Percentile *p;
4818 double rPct;
4819 int eType;
4820 double y;
4821 assert( argc==2 || argc==1 );
4822
4823 if( argc==1 ){
4824 /* Requirement 13: median(Y) is the same as percentile(Y,50). */
4825 rPct = 0.5;
4826 }else{
4827 /* Requirement 3: P must be a number between 0 and 100 */
4828 PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
4829 eType = sqlite3_value_numeric_type(argv[1]);
4830 rPct = sqlite3_value_double(argv[1])/(double)pFunc->mxFrac;
4831 if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT)
4832 || rPct<0.0 || rPct>1.0
4833 ){
4834 percentError(pCtx, "the fraction argument to %%s()"
4835 " is not between 0.0 and %.1f",
4836 (double)pFunc->mxFrac);
4837 return;
4838 }
4839 }
4840
4841 /* Allocate the session context. */
4842 p = (Percentile*)sqlite3_aggregate_context(pCtx, sizeof(*p));
4843 if( p==0 ) return;
4844
4845 /* Remember the P value. Throw an error if the P value is different
4846 ** from any prior row, per Requirement (2). */
4847 if( !p->bPctValid ){
4848 p->rPct = rPct;
4849 p->bPctValid = 1;
4850 }else if( !percentSameValue(p->rPct,rPct) ){
4851 percentError(pCtx, "the fraction argument to %%s()"
4852 " is not the same for all input rows");
4853 return;
4854 }
4855
4856 /* Ignore rows for which Y is NULL */
4857 eType = sqlite3_value_type(argv[0]);
4858 if( eType==SQLITE_NULL ) return;
4859
4860 /* If not NULL, then Y must be numeric. Otherwise throw an error.
4861 ** Requirement 4 */
4862 if( eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT ){
4863 percentError(pCtx, "input to %%s() is not numeric");
4864 return;
4865 }
4866
4867 /* Throw an error if the Y value is infinity or NaN */
4868 y = sqlite3_value_double(argv[0]);
4869 if( percentIsInfinity(y) ){
4870 percentError(pCtx, "Inf input to %%s()");
4871 return;
4872 }
4873
4874 /* Allocate and store the Y */
4875 if( p->nUsed>=p->nAlloc ){
4876 unsigned n = p->nAlloc*2 + 250;
4877 double *a = sqlite3_realloc64(p->a, sizeof(double)*n);
4878 if( a==0 ){
4880 memset(p, 0, sizeof(*p));
4882 return;
4883 }
4884 p->nAlloc = n;
4885 p->a = a;
4886 }
4887 if( p->nUsed==0 ){
4888 p->a[p->nUsed++] = y;
4889 p->bSorted = 1;
4890 }else if( !p->bSorted || y>=p->a[p->nUsed-1] ){
4891 p->a[p->nUsed++] = y;
4892 }else if( p->bKeepSorted ){
4893 int i;
4894 i = percentBinarySearch(p, y, 0);
4895 if( i<(int)p->nUsed ){
4896 memmove(&p->a[i+1], &p->a[i], (p->nUsed-i)*sizeof(p->a[0]));
4897 }
4898 p->a[i] = y;
4899 p->nUsed++;
4900 }else{
4901 p->a[p->nUsed++] = y;
4902 p->bSorted = 0;
4903 }
4904}
4905
4906/*
4907** Interchange two doubles.
4908*/
4909#define SWAP_DOUBLE(X,Y) {double ttt=(X);(X)=(Y);(Y)=ttt;}
4910
4911/*
4912** Sort an array of doubles.
4913**
4914** Algorithm: quicksort
4915**
4916** This is implemented separately rather than using the qsort() routine
4917** from the standard library because:
4918**
4919** (1) To avoid a dependency on qsort()
4920** (2) To avoid the function call to the comparison routine for each
4921** comparison.
4922*/
4923static void percentSort(double *a, unsigned int n){
4924 int iLt; /* Entries before a[iLt] are less than rPivot */
4925 int iGt; /* Entries at or after a[iGt] are greater than rPivot */
4926 int i; /* Loop counter */
4927 double rPivot; /* The pivot value */
4928
4929 assert( n>=2 );
4930 if( a[0]>a[n-1] ){
4931 SWAP_DOUBLE(a[0],a[n-1])
4932 }
4933 if( n==2 ) return;
4934 iGt = n-1;
4935 i = n/2;
4936 if( a[0]>a[i] ){
4937 SWAP_DOUBLE(a[0],a[i])
4938 }else if( a[i]>a[iGt] ){
4939 SWAP_DOUBLE(a[i],a[iGt])
4940 }
4941 if( n==3 ) return;
4942 rPivot = a[i];
4943 iLt = i = 1;
4944 do{
4945 if( a[i]<rPivot ){
4946 if( i>iLt ) SWAP_DOUBLE(a[i],a[iLt])
4947 iLt++;
4948 i++;
4949 }else if( a[i]>rPivot ){
4950 do{
4951 iGt--;
4952 }while( iGt>i && a[iGt]>rPivot );
4953 SWAP_DOUBLE(a[i],a[iGt])
4954 }else{
4955 i++;
4956 }
4957 }while( i<iGt );
4958 if( iLt>=2 ) percentSort(a, iLt);
4959 if( n-iGt>=2 ) percentSort(a+iGt, n-iGt);
4960
4961/* Uncomment for testing */
4962#if 0
4963 for(i=0; i<n-1; i++){
4964 assert( a[i]<=a[i+1] );
4965 }
4966#endif
4967}
4968
4969
4970/*
4971** The "inverse" function for percentile(Y,P) is called to remove a
4972** row that was previously inserted by "step".
4973*/
4974static void percentInverse(sqlite3_context *pCtx,int argc,sqlite3_value **argv){
4975 Percentile *p;
4976 int eType;
4977 double y;
4978 int i;
4979 assert( argc==2 || argc==1 );
4980
4981 /* Allocate the session context. */
4982 p = (Percentile*)sqlite3_aggregate_context(pCtx, sizeof(*p));
4983 assert( p!=0 );
4984
4985 /* Ignore rows for which Y is NULL */
4986 eType = sqlite3_value_type(argv[0]);
4987 if( eType==SQLITE_NULL ) return;
4988
4989 /* If not NULL, then Y must be numeric. Otherwise throw an error.
4990 ** Requirement 4 */
4991 if( eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT ){
4992 return;
4993 }
4994
4995 /* Ignore the Y value if it is infinity or NaN */
4996 y = sqlite3_value_double(argv[0]);
4997 if( percentIsInfinity(y) ){
4998 return;
4999 }
5000 if( p->bSorted==0 ){
5001 assert( p->nUsed>1 );
5003 p->bSorted = 1;
5004 }
5005 p->bKeepSorted = 1;
5006
5007 /* Find and remove the row */
5008 i = percentBinarySearch(p, y, 1);
5009 if( i>=0 ){
5010 p->nUsed--;
5011 if( i<(int)p->nUsed ){
5012 memmove(&p->a[i], &p->a[i+1], (p->nUsed - i)*sizeof(p->a[0]));
5013 }
5014 }
5015}
5016
5017/*
5018** Compute the final output of percentile(). Clean up all allocated
5019** memory if and only if bIsFinal is true.
5020*/
5021static void percentCompute(sqlite3_context *pCtx, int bIsFinal){
5022 Percentile *p;
5023 PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
5024 unsigned i1, i2;
5025 double v1, v2;
5026 double ix, vx;
5027 p = (Percentile*)sqlite3_aggregate_context(pCtx, 0);
5028 if( p==0 ) return;
5029 if( p->a==0 ) return;
5030 if( p->nUsed ){
5031 if( p->bSorted==0 ){
5032 assert( p->nUsed>1 );
5034 p->bSorted = 1;
5035 }
5036 ix = p->rPct*(p->nUsed-1);
5037 i1 = (unsigned)ix;
5038 if( pFunc->bDiscrete ){
5039 vx = p->a[i1];
5040 }else{
5041 i2 = ix==(double)i1 || i1==p->nUsed-1 ? i1 : i1+1;
5042 v1 = p->a[i1];
5043 v2 = p->a[i2];
5044 vx = v1 + (v2-v1)*(ix-i1);
5045 }
5047 }
5048 if( bIsFinal ){
5050 memset(p, 0, sizeof(*p));
5051 }else{
5052 p->bKeepSorted = 1;
5053 }
5054}
5055static void percentFinal(sqlite3_context *pCtx){
5056 percentCompute(pCtx, 1);
5057}
5058static void percentValue(sqlite3_context *pCtx){
5059 percentCompute(pCtx, 0);
5060}
5061
5062#if defined(_WIN32) && !defined(SQLITE3_H) && !defined(SQLITE_STATIC_PERCENTILE)
5063
5064#endif
5066 sqlite3 *db,
5067 char **pzErrMsg,
5068 const sqlite3_api_routines *pApi
5069){
5070 int rc = SQLITE_OK;
5071 unsigned int i;
5072#ifdef SQLITE3EXT_H
5073 SQLITE_EXTENSION_INIT2(pApi);
5074#else
5075 (void)pApi; /* Unused parameter */
5076#endif
5077 (void)pzErrMsg; /* Unused parameter */
5078 for(i=0; i<sizeof(aPercentFunc)/sizeof(aPercentFunc[0]); i++){
5083 (void*)&aPercentFunc[i],
5085 if( rc ) break;
5086 }
5087 return rc;
5088}
5089
5090/************************* End ../ext/misc/percentile.c ********************/
5091#undef sqlite3_base_init
5092#define sqlite3_base_init sqlite3_base64_init
5093/************************* Begin ../ext/misc/base64.c ******************/
5094/*
5095** 2022-11-18
5096**
5097** The author disclaims copyright to this source code. In place of
5098** a legal notice, here is a blessing:
5099**
5100** May you do good and not evil.
5101** May you find forgiveness for yourself and forgive others.
5102** May you share freely, never taking more than you give.
5103**
5104*************************************************************************
5105**
5106** This is a SQLite extension for converting in either direction
5107** between a (binary) blob and base64 text. Base64 can transit a
5108** sane USASCII channel unmolested. It also plays nicely in CSV or
5109** written as TCL brace-enclosed literals or SQL string literals,
5110** and can be used unmodified in XML-like documents.
5111**
5112** This is an independent implementation of conversions specified in
5113** RFC 4648, done on the above date by the author (Larry Brasfield)
5114** who thereby has the right to put this into the public domain.
5115**
5116** The conversions meet RFC 4648 requirements, provided that this
5117** C source specifies that line-feeds are included in the encoded
5118** data to limit visible line lengths to 72 characters and to
5119** terminate any encoded blob having non-zero length.
5120**
5121** Length limitations are not imposed except that the runtime
5122** SQLite string or blob length limits are respected. Otherwise,
5123** any length binary sequence can be represented and recovered.
5124** Generated base64 sequences, with their line-feeds included,
5125** can be concatenated; the result converted back to binary will
5126** be the concatenation of the represented binary sequences.
5127**
5128** This SQLite3 extension creates a function, base64(x), which
5129** either: converts text x containing base64 to a returned blob;
5130** or converts a blob x to returned text containing base64. An
5131** error will be thrown for other input argument types.
5132**
5133** This code relies on UTF-8 encoding only with respect to the
5134** meaning of the first 128 (7-bit) codes matching that of USASCII.
5135** It will fail miserably if somehow made to try to convert EBCDIC.
5136** Because it is table-driven, it could be enhanced to handle that,
5137** but the world and SQLite have moved on from that anachronism.
5138**
5139** To build the extension:
5140** Set shell variable SQDIR=<your favorite SQLite checkout directory>
5141** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
5142** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
5143** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
5144** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
5145*/
5146
5147#include <assert.h>
5148
5149/* #include "sqlite3ext.h" */
5150
5152/* Quiet some compilers about some of our intentional code. */
5153# if GCC_VERSION>=7000000
5154# define deliberate_fall_through __attribute__((fallthrough));
5155# else
5156# define deliberate_fall_through
5157# endif
5158#endif
5159
5161
5162#define PC 0x80 /* pad character */
5163#define WS 0x81 /* whitespace */
5164#define ND 0x82 /* Not above or digit-value */
5165#define PAD_CHAR '='
5166
5167#ifndef U8_TYPEDEF
5168/* typedef unsigned char u8; */
5169#define U8_TYPEDEF
5170#endif
5171
5172/* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
5173static const u8 b64DigitValues[128] = {
5174 /* HT LF VT FF CR */
5175 ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
5176 /* US */
5177 ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
5178 /*sp + / */
5179 WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
5180 /* 0 1 5 9 = */
5181 52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
5182 /* A O */
5183 ND, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
5184 /* P Z */
5185 15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
5186 /* a o */
5187 ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
5188 /* p z */
5189 41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
5190};
5191
5192static const char b64Numerals[64+1]
5193= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
5194
5195#define BX_DV_PROTO(c)
5196 ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
5197#define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
5198#define IS_BX_WS(bdp) ((bdp)==WS)
5199#define IS_BX_PAD(bdp) ((bdp)==PC)
5200#define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
5201/* Width of base64 lines. Should be an integer multiple of 4. */
5202#define B64_DARK_MAX 72
5203
5204/* Encode a byte buffer into base64 text with linefeeds appended to limit
5205** encoded group lengths to B64_DARK_MAX or to terminate the last group.
5206*/
5207static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
5208 int nCol = 0;
5209 while( nbIn >= 3 ){
5210 /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
5211 pOut[0] = BX_NUMERAL(pIn[0]>>2);
5212 pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
5213 pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
5214 pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
5215 pOut += 4;
5216 nbIn -= 3;
5217 pIn += 3;
5218 if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
5219 *pOut++ = '\n';
5220 nCol = 0;
5221 }
5222 }
5223 if( nbIn > 0 ){
5224 signed char nco = nbIn+1;
5225 int nbe;
5226 unsigned long qv = *pIn++;
5227 for( nbe=1; nbe<3; ++nbe ){
5228 qv <<= 8;
5229 if( nbe<nbIn ) qv |= *pIn++;
5230 }
5231 for( nbe=3; nbe>=0; --nbe ){
5232 char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
5233 qv >>= 6;
5234 pOut[nbe] = ce;
5235 }
5236 pOut += 4;
5237 *pOut++ = '\n';
5238 }
5239 *pOut = 0;
5240 return pOut;
5241}
5242
5243/* Skip over text which is not base64 numeral(s). */
5244static char * skipNonB64( char *s, int nc ){
5245 char c;
5246 while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
5247 return s;
5248}
5249
5250/* Decode base64 text into a byte buffer. */
5251static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
5252 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
5253 while( ncIn>0 && *pIn!=PAD_CHAR ){
5254 static signed char nboi[] = { 0, 0, 1, 2, 3 };
5255 char *pUse = skipNonB64(pIn, ncIn);
5256 unsigned long qv = 0L;
5257 int nti, nbo, nac;
5258 ncIn -= (pUse - pIn);
5259 pIn = pUse;
5260 nti = (ncIn>4)? 4 : ncIn;
5261 ncIn -= nti;
5262 nbo = nboi[nti];
5263 if( nbo==0 ) break;
5264 for( nac=0; nac<4; ++nac ){
5265 char c = (nac<nti)? *pIn++ : b64Numerals[0];
5266 u8 bdp = BX_DV_PROTO(c);
5267 switch( bdp ){
5268 case ND:
5269 /* Treat dark non-digits as pad, but they terminate decode too. */
5270 ncIn = 0;
5271 deliberate_fall_through; /* FALLTHRU */
5272 case WS:
5273 /* Treat whitespace as pad and terminate this group.*/
5274 nti = nac;
5275 deliberate_fall_through; /* FALLTHRU */
5276 case PC:
5277 bdp = 0;
5278 --nbo;
5279 deliberate_fall_through; /* FALLTHRU */
5280 default: /* bdp is the digit value. */
5281 qv = qv<<6 | bdp;
5282 break;
5283 }
5284 }
5285 switch( nbo ){
5286 case 3:
5287 pOut[2] = (qv) & 0xff;
5288 deliberate_fall_through; /* FALLTHRU */
5289 case 2:
5290 pOut[1] = (qv>>8) & 0xff;
5291 deliberate_fall_through; /* FALLTHRU */
5292 case 1:
5293 pOut[0] = (qv>>16) & 0xff;
5294 break;
5295 }
5296 pOut += nbo;
5297 }
5298 return pOut;
5299}
5300
5301/* This function does the work for the SQLite base64(x) UDF. */
5302static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
5303 int nb, nc, nv = sqlite3_value_bytes(av[0]);
5306 char *cBuf;
5307 u8 *bBuf;
5308 assert(na==1);
5309 switch( sqlite3_value_type(av[0]) ){
5310 case SQLITE_BLOB:
5311 nb = nv;
5312 nc = 4*(nv+2/3); /* quads needed */
5313 nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
5314 if( nvMax < nc ){
5315 sqlite3_result_error(context, "blob expanded to base64 too big", -1);
5316 return;
5317 }
5318 bBuf = (u8*)sqlite3_value_blob(av[0]);
5319 if( !bBuf ){
5321 goto memFail;
5322 }
5324 break;
5325 }
5326 cBuf = sqlite3_malloc(nc);
5327 if( !cBuf ) goto memFail;
5328 nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
5330 break;
5331 case SQLITE_TEXT:
5332 nc = nv;
5333 nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
5334 if( nvMax < nb ){
5335 sqlite3_result_error(context, "blob from base64 may be too big", -1);
5336 return;
5337 }else if( nb<1 ){
5338 nb = 1;
5339 }
5340 cBuf = (char *)sqlite3_value_text(av[0]);
5341 if( !cBuf ){
5343 goto memFail;
5344 }
5346 break;
5347 }
5348 bBuf = sqlite3_malloc(nb);
5349 if( !bBuf ) goto memFail;
5350 nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
5352 break;
5353 default:
5354 sqlite3_result_error(context, "base64 accepts only blob or text", -1);
5355 return;
5356 }
5357 return;
5358 memFail:
5359 sqlite3_result_error(context, "base64 OOM", -1);
5360}
5361
5362/*
5363** Establish linkage to running SQLite library.
5364*/
5365#ifndef SQLITE_SHELL_EXTFUNCS
5366#ifdef _WIN32
5367
5368#endif
5370#else
5371static int sqlite3_base64_init
5372#endif
5373(sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
5375 (void)pzErr;
5377 (db, "base64", 1,
5379 0, base64, 0, 0);
5380}
5381
5382/*
5383** Define some macros to allow this extension to be built into the shell
5384** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
5385** allows shell.c, as distributed, to have this extension built in.
5386*/
5387#define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
5388#define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
5389
5390/************************* End ../ext/misc/base64.c ********************/
5391#undef sqlite3_base_init
5392#define sqlite3_base_init sqlite3_base85_init
5393#define OMIT_BASE85_CHECKER
5394/************************* Begin ../ext/misc/base85.c ******************/
5395/*
5396** 2022-11-16
5397**
5398** The author disclaims copyright to this source code. In place of
5399** a legal notice, here is a blessing:
5400**
5401** May you do good and not evil.
5402** May you find forgiveness for yourself and forgive others.
5403** May you share freely, never taking more than you give.
5404**
5405*************************************************************************
5406**
5407** This is a utility for converting binary to base85 or vice-versa.
5408** It can be built as a standalone program or an SQLite3 extension.
5409**
5410** Much like base64 representations, base85 can be sent through a
5411** sane USASCII channel unmolested. It also plays nicely in CSV or
5412** written as TCL brace-enclosed literals or SQL string literals.
5413** It is not suited for unmodified use in XML-like documents.
5414**
5415** The encoding used resembles Ascii85, but was devised by the author
5416** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
5417** variant sources existed, in the 1984 timeframe on a VAX mainframe.
5418** Further, this is an independent implementation of a base85 system.
5419** Hence, the author has rightfully put this into the public domain.
5420**
5421** Base85 numerals are taken from the set of 7-bit USASCII codes,
5422** excluding control characters and Space ! " ' ( ) { | } ~ Del
5423** in code order representing digit values 0 to 84 (base 10.)
5424**
5425** Groups of 4 bytes, interpreted as big-endian 32-bit values,
5426** are represented as 5-digit base85 numbers with MS to LS digit
5427** order. Groups of 1-3 bytes are represented with 2-4 digits,
5428** still big-endian but 8-24 bit values. (Using big-endian yields
5429** the simplest transition to byte groups smaller than 4 bytes.
5430** These byte groups can also be considered base-256 numbers.)
5431** Groups of 0 bytes are represented with 0 digits and vice-versa.
5432** No pad characters are used; Encoded base85 numeral sequence
5433** (aka "group") length maps 1-to-1 to the decoded binary length.
5434**
5435** Any character not in the base85 numeral set delimits groups.
5436** When base85 is streamed or stored in containers of indefinite
5437** size, newline is used to separate it into sub-sequences of no
5438** more than 80 digits so that fgets() can be used to read it.
5439**
5440** Length limitations are not imposed except that the runtime
5441** SQLite string or blob length limits are respected. Otherwise,
5442** any length binary sequence can be represented and recovered.
5443** Base85 sequences can be concatenated by separating them with
5444** a non-base85 character; the conversion to binary will then
5445** be the concatenation of the represented binary sequences.
5446
5447** The standalone program either converts base85 on stdin to create
5448** a binary file or converts a binary file to base85 on stdout.
5449** Read or make it blurt its help for invocation details.
5450**
5451** The SQLite3 extension creates a function, base85(x), which will
5452** either convert text base85 to a blob or a blob to text base85
5453** and return the result (or throw an error for other types.)
5454** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
5455** function, is_base85(t), which returns 1 iff the text t contains
5456** nothing other than base85 numerals and whitespace, or 0 otherwise.
5457**
5458** To build the extension:
5459** Set shell variable SQDIR=<your favorite SQLite checkout directory>
5460** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
5461** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
5462** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
5463** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
5464** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
5465**
5466** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
5467** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
5468** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
5469** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
5470*/
5471
5472#include <stdio.h>
5473#include <memory.h>
5474#include <string.h>
5475#include <assert.h>
5476#ifndef OMIT_BASE85_CHECKER
5477# include <ctype.h>
5478#endif
5479
5480#ifndef BASE85_STANDALONE
5481
5482/* # include "sqlite3ext.h" */
5483
5485
5486#else
5487
5488# ifdef _WIN32
5489# include <io.h>
5490# include <fcntl.h>
5491# else
5492# define setmode(fd,m)
5493# endif
5494
5495static char *zHelp =
5496 "Usage: base85 <dirFlag> <binFile>\n"
5497 " <dirFlag> is either -r to read or -w to write <binFile>,\n"
5498 " content to be converted to/from base85 on stdout/stdin.\n"
5499 " <binFile> names a binary file to be rendered or created.\n"
5500 " Or, the name '-' refers to the stdin or stdout stream.\n"
5501 ;
5502
5503static void sayHelp(){
5504 printf("%s", zHelp);
5505}
5506#endif
5507
5508#ifndef U8_TYPEDEF
5509/* typedef unsigned char u8; */
5510#define U8_TYPEDEF
5511#endif
5512
5513/* Classify c according to interval within USASCII set w.r.t. base85
5514 * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
5515 */
5516#define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
5517
5518/* Provide digitValue to b85Numeral offset as a function of above class. */
5519static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
5520#define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
5521
5522/* Say whether c is a base85 numeral. */
5523#define IS_B85( c ) (B85_CLASS(c) & 1)
5524
5525#if 0 /* Not used, */
5526static u8 base85DigitValue( char c ){
5527 u8 dv = (u8)(c - '#');
5528 if( dv>87 ) return 0xff;
5529 return (dv > 3)? dv-3 : dv;
5530}
5531#endif
5532
5533/* Width of base64 lines. Should be an integer multiple of 5. */
5534#define B85_DARK_MAX 80
5535
5536
5537static char * skipNonB85( char *s, int nc ){
5538 char c;
5539 while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
5540 return s;
5541}
5542
5543/* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
5544 * Do not use the macro form with argument expression having a side-effect.*/
5545#if 0
5546static char base85Numeral( u8 b ){
5547 return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
5548}
5549#else
5550# define base85Numeral( dn )
5551 ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
5552#endif
5553
5554static char *putcs(char *pc, char *s){
5555 char c;
5556 while( (c = *s++)!=0 ) *pc++ = c;
5557 return pc;
5558}
5559
5560/* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
5561** to be appended to encoded groups to limit their length to B85_DARK_MAX
5562** or to terminate the last group (to aid concatenation.)
5563*/
5564static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
5565 int nCol = 0;
5566 while( nbIn >= 4 ){
5567 int nco = 5;
5568 unsigned long qbv = (((unsigned long)pIn[0])<<24) |
5569 (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
5570 while( nco > 0 ){
5571 unsigned nqv = (unsigned)(qbv/85UL);
5572 unsigned char dv = qbv - 85UL*nqv;
5573 qbv = nqv;
5574 pOut[--nco] = base85Numeral(dv);
5575 }
5576 nbIn -= 4;
5577 pIn += 4;
5578 pOut += 5;
5579 if( pSep && (nCol += 5)>=B85_DARK_MAX ){
5580 pOut = putcs(pOut, pSep);
5581 nCol = 0;
5582 }
5583 }
5584 if( nbIn > 0 ){
5585 int nco = nbIn + 1;
5586 unsigned long qv = *pIn++;
5587 int nbe = 1;
5588 while( nbe++ < nbIn ){
5589 qv = (qv<<8) | *pIn++;
5590 }
5591 nCol += nco;
5592 while( nco > 0 ){
5593 u8 dv = (u8)(qv % 85);
5594 qv /= 85;
5595 pOut[--nco] = base85Numeral(dv);
5596 }
5597 pOut += (nbIn+1);
5598 }
5599 if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
5600 *pOut = 0;
5601 return pOut;
5602}
5603
5604/* Decode base85 text into a byte buffer. */
5605static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
5606 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
5607 while( ncIn>0 ){
5608 static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
5609 char *pUse = skipNonB85(pIn, ncIn);
5610 unsigned long qv = 0L;
5611 int nti, nbo;
5612 ncIn -= (pUse - pIn);
5613 pIn = pUse;
5614 nti = (ncIn>5)? 5 : ncIn;
5615 nbo = nboi[nti];
5616 if( nbo==0 ) break;
5617 while( nti>0 ){
5618 char c = *pIn++;
5619 u8 cdo = B85_DNOS(c);
5620 --ncIn;
5621 if( cdo==0 ) break;
5622 qv = 85 * qv + (c - cdo);
5623 --nti;
5624 }
5625 nbo -= nti; /* Adjust for early (non-digit) end of group. */
5626 switch( nbo ){
5627 case 4:
5628 *pOut++ = (qv >> 24)&0xff;
5629 /* FALLTHRU */
5630 case 3:
5631 *pOut++ = (qv >> 16)&0xff;
5632 /* FALLTHRU */
5633 case 2:
5634 *pOut++ = (qv >> 8)&0xff;
5635 /* FALLTHRU */
5636 case 1:
5637 *pOut++ = qv&0xff;
5638 /* FALLTHRU */
5639 case 0:
5640 break;
5641 }
5642 }
5643 return pOut;
5644}
5645
5646#ifndef OMIT_BASE85_CHECKER
5647/* Say whether input char sequence is all (base85 and/or whitespace).*/
5648static int allBase85( char *p, int len ){
5649 char c;
5650 while( len-- > 0 && (c = *p++) != 0 ){
5651 if( !IS_B85(c) && !isspace(c) ) return 0;
5652 }
5653 return 1;
5654}
5655#endif
5656
5657#ifndef BASE85_STANDALONE
5658
5659# ifndef OMIT_BASE85_CHECKER
5660/* This function does the work for the SQLite is_base85(t) UDF. */
5661static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5662 assert(na==1);
5663 switch( sqlite3_value_type(av[0]) ){
5664 case SQLITE_TEXT:
5665 {
5666 int rv = allBase85( (char *)sqlite3_value_text(av[0]),
5667 sqlite3_value_bytes(av[0]) );
5668 sqlite3_result_int(context, rv);
5669 }
5670 break;
5671 case SQLITE_NULL:
5672 sqlite3_result_null(context);
5673 break;
5674 default:
5675 sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
5676 return;
5677 }
5678}
5679# endif
5680
5681/* This function does the work for the SQLite base85(x) UDF. */
5682static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5683 int nb, nc, nv = sqlite3_value_bytes(av[0]);
5686 char *cBuf;
5687 u8 *bBuf;
5688 assert(na==1);
5689 switch( sqlite3_value_type(av[0]) ){
5690 case SQLITE_BLOB:
5691 nb = nv;
5692 /* ulongs tail newlines tailenc+nul*/
5693 nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
5694 if( nvMax < nc ){
5695 sqlite3_result_error(context, "blob expanded to base85 too big", -1);
5696 return;
5697 }
5698 bBuf = (u8*)sqlite3_value_blob(av[0]);
5699 if( !bBuf ){
5701 goto memFail;
5702 }
5704 break;
5705 }
5706 cBuf = sqlite3_malloc(nc);
5707 if( !cBuf ) goto memFail;
5708 nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
5710 break;
5711 case SQLITE_TEXT:
5712 nc = nv;
5713 nb = 4*(nv/5) + nv%5; /* may overestimate */
5714 if( nvMax < nb ){
5715 sqlite3_result_error(context, "blob from base85 may be too big", -1);
5716 return;
5717 }else if( nb<1 ){
5718 nb = 1;
5719 }
5720 cBuf = (char *)sqlite3_value_text(av[0]);
5721 if( !cBuf ){
5723 goto memFail;
5724 }
5726 break;
5727 }
5728 bBuf = sqlite3_malloc(nb);
5729 if( !bBuf ) goto memFail;
5730 nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
5732 break;
5733 default:
5734 sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
5735 return;
5736 }
5737 return;
5738 memFail:
5739 sqlite3_result_error(context, "base85 OOM", -1);
5740}
5741
5742/*
5743** Establish linkage to running SQLite library.
5744*/
5745#ifndef SQLITE_SHELL_EXTFUNCS
5746#ifdef _WIN32
5747
5748#endif
5750#else
5751static int sqlite3_base85_init
5752#endif
5753(sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
5755 (void)pzErr;
5756# ifndef OMIT_BASE85_CHECKER
5757 {
5758 int rc = sqlite3_create_function
5759 (db, "is_base85", 1,
5760 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
5761 0, is_base85, 0, 0);
5762 if( rc!=SQLITE_OK ) return rc;
5763 }
5764# endif
5766 (db, "base85", 1,
5768 0, base85, 0, 0);
5769}
5770
5771/*
5772** Define some macros to allow this extension to be built into the shell
5773** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
5774** allows shell.c, as distributed, to have this extension built in.
5775*/
5776# define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
5777# define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
5778
5779#else /* standalone program */
5780
5781int main(int na, char *av[]){
5782 int cin;
5783 int rc = 0;
5784 u8 bBuf[4*(B85_DARK_MAX/5)];
5785 char cBuf[5*(sizeof(bBuf)/4)+2];
5786 size_t nio;
5787# ifndef OMIT_BASE85_CHECKER
5788 int b85Clean = 1;
5789# endif
5790 char rw;
5791 FILE *fb = 0, *foc = 0;
5792 char fmode[3] = "xb";
5793 if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
5794 sayHelp();
5795 return 0;
5796 }
5797 fmode[0] = rw;
5798 if( av[2][0]=='-' && av[2][1]==0 ){
5799 switch( rw ){
5800 case 'r':
5801 fb = stdin;
5802 setmode(fileno(stdin), O_BINARY);
5803 break;
5804 case 'w':
5805 fb = stdout;
5806 setmode(fileno(stdout), O_BINARY);
5807 break;
5808 }
5809 }else{
5810 fb = fopen(av[2], fmode);
5811 foc = fb;
5812 }
5813 if( !fb ){
5814 fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
5815 rc = 1;
5816 }else{
5817 switch( rw ){
5818 case 'r':
5819 while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
5820 toBase85( bBuf, (int)nio, cBuf, 0 );
5821 fprintf(stdout, "%s\n", cBuf);
5822 }
5823 break;
5824 case 'w':
5825 while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
5826 int nc = strlen(cBuf);
5827 size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
5828 if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
5829# ifndef OMIT_BASE85_CHECKER
5830 b85Clean &= allBase85( cBuf, nc );
5831# endif
5832 }
5833 break;
5834 default:
5835 sayHelp();
5836 rc = 1;
5837 }
5838 if( foc ) fclose(foc);
5839 }
5840# ifndef OMIT_BASE85_CHECKER
5841 if( !b85Clean ){
5842 fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
5843 }
5844# endif
5845 return rc;
5846}
5847
5848#endif
5849
5850/************************* End ../ext/misc/base85.c ********************/
5851/************************* Begin ../ext/misc/ieee754.c ******************/
5852/*
5853** 2013-04-17
5854**
5855** The author disclaims copyright to this source code. In place of
5856** a legal notice, here is a blessing:
5857**
5858** May you do good and not evil.
5859** May you find forgiveness for yourself and forgive others.
5860** May you share freely, never taking more than you give.
5861**
5862******************************************************************************
5863**
5864** This SQLite extension implements functions for the exact display
5865** and input of IEEE754 Binary64 floating-point numbers.
5866**
5867** ieee754(X)
5868** ieee754(Y,Z)
5869**
5870** In the first form, the value X should be a floating-point number.
5871** The function will return a string of the form 'ieee754(Y,Z)' where
5872** Y and Z are integers such that X==Y*pow(2,Z).
5873**
5874** In the second form, Y and Z are integers which are the mantissa and
5875** base-2 exponent of a new floating point number. The function returns
5876** a floating-point value equal to Y*pow(2,Z).
5877**
5878** Examples:
5879**
5880** ieee754(2.0) -> 'ieee754(2,0)'
5881** ieee754(45.25) -> 'ieee754(181,-2)'
5882** ieee754(2, 0) -> 2.0
5883** ieee754(181, -2) -> 45.25
5884**
5885** Two additional functions break apart the one-argument ieee754()
5886** result into separate integer values:
5887**
5888** ieee754_mantissa(45.25) -> 181
5889** ieee754_exponent(45.25) -> -2
5890**
5891** These functions convert binary64 numbers into blobs and back again.
5892**
5893** ieee754_from_blob(x'3ff0000000000000') -> 1.0
5894** ieee754_to_blob(1.0) -> x'3ff0000000000000'
5895**
5896** In all single-argument functions, if the argument is an 8-byte blob
5897** then that blob is interpreted as a big-endian binary64 value.
5898**
5899**
5900** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
5901** -----------------------------------------------
5902**
5903** This extension in combination with the separate 'decimal' extension
5904** can be used to compute the exact decimal representation of binary64
5905** values. To begin, first compute a table of exponent values:
5906**
5907** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
5908** WITH RECURSIVE c(x,v) AS (
5909** VALUES(0,'1')
5910** UNION ALL
5911** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
5912** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5913** WITH RECURSIVE c(x,v) AS (
5914** VALUES(-1,'0.5')
5915** UNION ALL
5916** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
5917** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5918**
5919** Then, to compute the exact decimal representation of a floating
5920** point value (the value 47.49 is used in the example) do:
5921**
5922** WITH c(n) AS (VALUES(47.49))
5923** ---------------^^^^^---- Replace with whatever you want
5924** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
5925** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
5926**
5927** Here is a query to show various boundry values for the binary64
5928** number format:
5929**
5930** WITH c(name,bin) AS (VALUES
5931** ('minimum positive value', x'0000000000000001'),
5932** ('maximum subnormal value', x'000fffffffffffff'),
5933** ('minimum positive normal value', x'0010000000000000'),
5934** ('maximum value', x'7fefffffffffffff'))
5935** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
5936** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
5937**
5938*/
5939/* #include "sqlite3ext.h" */
5941#include <assert.h>
5942#include <string.h>
5943
5944/* Mark a function parameter as unused, to suppress nuisance compiler
5945** warnings. */
5946#ifndef UNUSED_PARAMETER
5947# define UNUSED_PARAMETER(X) (void)(X)
5948#endif
5949
5950/*
5951** Implementation of the ieee754() function
5952*/
5953static void ieee754func(
5954 sqlite3_context *context,
5955 int argc,
5956 sqlite3_value **argv
5957){
5958 if( argc==1 ){
5959 sqlite3_int64 m, a;
5960 double r;
5961 int e;
5962 int isNeg;
5963 char zResult[100];
5964 assert( sizeof(m)==sizeof(r) );
5966 && sqlite3_value_bytes(argv[0])==sizeof(r)
5967 ){
5968 const unsigned char *x = sqlite3_value_blob(argv[0]);
5969 unsigned int i;
5970 sqlite3_uint64 v = 0;
5971 for(i=0; i<sizeof(r); i++){
5972 v = (v<<8) | x[i];
5973 }
5974 memcpy(&r, &v, sizeof(r));
5975 }else{
5976 r = sqlite3_value_double(argv[0]);
5977 }
5978 if( r<0.0 ){
5979 isNeg = 1;
5980 r = -r;
5981 }else{
5982 isNeg = 0;
5983 }
5984 memcpy(&a,&r,sizeof(a));
5985 if( a==0 ){
5986 e = 0;
5987 m = 0;
5988 }else{
5989 e = a>>52;
5990 m = a & ((((sqlite3_int64)1)<<52)-1);
5991 if( e==0 ){
5992 m <<= 1;
5993 }else{
5994 m |= ((sqlite3_int64)1)<<52;
5995 }
5996 while( e<1075 && m>0 && (m&1)==0 ){
5997 m >>= 1;
5998 e++;
5999 }
6000 if( isNeg ) m = -m;
6001 }
6002 switch( *(int*)sqlite3_user_data(context) ){
6003 case 0:
6004 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
6005 m, e-1075);
6007 break;
6008 case 1:
6009 sqlite3_result_int64(context, m);
6010 break;
6011 case 2:
6012 sqlite3_result_int(context, e-1075);
6013 break;
6014 }
6015 }else{
6016 sqlite3_int64 m, e, a;
6017 double r;
6018 int isNeg = 0;
6019 m = sqlite3_value_int64(argv[0]);
6020 e = sqlite3_value_int64(argv[1]);
6021
6022 /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */
6023 if( e>10000 ){
6024 e = 10000;
6025 }else if( e<-10000 ){
6026 e = -10000;
6027 }
6028
6029 if( m<0 ){
6030 isNeg = 1;
6031 m = -m;
6032 if( m<0 ) return;
6033 }else if( m==0 && e>-1000 && e<1000 ){
6034 sqlite3_result_double(context, 0.0);
6035 return;
6036 }
6037 while( (m>>32)&0xffe00000 ){
6038 m >>= 1;
6039 e++;
6040 }
6041 while( m!=0 && ((m>>32)&0xfff00000)==0 ){
6042 m <<= 1;
6043 e--;
6044 }
6045 e += 1075;
6046 if( e<=0 ){
6047 /* Subnormal */
6048 if( 1-e >= 64 ){
6049 m = 0;
6050 }else{
6051 m >>= 1-e;
6052 }
6053 e = 0;
6054 }else if( e>0x7ff ){
6055 e = 0x7ff;
6056 }
6057 a = m & ((((sqlite3_int64)1)<<52)-1);
6058 a |= e<<52;
6059 if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
6060 memcpy(&r, &a, sizeof(r));
6061 sqlite3_result_double(context, r);
6062 }
6063}
6064
6065/*
6066** Functions to convert between blobs and floats.
6067*/
6069 sqlite3_context *context,
6070 int argc,
6071 sqlite3_value **argv
6072){
6073 UNUSED_PARAMETER(argc);
6075 && sqlite3_value_bytes(argv[0])==sizeof(double)
6076 ){
6077 double r;
6078 const unsigned char *x = sqlite3_value_blob(argv[0]);
6079 unsigned int i;
6080 sqlite3_uint64 v = 0;
6081 for(i=0; i<sizeof(r); i++){
6082 v = (v<<8) | x[i];
6083 }
6084 memcpy(&r, &v, sizeof(r));
6085 sqlite3_result_double(context, r);
6086 }
6087}
6089 sqlite3_context *context,
6090 int argc,
6091 sqlite3_value **argv
6092){
6093 UNUSED_PARAMETER(argc);
6096 ){
6097 double r = sqlite3_value_double(argv[0]);
6099 unsigned char a[sizeof(r)];
6100 unsigned int i;
6101 memcpy(&v, &r, sizeof(r));
6102 for(i=1; i<=sizeof(r); i++){
6103 a[sizeof(r)-i] = v&0xff;
6104 v >>= 8;
6105 }
6106 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
6107 }
6108}
6109
6110/*
6111** SQL Function: ieee754_inc(r,N)
6112**
6113** Move the floating point value r by N quantums and return the new
6114** values.
6115**
6116** Behind the scenes: this routine merely casts r into a 64-bit unsigned
6117** integer, adds N, then casts the value back into float.
6118**
6119** Example: To find the smallest positive number:
6120**
6121** SELECT ieee754_inc(0.0,+1);
6122*/
6123static void ieee754inc(
6124 sqlite3_context *context,
6125 int argc,
6126 sqlite3_value **argv
6127){
6128 double r;
6129 sqlite3_int64 N;
6130 sqlite3_uint64 m1, m2;
6131 double r2;
6132 UNUSED_PARAMETER(argc);
6133 r = sqlite3_value_double(argv[0]);
6134 N = sqlite3_value_int64(argv[1]);
6135 memcpy(&m1, &r, 8);
6136 m2 = m1 + N;
6137 memcpy(&r2, &m2, 8);
6138 sqlite3_result_double(context, r2);
6139}
6140
6141
6142#ifdef _WIN32
6143
6144#endif
6146 sqlite3 *db,
6147 char **pzErrMsg,
6148 const sqlite3_api_routines *pApi
6149){
6150 static const struct {
6151 char *zFName;
6152 int nArg;
6153 int iAux;
6154 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
6155 } aFunc[] = {
6156 { "ieee754", 1, 0, ieee754func },
6157 { "ieee754", 2, 0, ieee754func },
6158 { "ieee754_mantissa", 1, 1, ieee754func },
6159 { "ieee754_exponent", 1, 2, ieee754func },
6160 { "ieee754_to_blob", 1, 0, ieee754func_to_blob },
6161 { "ieee754_from_blob", 1, 0, ieee754func_from_blob },
6162 { "ieee754_inc", 2, 0, ieee754inc },
6163 };
6164 unsigned int i;
6165 int rc = SQLITE_OK;
6167 (void)pzErrMsg; /* Unused parameter */
6168 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
6169 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
6171 (void*)&aFunc[i].iAux,
6172 aFunc[i].xFunc, 0, 0);
6173 }
6174 return rc;
6175}
6176
6177/************************* End ../ext/misc/ieee754.c ********************/
6178/************************* Begin ../ext/misc/series.c ******************/
6179/*
6180** 2015-08-18, 2023-04-28
6181**
6182** The author disclaims copyright to this source code. In place of
6183** a legal notice, here is a blessing:
6184**
6185** May you do good and not evil.
6186** May you find forgiveness for yourself and forgive others.
6187** May you share freely, never taking more than you give.
6188**
6189*************************************************************************
6190**
6191** This file demonstrates how to create a table-valued-function using
6192** a virtual table. This demo implements the generate_series() function
6193** which gives the same results as the eponymous function in PostgreSQL,
6194** within the limitation that its arguments are signed 64-bit integers.
6195**
6196** Considering its equivalents to generate_series(start,stop,step): A
6197** value V[n] sequence is produced for integer n ascending from 0 where
6198** ( V[n] == start + n * step && sgn(V[n] - stop) * sgn(step) >= 0 )
6199** for each produced value (independent of production time ordering.)
6200**
6201** All parameters must be either integer or convertable to integer.
6202** The start parameter is required.
6203** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
6204** The step parameter defaults to 1 and 0 is treated as 1.
6205**
6206** Examples:
6207**
6208** SELECT * FROM generate_series(0,100,5);
6209**
6210** The query above returns integers from 0 through 100 counting by steps
6211** of 5.
6212**
6213** SELECT * FROM generate_series(0,100);
6214**
6215** Integers from 0 through 100 with a step size of 1.
6216**
6217** SELECT * FROM generate_series(20) LIMIT 10;
6218**
6219** Integers 20 through 29.
6220**
6221** SELECT * FROM generate_series(0,-100,-5);
6222**
6223** Integers 0 -5 -10 ... -100.
6224**
6225** SELECT * FROM generate_series(0,-1);
6226**
6227** Empty sequence.
6228**
6229** HOW IT WORKS
6230**
6231** The generate_series "function" is really a virtual table with the
6232** following schema:
6233**
6234** CREATE TABLE generate_series(
6235** value,
6236** start HIDDEN,
6237** stop HIDDEN,
6238** step HIDDEN
6239** );
6240**
6241** The virtual table also has a rowid which is an alias for the value.
6242**
6243** Function arguments in queries against this virtual table are translated
6244** into equality constraints against successive hidden columns. In other
6245** words, the following pairs of queries are equivalent to each other:
6246**
6247** SELECT * FROM generate_series(0,100,5);
6248** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
6249**
6250** SELECT * FROM generate_series(0,100);
6251** SELECT * FROM generate_series WHERE start=0 AND stop=100;
6252**
6253** SELECT * FROM generate_series(20) LIMIT 10;
6254** SELECT * FROM generate_series WHERE start=20 LIMIT 10;
6255**
6256** The generate_series virtual table implementation leaves the xCreate method
6257** set to NULL. This means that it is not possible to do a CREATE VIRTUAL
6258** TABLE command with "generate_series" as the USING argument. Instead, there
6259** is a single generate_series virtual table that is always available without
6260** having to be created first.
6261**
6262** The xBestIndex method looks for equality constraints against the hidden
6263** start, stop, and step columns, and if present, it uses those constraints
6264** to bound the sequence of generated values. If the equality constraints
6265** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
6266** xBestIndex returns a small cost when both start and stop are available,
6267** and a very large cost if either start or stop are unavailable. This
6268** encourages the query planner to order joins such that the bounds of the
6269** series are well-defined.
6270**
6271** Update on 2024-08-22:
6272** xBestIndex now also looks for equality and inequality constraints against
6273** the value column and uses those constraints as additional bounds against
6274** the sequence range. Thus, a query like this:
6275**
6276** SELECT value FROM generate_series($SA,$EA)
6277** WHERE value BETWEEN $SB AND $EB;
6278**
6279** Is logically the same as:
6280**
6281** SELECT value FROM generate_series(max($SA,$SB),min($EA,$EB));
6282**
6283** Constraints on the value column can server as substitutes for constraints
6284** on the hidden start and stop columns. So, the following two queries
6285** are equivalent:
6286**
6287** SELECT value FROM generate_series($S,$E);
6288** SELECT value FROM generate_series WHERE value BETWEEN $S and $E;
6289**
6290*/
6291/* #include "sqlite3ext.h" */
6293#include <assert.h>
6294#include <string.h>
6295#include <limits.h>
6296#include <math.h>
6297
6298#ifndef SQLITE_OMIT_VIRTUALTABLE
6299/*
6300** Return that member of a generate_series(...) sequence whose 0-based
6301** index is ix. The 0th member is given by smBase. The sequence members
6302** progress per ix increment by smStep.
6303*/
6305 sqlite3_int64 smBase,
6306 sqlite3_int64 smStep,
6308){
6309 static const sqlite3_uint64 mxI64 =
6310 ((sqlite3_uint64)0x7fffffff)<<32 | 0xffffffff;
6311 if( ix>=mxI64 ){
6312 /* Get ix into signed i64 range. */
6313 ix -= mxI64;
6314 /* With 2's complement ALU, this next can be 1 step, but is split into
6315 * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
6316 smBase += (mxI64/2) * smStep;
6317 smBase += (mxI64 - mxI64/2) * smStep;
6318 }
6319 /* Under UBSAN (or on 1's complement machines), must do this last term
6320 * in steps to avoid the dreaded (and harmless) signed multiply overflow. */
6321 if( ix>=2 ){
6322 sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
6323 smBase += ix2*smStep;
6324 ix -= ix2;
6325 }
6326 return smBase + ((sqlite3_int64)ix)*smStep;
6327}
6328
6329/* typedef unsigned char u8; */
6330
6331typedef struct SequenceSpec {
6332 sqlite3_int64 iOBase; /* Original starting value ("start") */
6333 sqlite3_int64 iOTerm; /* Original terminal value ("stop") */
6334 sqlite3_int64 iBase; /* Starting value to actually use */
6335 sqlite3_int64 iTerm; /* Terminal value to actually use */
6336 sqlite3_int64 iStep; /* Increment ("step") */
6337 sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
6338 sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
6339 sqlite3_int64 iValueNow; /* Current value during generation */
6340 u8 isNotEOF; /* Sequence generation not exhausted */
6341 u8 isReversing; /* Sequence is being reverse generated */
6342} SequenceSpec;
6343
6344/*
6345** Prepare a SequenceSpec for use in generating an integer series
6346** given initialized iBase, iTerm and iStep values. Sequence is
6347** initialized per given isReversing. Other members are computed.
6348*/
6349static void setupSequence( SequenceSpec *pss ){
6350 int bSameSigns;
6351 pss->uSeqIndexMax = 0;
6352 pss->isNotEOF = 0;
6353 bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
6354 if( pss->iTerm < pss->iBase ){
6355 sqlite3_uint64 nuspan = 0;
6356 if( bSameSigns ){
6357 nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
6358 }else{
6359 /* Under UBSAN (or on 1's complement machines), must do this in steps.
6360 * In this clause, iBase>=0 and iTerm<0 . */
6361 nuspan = 1;
6362 nuspan += pss->iBase;
6363 nuspan += -(pss->iTerm+1);
6364 }
6365 if( pss->iStep<0 ){
6366 pss->isNotEOF = 1;
6367 if( nuspan==ULONG_MAX ){
6368 pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
6369 }else if( pss->iStep>LLONG_MIN ){
6370 pss->uSeqIndexMax = nuspan/-pss->iStep;
6371 }
6372 }
6373 }else if( pss->iTerm > pss->iBase ){
6374 sqlite3_uint64 puspan = 0;
6375 if( bSameSigns ){
6376 puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
6377 }else{
6378 /* Under UBSAN (or on 1's complement machines), must do this in steps.
6379 * In this clause, iTerm>=0 and iBase<0 . */
6380 puspan = 1;
6381 puspan += pss->iTerm;
6382 puspan += -(pss->iBase+1);
6383 }
6384 if( pss->iStep>0 ){
6385 pss->isNotEOF = 1;
6386 pss->uSeqIndexMax = puspan/pss->iStep;
6387 }
6388 }else if( pss->iTerm == pss->iBase ){
6389 pss->isNotEOF = 1;
6390 pss->uSeqIndexMax = 0;
6391 }
6393 pss->iValueNow = (pss->isReversing)
6395 : pss->iBase;
6396}
6397
6398/*
6399** Progress sequence generator to yield next value, if any.
6400** Leave its state to either yield next value or be at EOF.
6401** Return whether there is a next value, or 0 at EOF.
6402*/
6403static int progressSequence( SequenceSpec *pss ){
6404 if( !pss->isNotEOF ) return 0;
6405 if( pss->isReversing ){
6406 if( pss->uSeqIndexNow > 0 ){
6407 pss->uSeqIndexNow--;
6408 pss->iValueNow -= pss->iStep;
6409 }else{
6410 pss->isNotEOF = 0;
6411 }
6412 }else{
6413 if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
6414 pss->uSeqIndexNow++;
6415 pss->iValueNow += pss->iStep;
6416 }else{
6417 pss->isNotEOF = 0;
6418 }
6419 }
6420 return pss->isNotEOF;
6421}
6422
6423/* series_cursor is a subclass of sqlite3_vtab_cursor which will
6424** serve as the underlying representation of a cursor that scans
6425** over rows of the result
6426*/
6427typedef struct series_cursor series_cursor;
6429 sqlite3_vtab_cursor base; /* Base class - must be first */
6430 SequenceSpec ss; /* (this) Derived class data */
6431};
6432
6433/*
6434** The seriesConnect() method is invoked to create a new
6435** series_vtab that describes the generate_series virtual table.
6436**
6437** Think of this routine as the constructor for series_vtab objects.
6438**
6439** All this routine needs to do is:
6440**
6441** (1) Allocate the series_vtab object and initialize all fields.
6442**
6443** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
6444** result set of queries against generate_series will look like.
6445*/
6446static int seriesConnect(
6447 sqlite3 *db,
6448 void *pUnused,
6449 int argcUnused, const char *const*argvUnused,
6450 sqlite3_vtab **ppVtab,
6451 char **pzErrUnused
6452){
6453 sqlite3_vtab *pNew;
6454 int rc;
6455
6456/* Column numbers */
6457#define SERIES_COLUMN_ROWID (-1)
6458#define SERIES_COLUMN_VALUE 0
6459#define SERIES_COLUMN_START 1
6460#define SERIES_COLUMN_STOP 2
6461#define SERIES_COLUMN_STEP 3
6462
6463 (void)pUnused;
6464 (void)argcUnused;
6465 (void)argvUnused;
6466 (void)pzErrUnused;
6468 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
6469 if( rc==SQLITE_OK ){
6470 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
6471 if( pNew==0 ) return SQLITE_NOMEM;
6472 memset(pNew, 0, sizeof(*pNew));
6474 }
6475 return rc;
6476}
6477
6478/*
6479** This method is the destructor for series_cursor objects.
6480*/
6481static int seriesDisconnect(sqlite3_vtab *pVtab){
6482 sqlite3_free(pVtab);
6483 return SQLITE_OK;
6484}
6485
6486/*
6487** Constructor for a new series_cursor object.
6488*/
6489static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
6490 series_cursor *pCur;
6491 (void)pUnused;
6492 pCur = sqlite3_malloc( sizeof(*pCur) );
6493 if( pCur==0 ) return SQLITE_NOMEM;
6494 memset(pCur, 0, sizeof(*pCur));
6495 *ppCursor = &pCur->base;
6496 return SQLITE_OK;
6497}
6498
6499/*
6500** Destructor for a series_cursor.
6501*/
6502static int seriesClose(sqlite3_vtab_cursor *cur){
6503 sqlite3_free(cur);
6504 return SQLITE_OK;
6505}
6506
6507
6508/*
6509** Advance a series_cursor to its next row of output.
6510*/
6511static int seriesNext(sqlite3_vtab_cursor *cur){
6512 series_cursor *pCur = (series_cursor*)cur;
6513 progressSequence( & pCur->ss );
6514 return SQLITE_OK;
6515}
6516
6517/*
6518** Return values of columns for the row at which the series_cursor
6519** is currently pointing.
6520*/
6521static int seriesColumn(
6522 sqlite3_vtab_cursor *cur, /* The cursor */
6523 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
6524 int i /* Which column to return */
6525){
6526 series_cursor *pCur = (series_cursor*)cur;
6527 sqlite3_int64 x = 0;
6528 switch( i ){
6529 case SERIES_COLUMN_START: x = pCur->ss.iOBase; break;
6530 case SERIES_COLUMN_STOP: x = pCur->ss.iOTerm; break;
6531 case SERIES_COLUMN_STEP: x = pCur->ss.iStep; break;
6532 default: x = pCur->ss.iValueNow; break;
6533 }
6535 return SQLITE_OK;
6536}
6537
6538#ifndef LARGEST_UINT64
6539#define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
6540#define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
6541#define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
6542#endif
6543
6544/*
6545** The rowid is the same as the value.
6546*/
6547static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
6548 series_cursor *pCur = (series_cursor*)cur;
6549 *pRowid = pCur->ss.iValueNow;
6550 return SQLITE_OK;
6551}
6552
6553/*
6554** Return TRUE if the cursor has been moved off of the last
6555** row of output.
6556*/
6557static int seriesEof(sqlite3_vtab_cursor *cur){
6558 series_cursor *pCur = (series_cursor*)cur;
6559 return !pCur->ss.isNotEOF;
6560}
6561
6562/* True to cause run-time checking of the start=, stop=, and/or step=
6563** parameters. The only reason to do this is for testing the
6564** constraint checking logic for virtual tables in the SQLite core.
6565*/
6566#ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
6567# define SQLITE_SERIES_CONSTRAINT_VERIFY 0
6568#endif
6569
6570/*
6571** This method is called to "rewind" the series_cursor object back
6572** to the first row of output. This method is always called at least
6573** once prior to any call to seriesColumn() or seriesRowid() or
6574** seriesEof().
6575**
6576** The query plan selected by seriesBestIndex is passed in the idxNum
6577** parameter. (idxStr is not used in this implementation.) idxNum
6578** is a bitmask showing which constraints are available:
6579**
6580** 0x0001: start=VALUE
6581** 0x0002: stop=VALUE
6582** 0x0004: step=VALUE
6583** 0x0008: descending order
6584** 0x0010: ascending order
6585** 0x0020: LIMIT VALUE
6586** 0x0040: OFFSET VALUE
6587** 0x0080: value=VALUE
6588** 0x0100: value>=VALUE
6589** 0x0200: value>VALUE
6590** 0x1000: value<=VALUE
6591** 0x2000: value<VALUE
6592**
6593** This routine should initialize the cursor and position it so that it
6594** is pointing at the first row, or pointing off the end of the table
6595** (so that seriesEof() will return true) if the table is empty.
6596*/
6597static int seriesFilter(
6598 sqlite3_vtab_cursor *pVtabCursor,
6599 int idxNum, const char *idxStrUnused,
6600 int argc, sqlite3_value **argv
6601){
6602 series_cursor *pCur = (series_cursor *)pVtabCursor;
6603 int i = 0;
6604 int returnNoRows = 0;
6607 sqlite3_int64 iLimit = 0;
6608 sqlite3_int64 iOffset = 0;
6609
6610 (void)idxStrUnused;
6611 if( idxNum & 0x01 ){
6612 pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
6613 }else{
6614 pCur->ss.iBase = 0;
6615 }
6616 if( idxNum & 0x02 ){
6617 pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
6618 }else{
6619 pCur->ss.iTerm = 0xffffffff;
6620 }
6621 if( idxNum & 0x04 ){
6622 pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
6623 if( pCur->ss.iStep==0 ){
6624 pCur->ss.iStep = 1;
6625 }else if( pCur->ss.iStep<0 ){
6626 if( (idxNum & 0x10)==0 ) idxNum |= 0x08;
6627 }
6628 }else{
6629 pCur->ss.iStep = 1;
6630 }
6631
6632 /* If there are constraints on the value column but there are
6633 ** no constraints on the start, stop, and step columns, then
6634 ** initialize the default range to be the entire range of 64-bit signed
6635 ** integers. This range will contracted by the value column constraints
6636 ** further below.
6637 */
6638 if( (idxNum & 0x05)==0 && (idxNum & 0x0380)!=0 ){
6640 }
6641 if( (idxNum & 0x06)==0 && (idxNum & 0x3080)!=0 ){
6643 }
6644 pCur->ss.iOBase = pCur->ss.iBase;
6645 pCur->ss.iOTerm = pCur->ss.iTerm;
6646
6647 /* Extract the LIMIT and OFFSET values, but do not apply them yet.
6648 ** The range must first be constrained by the limits on value.
6649 */
6650 if( idxNum & 0x20 ){
6651 iLimit = sqlite3_value_int64(argv[i++]);
6652 if( idxNum & 0x40 ){
6653 iOffset = sqlite3_value_int64(argv[i++]);
6654 }
6655 }
6656
6657 if( idxNum & 0x3380 ){
6658 /* Extract the maximum range of output values determined by
6659 ** constraints on the "value" column.
6660 */
6661 if( idxNum & 0x0080 ){
6663 double r = sqlite3_value_double(argv[i++]);
6664 if( r==ceil(r) ){
6665 iMin = iMax = (sqlite3_int64)r;
6666 }else{
6667 returnNoRows = 1;
6668 }
6669 }else{
6670 iMin = iMax = sqlite3_value_int64(argv[i++]);
6671 }
6672 }else{
6673 if( idxNum & 0x0300 ){
6675 double r = sqlite3_value_double(argv[i++]);
6676 if( idxNum & 0x0200 && r==ceil(r) ){
6677 iMin = (sqlite3_int64)ceil(r+1.0);
6678 }else{
6679 iMin = (sqlite3_int64)ceil(r);
6680 }
6681 }else{
6682 iMin = sqlite3_value_int64(argv[i++]);
6683 if( idxNum & 0x0200 ){
6684 if( iMin==LARGEST_INT64 ){
6685 returnNoRows = 1;
6686 }else{
6687 iMin++;
6688 }
6689 }
6690 }
6691 }
6692 if( idxNum & 0x3000 ){
6694 double r = sqlite3_value_double(argv[i++]);
6695 if( (idxNum & 0x2000)!=0 && r==floor(r) ){
6696 iMax = (sqlite3_int64)(r-1.0);
6697 }else{
6698 iMax = (sqlite3_int64)floor(r);
6699 }
6700 }else{
6701 iMax = sqlite3_value_int64(argv[i++]);
6702 if( idxNum & 0x2000 ){
6703 if( iMax==SMALLEST_INT64 ){
6704 returnNoRows = 1;
6705 }else{
6706 iMax--;
6707 }
6708 }
6709 }
6710 }
6711 if( iMin>iMax ){
6712 returnNoRows = 1;
6713 }
6714 }
6715
6716 /* Try to reduce the range of values to be generated based on
6717 ** constraints on the "value" column.
6718 */
6719 if( pCur->ss.iStep>0 ){
6720 sqlite3_int64 szStep = pCur->ss.iStep;
6721 if( pCur->ss.iBase<iMin ){
6722 sqlite3_uint64 d = iMin - pCur->ss.iBase;
6723 pCur->ss.iBase += ((d+szStep-1)/szStep)*szStep;
6724 }
6725 if( pCur->ss.iTerm>iMax ){
6726 pCur->ss.iTerm = iMax;
6727 }
6728 }else{
6729 sqlite3_int64 szStep = -pCur->ss.iStep;
6730 assert( szStep>0 );
6731 if( pCur->ss.iBase>iMax ){
6732 sqlite3_uint64 d = pCur->ss.iBase - iMax;
6733 pCur->ss.iBase -= ((d+szStep-1)/szStep)*szStep;
6734 }
6735 if( pCur->ss.iTerm<iMin ){
6736 pCur->ss.iTerm = iMin;
6737 }
6738 }
6739 }
6740
6741 /* Apply LIMIT and OFFSET constraints, if any */
6742 if( idxNum & 0x20 ){
6743 if( iOffset>0 ){
6744 pCur->ss.iBase += pCur->ss.iStep*iOffset;
6745 }
6746 if( iLimit>=0 ){
6747 sqlite3_int64 iTerm;
6748 iTerm = pCur->ss.iBase + (iLimit - 1)*pCur->ss.iStep;
6749 if( pCur->ss.iStep<0 ){
6750 if( iTerm>pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
6751 }else{
6752 if( iTerm<pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
6753 }
6754 }
6755 }
6756
6757
6758 for(i=0; i<argc; i++){
6759 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
6760 /* If any of the constraints have a NULL value, then return no rows.
6761 ** See ticket https://sqlite.org/src/info/fac496b61722daf2 */
6762 returnNoRows = 1;
6763 break;
6764 }
6765 }
6766 if( returnNoRows ){
6767 pCur->ss.iBase = 1;
6768 pCur->ss.iTerm = 0;
6769 pCur->ss.iStep = 1;
6770 }
6771 if( idxNum & 0x08 ){
6772 pCur->ss.isReversing = pCur->ss.iStep > 0;
6773 }else{
6774 pCur->ss.isReversing = pCur->ss.iStep < 0;
6775 }
6776 setupSequence( &pCur->ss );
6777 return SQLITE_OK;
6778}
6779
6780/*
6781** SQLite will invoke this method one or more times while planning a query
6782** that uses the generate_series virtual table. This routine needs to create
6783** a query plan for each invocation and compute an estimated cost for that
6784** plan.
6785**
6786** In this implementation idxNum is used to represent the
6787** query plan. idxStr is unused.
6788**
6789** The query plan is represented by bits in idxNum:
6790**
6791** 0x0001 start = $num
6792** 0x0002 stop = $num
6793** 0x0004 step = $num
6794** 0x0008 output is in descending order
6795** 0x0010 output is in ascending order
6796** 0x0020 LIMIT $num
6797** 0x0040 OFFSET $num
6798** 0x0080 value = $num
6799** 0x0100 value >= $num
6800** 0x0200 value > $num
6801** 0x1000 value <= $num
6802** 0x2000 value < $num
6803**
6804** Only one of 0x0100 or 0x0200 will be returned. Similarly, only
6805** one of 0x1000 or 0x2000 will be returned. If the 0x0080 is set, then
6806** none of the 0xff00 bits will be set.
6807**
6808** The order of parameters passed to xFilter is as follows:
6809**
6810** * The argument to start= if bit 0x0001 is in the idxNum mask
6811** * The argument to stop= if bit 0x0002 is in the idxNum mask
6812** * The argument to step= if bit 0x0004 is in the idxNum mask
6813** * The argument to LIMIT if bit 0x0020 is in the idxNum mask
6814** * The argument to OFFSET if bit 0x0040 is in the idxNum mask
6815** * The argument to value=, or value>= or value> if any of
6816** bits 0x0380 are in the idxNum mask
6817** * The argument to value<= or value< if either of bits 0x3000
6818** are in the mask
6819**
6820*/
6822 sqlite3_vtab *pVTab,
6823 sqlite3_index_info *pIdxInfo
6824){
6825 int i, j; /* Loop over constraints */
6826 int idxNum = 0; /* The query plan bitmask */
6827#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6828 int bStartSeen = 0; /* EQ constraint seen on the START column */
6829#endif
6830 int unusableMask = 0; /* Mask of unusable constraints */
6831 int nArg = 0; /* Number of arguments that seriesFilter() expects */
6832 int aIdx[7]; /* Constraints on start, stop, step, LIMIT, OFFSET,
6833 ** and value. aIdx[5] covers value=, value>=, and
6834 ** value>, aIdx[6] covers value<= and value< */
6835 const struct sqlite3_index_constraint *pConstraint;
6836
6837 /* This implementation assumes that the start, stop, and step columns
6838 ** are the last three columns in the virtual table. */
6841
6842 aIdx[0] = aIdx[1] = aIdx[2] = aIdx[3] = aIdx[4] = aIdx[5] = aIdx[6] = -1;
6843 pConstraint = pIdxInfo->aConstraint;
6844 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
6845 int iCol; /* 0 for start, 1 for stop, 2 for step */
6846 int iMask; /* bitmask for those column */
6847 int op = pConstraint->op;
6850 ){
6851 if( pConstraint->usable==0 ){
6852 /* do nothing */
6853 }else if( op==SQLITE_INDEX_CONSTRAINT_LIMIT ){
6854 aIdx[3] = i;
6855 idxNum |= 0x20;
6856 }else{
6857 assert( op==SQLITE_INDEX_CONSTRAINT_OFFSET );
6858 aIdx[4] = i;
6859 idxNum |= 0x40;
6860 }
6861 continue;
6862 }
6863 if( pConstraint->iColumn<SERIES_COLUMN_START ){
6864 if( (pConstraint->iColumn==SERIES_COLUMN_VALUE ||
6865 pConstraint->iColumn==SERIES_COLUMN_ROWID)
6866 && pConstraint->usable
6867 ){
6868 switch( op ){
6871 idxNum |= 0x0080;
6872 idxNum &= ~0x3300;
6873 aIdx[5] = i;
6874 aIdx[6] = -1;
6875#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6876 bStartSeen = 1;
6877#endif
6878 break;
6879 }
6881 if( idxNum & 0x0080 ) break;
6882 idxNum |= 0x0100;
6883 idxNum &= ~0x0200;
6884 aIdx[5] = i;
6885#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6886 bStartSeen = 1;
6887#endif
6888 break;
6889 }
6891 if( idxNum & 0x0080 ) break;
6892 idxNum |= 0x0200;
6893 idxNum &= ~0x0100;
6894 aIdx[5] = i;
6895#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6896 bStartSeen = 1;
6897#endif
6898 break;
6899 }
6901 if( idxNum & 0x0080 ) break;
6902 idxNum |= 0x1000;
6903 idxNum &= ~0x2000;
6904 aIdx[6] = i;
6905 break;
6906 }
6908 if( idxNum & 0x0080 ) break;
6909 idxNum |= 0x2000;
6910 idxNum &= ~0x1000;
6911 aIdx[6] = i;
6912 break;
6913 }
6914 }
6915 }
6916 continue;
6917 }
6918 iCol = pConstraint->iColumn - SERIES_COLUMN_START;
6919 assert( iCol>=0 && iCol<=2 );
6920 iMask = 1 << iCol;
6921#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6922 if( iCol==0 && op==SQLITE_INDEX_CONSTRAINT_EQ ){
6923 bStartSeen = 1;
6924 }
6925#endif
6926 if( pConstraint->usable==0 ){
6927 unusableMask |= iMask;
6928 continue;
6929 }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){
6930 idxNum |= iMask;
6931 aIdx[iCol] = i;
6932 }
6933 }
6934 if( aIdx[3]==0 ){
6935 /* Ignore OFFSET if LIMIT is omitted */
6936 idxNum &= ~0x60;
6937 aIdx[4] = 0;
6938 }
6939 for(i=0; i<7; i++){
6940 if( (j = aIdx[i])>=0 ){
6941 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
6942 pIdxInfo->aConstraintUsage[j].omit =
6944 }
6945 }
6946 /* The current generate_column() implementation requires at least one
6947 ** argument (the START value). Legacy versions assumed START=0 if the
6948 ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES
6949 ** to obtain the legacy behavior */
6950#ifndef ZERO_ARGUMENT_GENERATE_SERIES
6951 if( !bStartSeen ){
6954 "first argument to \"generate_series()\" missing or unusable");
6955 return SQLITE_ERROR;
6956 }
6957#endif
6958 if( (unusableMask & ~idxNum)!=0 ){
6959 /* The start, stop, and step columns are inputs. Therefore if there
6960 ** are unusable constraints on any of start, stop, or step then
6961 ** this plan is unusable */
6962 return SQLITE_CONSTRAINT;
6963 }
6964 if( (idxNum & 0x03)==0x03 ){
6965 /* Both start= and stop= boundaries are available. This is the
6966 ** the preferred case */
6967 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
6968 pIdxInfo->estimatedRows = 1000;
6969 if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
6970 if( pIdxInfo->aOrderBy[0].desc ){
6971 idxNum |= 0x08;
6972 }else{
6973 idxNum |= 0x10;
6974 }
6975 pIdxInfo->orderByConsumed = 1;
6976 }
6977 }else if( (idxNum & 0x21)==0x21 ){
6978 /* We have start= and LIMIT */
6979 pIdxInfo->estimatedRows = 2500;
6980 }else{
6981 /* If either boundary is missing, we have to generate a huge span
6982 ** of numbers. Make this case very expensive so that the query
6983 ** planner will work hard to avoid it. */
6984 pIdxInfo->estimatedRows = 2147483647;
6985 }
6986 pIdxInfo->idxNum = idxNum;
6989#endif
6990 return SQLITE_OK;
6991}
6992
6993/*
6994** This following structure defines all the methods for the
6995** generate_series virtual table.
6996*/
6997static sqlite3_module seriesModule = {
6998 0, /* iVersion */
6999 0, /* xCreate */
7000 seriesConnect, /* xConnect */
7001 seriesBestIndex, /* xBestIndex */
7002 seriesDisconnect, /* xDisconnect */
7003 0, /* xDestroy */
7004 seriesOpen, /* xOpen - open a cursor */
7005 seriesClose, /* xClose - close a cursor */
7006 seriesFilter, /* xFilter - configure scan constraints */
7007 seriesNext, /* xNext - advance a cursor */
7008 seriesEof, /* xEof - check for end of scan */
7009 seriesColumn, /* xColumn - read data */
7010 seriesRowid, /* xRowid - read data */
7011 0, /* xUpdate */
7012 0, /* xBegin */
7013 0, /* xSync */
7014 0, /* xCommit */
7015 0, /* xRollback */
7016 0, /* xFindMethod */
7017 0, /* xRename */
7018 0, /* xSavepoint */
7019 0, /* xRelease */
7020 0, /* xRollbackTo */
7021 0, /* xShadowName */
7022 0 /* xIntegrity */
7023};
7024
7025#endif /* SQLITE_OMIT_VIRTUALTABLE */
7026
7027#ifdef _WIN32
7028
7029#endif
7031 sqlite3 *db,
7032 char **pzErrMsg,
7033 const sqlite3_api_routines *pApi
7034){
7035 int rc = SQLITE_OK;
7037#ifndef SQLITE_OMIT_VIRTUALTABLE
7038 if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
7039 *pzErrMsg = sqlite3_mprintf(
7040 "generate_series() requires SQLite 3.8.12 or later");
7041 return SQLITE_ERROR;
7042 }
7043 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
7044#endif
7045 return rc;
7046}
7047
7048/************************* End ../ext/misc/series.c ********************/
7049/************************* Begin ../ext/misc/regexp.c ******************/
7050/*
7051** 2012-11-13
7052**
7053** The author disclaims copyright to this source code. In place of
7054** a legal notice, here is a blessing:
7055**
7056** May you do good and not evil.
7057** May you find forgiveness for yourself and forgive others.
7058** May you share freely, never taking more than you give.
7059**
7060******************************************************************************
7061**
7062** The code in this file implements a compact but reasonably
7063** efficient regular-expression matcher for posix extended regular
7064** expressions against UTF8 text.
7065**
7066** This file is an SQLite extension. It registers a single function
7067** named "regexp(A,B)" where A is the regular expression and B is the
7068** string to be matched. By registering this function, SQLite will also
7069** then implement the "B regexp A" operator. Note that with the function
7070** the regular expression comes first, but with the operator it comes
7071** second.
7072**
7073** The following regular expression syntax is supported:
7074**
7075** X* zero or more occurrences of X
7076** X+ one or more occurrences of X
7077** X? zero or one occurrences of X
7078** X{p,q} between p and q occurrences of X
7079** (X) match X
7080** X|Y X or Y
7081** ^X X occurring at the beginning of the string
7082** X$ X occurring at the end of the string
7083** . Match any single character
7084** \c Character c where c is one of \{}()[]|*+?.
7085** \c C-language escapes for c in afnrtv. ex: \t or \n
7086** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
7087** \xXX Where XX is exactly 2 hex digits, unicode value XX
7088** [abc] Any single character from the set abc
7089** [^abc] Any single character not in the set abc
7090** [a-z] Any single character in the range a-z
7091** [^a-z] Any single character not in the range a-z
7092** \b Word boundary
7093** \w Word character. [A-Za-z0-9_]
7094** \W Non-word character
7095** \d Digit
7096** \D Non-digit
7097** \s Whitespace character
7098** \S Non-whitespace character
7099**
7100** A nondeterministic finite automaton (NFA) is used for matching, so the
7101** performance is bounded by O(N*M) where N is the size of the regular
7102** expression and M is the size of the input string. The matcher never
7103** exhibits exponential behavior. Note that the X{p,q} operator expands
7104** to p copies of X following by q-p copies of X? and that the size of the
7105** regular expression in the O(N*M) performance bound is computed after
7106** this expansion.
7107*/
7108#include <string.h>
7109#include <stdlib.h>
7110/* #include "sqlite3ext.h" */
7112
7113/*
7114** The following #defines change the names of some functions implemented in
7115** this file to prevent name collisions with C-library functions of the
7116** same name.
7117*/
7118#define re_match sqlite3re_match
7119#define re_compile sqlite3re_compile
7120#define re_free sqlite3re_free
7121
7122/* The end-of-input character */
7123#define RE_EOF 0 /* End of input */
7124#define RE_START 0xfffffff /* Start of input - larger than an UTF-8 */
7125
7126/* The NFA is implemented as sequence of opcodes taken from the following
7127** set. Each opcode has a single integer argument.
7128*/
7129#define RE_OP_MATCH 1 /* Match the one character in the argument */
7130#define RE_OP_ANY 2 /* Match any one character. (Implements ".") */
7131#define RE_OP_ANYSTAR 3 /* Special optimized version of .* */
7132#define RE_OP_FORK 4 /* Continue to both next and opcode at iArg */
7133#define RE_OP_GOTO 5 /* Jump to opcode at iArg */
7134#define RE_OP_ACCEPT 6 /* Halt and indicate a successful match */
7135#define RE_OP_CC_INC 7 /* Beginning of a [...] character class */
7136#define RE_OP_CC_EXC 8 /* Beginning of a [^...] character class */
7137#define RE_OP_CC_VALUE 9 /* Single value in a character class */
7138#define RE_OP_CC_RANGE 10 /* Range of values in a character class */
7139#define RE_OP_WORD 11 /* Perl word character [A-Za-z0-9_] */
7140#define RE_OP_NOTWORD 12 /* Not a perl word character */
7141#define RE_OP_DIGIT 13 /* digit: [0-9] */
7142#define RE_OP_NOTDIGIT 14 /* Not a digit */
7143#define RE_OP_SPACE 15 /* space: [ \t\n\r\v\f] */
7144#define RE_OP_NOTSPACE 16 /* Not a digit */
7145#define RE_OP_BOUNDARY 17 /* Boundary between word and non-word */
7146#define RE_OP_ATSTART 18 /* Currently at the start of the string */
7147
7148#if defined(SQLITE_DEBUG)
7149/* Opcode names used for symbolic debugging */
7150static const char *ReOpName[] = {
7151 "EOF",
7152 "MATCH",
7153 "ANY",
7154 "ANYSTAR",
7155 "FORK",
7156 "GOTO",
7157 "ACCEPT",
7158 "CC_INC",
7159 "CC_EXC",
7160 "CC_VALUE",
7161 "CC_RANGE",
7162 "WORD",
7163 "NOTWORD",
7164 "DIGIT",
7165 "NOTDIGIT",
7166 "SPACE",
7167 "NOTSPACE",
7168 "BOUNDARY",
7169 "ATSTART",
7170};
7171#endif /* SQLITE_DEBUG */
7172
7173
7174/* Each opcode is a "state" in the NFA */
7175typedef unsigned short ReStateNumber;
7176
7177/* Because this is an NFA and not a DFA, multiple states can be active at
7178** once. An instance of the following object records all active states in
7179** the NFA. The implementation is optimized for the common case where the
7180** number of actives states is small.
7181*/
7182typedef struct ReStateSet {
7183 unsigned nState; /* Number of current states */
7184 ReStateNumber *aState; /* Current states */
7185} ReStateSet;
7186
7187/* An input string read one character at a time.
7188*/
7189typedef struct ReInput ReInput;
7190struct ReInput {
7191 const unsigned char *z; /* All text */
7192 int i; /* Next byte to read */
7193 int mx; /* EOF when i>=mx */
7194};
7195
7196/* A compiled NFA (or an NFA that is in the process of being compiled) is
7197** an instance of the following object.
7198*/
7199typedef struct ReCompiled ReCompiled;
7201 ReInput sIn; /* Regular expression text */
7202 const char *zErr; /* Error message to return */
7203 char *aOp; /* Operators for the virtual machine */
7204 int *aArg; /* Arguments to each operator */
7205 unsigned (*xNextChar)(ReInput*); /* Next character function */
7206 unsigned char zInit[12]; /* Initial text to match */
7207 int nInit; /* Number of bytes in zInit */
7208 unsigned nState; /* Number of entries in aOp[] and aArg[] */
7209 unsigned nAlloc; /* Slots allocated for aOp[] and aArg[] */
7210};
7211
7212/* Add a state to the given state set if it is not already there */
7213static void re_add_state(ReStateSet *pSet, int newState){
7214 unsigned i;
7215 for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
7216 pSet->aState[pSet->nState++] = (ReStateNumber)newState;
7217}
7218
7219/* Extract the next unicode character from *pzIn and return it. Advance
7220** *pzIn to the first byte past the end of the character returned. To
7221** be clear: this routine converts utf8 to unicode. This routine is
7222** optimized for the common case where the next character is a single byte.
7223*/
7224static unsigned re_next_char(ReInput *p){
7225 unsigned c;
7226 if( p->i>=p->mx ) return 0;
7227 c = p->z[p->i++];
7228 if( c>=0x80 ){
7229 if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
7230 c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
7231 if( c<0x80 ) c = 0xfffd;
7232 }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
7233 && (p->z[p->i+1]&0xc0)==0x80 ){
7234 c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
7235 p->i += 2;
7236 if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
7237 }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
7238 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
7239 c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
7240 | (p->z[p->i+2]&0x3f);
7241 p->i += 3;
7242 if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
7243 }else{
7244 c = 0xfffd;
7245 }
7246 }
7247 return c;
7248}
7249static unsigned re_next_char_nocase(ReInput *p){
7250 unsigned c = re_next_char(p);
7251 if( c>='A' && c<='Z' ) c += 'a' - 'A';
7252 return c;
7253}
7254
7255/* Return true if c is a perl "word" character: [A-Za-z0-9_] */
7256static int re_word_char(int c){
7257 return (c>='0' && c<='9') || (c>='a' && c<='z')
7258 || (c>='A' && c<='Z') || c=='_';
7259}
7260
7261/* Return true if c is a "digit" character: [0-9] */
7262static int re_digit_char(int c){
7263 return (c>='0' && c<='9');
7264}
7265
7266/* Return true if c is a perl "space" character: [ \t\r\n\v\f] */
7267static int re_space_char(int c){
7268 return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
7269}
7270
7271/* Run a compiled regular expression on the zero-terminated input
7272** string zIn[]. Return true on a match and false if there is no match.
7273*/
7274static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
7275 ReStateSet aStateSet[2], *pThis, *pNext;
7276 ReStateNumber aSpace[100];
7277 ReStateNumber *pToFree;
7278 unsigned int i = 0;
7279 unsigned int iSwap = 0;
7280 int c = RE_START;
7281 int cPrev = 0;
7282 int rc = 0;
7283 ReInput in;
7284
7285 in.z = zIn;
7286 in.i = 0;
7287 in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
7288
7289 /* Look for the initial prefix match, if there is one. */
7290 if( pRe->nInit ){
7291 unsigned char x = pRe->zInit[0];
7292 while( in.i+pRe->nInit<=in.mx
7293 && (zIn[in.i]!=x ||
7294 strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
7295 ){
7296 in.i++;
7297 }
7298 if( in.i+pRe->nInit>in.mx ) return 0;
7299 c = RE_START-1;
7300 }
7301
7302 if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
7303 pToFree = 0;
7304 aStateSet[0].aState = aSpace;
7305 }else{
7306 pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
7307 if( pToFree==0 ) return -1;
7308 aStateSet[0].aState = pToFree;
7309 }
7310 aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
7311 pNext = &aStateSet[1];
7312 pNext->nState = 0;
7313 re_add_state(pNext, 0);
7314 while( c!=RE_EOF && pNext->nState>0 ){
7315 cPrev = c;
7316 c = pRe->xNextChar(&in);
7317 pThis = pNext;
7318 pNext = &aStateSet[iSwap];
7319 iSwap = 1 - iSwap;
7320 pNext->nState = 0;
7321 for(i=0; i<pThis->nState; i++){
7322 int x = pThis->aState[i];
7323 switch( pRe->aOp[x] ){
7324 case RE_OP_MATCH: {
7325 if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
7326 break;
7327 }
7328 case RE_OP_ATSTART: {
7329 if( cPrev==RE_START ) re_add_state(pThis, x+1);
7330 break;
7331 }
7332 case RE_OP_ANY: {
7333 if( c!=0 ) re_add_state(pNext, x+1);
7334 break;
7335 }
7336 case RE_OP_WORD: {
7337 if( re_word_char(c) ) re_add_state(pNext, x+1);
7338 break;
7339 }
7340 case RE_OP_NOTWORD: {
7341 if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
7342 break;
7343 }
7344 case RE_OP_DIGIT: {
7345 if( re_digit_char(c) ) re_add_state(pNext, x+1);
7346 break;
7347 }
7348 case RE_OP_NOTDIGIT: {
7349 if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
7350 break;
7351 }
7352 case RE_OP_SPACE: {
7353 if( re_space_char(c) ) re_add_state(pNext, x+1);
7354 break;
7355 }
7356 case RE_OP_NOTSPACE: {
7357 if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
7358 break;
7359 }
7360 case RE_OP_BOUNDARY: {
7361 if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
7362 break;
7363 }
7364 case RE_OP_ANYSTAR: {
7365 re_add_state(pNext, x);
7366 re_add_state(pThis, x+1);
7367 break;
7368 }
7369 case RE_OP_FORK: {
7370 re_add_state(pThis, x+pRe->aArg[x]);
7371 re_add_state(pThis, x+1);
7372 break;
7373 }
7374 case RE_OP_GOTO: {
7375 re_add_state(pThis, x+pRe->aArg[x]);
7376 break;
7377 }
7378 case RE_OP_ACCEPT: {
7379 rc = 1;
7380 goto re_match_end;
7381 }
7382 case RE_OP_CC_EXC: {
7383 if( c==0 ) break;
7384 /* fall-through */ goto re_op_cc_inc;
7385 }
7386 case RE_OP_CC_INC: re_op_cc_inc: {
7387 int j = 1;
7388 int n = pRe->aArg[x];
7389 int hit = 0;
7390 for(j=1; j>0 && j<n; j++){
7391 if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
7392 if( pRe->aArg[x+j]==c ){
7393 hit = 1;
7394 j = -1;
7395 }
7396 }else{
7397 if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
7398 hit = 1;
7399 j = -1;
7400 }else{
7401 j++;
7402 }
7403 }
7404 }
7405 if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
7406 if( hit ) re_add_state(pNext, x+n);
7407 break;
7408 }
7409 }
7410 }
7411 }
7412 for(i=0; i<pNext->nState; i++){
7413 int x = pNext->aState[i];
7414 while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
7415 if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
7416 }
7417re_match_end:
7418 sqlite3_free(pToFree);
7419 return rc;
7420}
7421
7422/* Resize the opcode and argument arrays for an RE under construction.
7423*/
7424static int re_resize(ReCompiled *p, int N){
7425 char *aOp;
7426 int *aArg;
7427 aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
7428 if( aOp==0 ) return 1;
7429 p->aOp = aOp;
7430 aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
7431 if( aArg==0 ) return 1;
7432 p->aArg = aArg;
7433 p->nAlloc = N;
7434 return 0;
7435}
7436
7437/* Insert a new opcode and argument into an RE under construction. The
7438** insertion point is just prior to existing opcode iBefore.
7439*/
7440static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
7441 int i;
7442 if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
7443 for(i=p->nState; i>iBefore; i--){
7444 p->aOp[i] = p->aOp[i-1];
7445 p->aArg[i] = p->aArg[i-1];
7446 }
7447 p->nState++;
7448 p->aOp[iBefore] = (char)op;
7449 p->aArg[iBefore] = arg;
7450 return iBefore;
7451}
7452
7453/* Append a new opcode and argument to the end of the RE under construction.
7454*/
7455static int re_append(ReCompiled *p, int op, int arg){
7456 return re_insert(p, p->nState, op, arg);
7457}
7458
7459/* Make a copy of N opcodes starting at iStart onto the end of the RE
7460** under construction.
7461*/
7462static void re_copy(ReCompiled *p, int iStart, int N){
7463 if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
7464 memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
7465 memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
7466 p->nState += N;
7467}
7468
7469/* Return true if c is a hexadecimal digit character: [0-9a-fA-F]
7470** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c). If
7471** c is not a hex digit *pV is unchanged.
7472*/
7473static int re_hex(int c, int *pV){
7474 if( c>='0' && c<='9' ){
7475 c -= '0';
7476 }else if( c>='a' && c<='f' ){
7477 c -= 'a' - 10;
7478 }else if( c>='A' && c<='F' ){
7479 c -= 'A' - 10;
7480 }else{
7481 return 0;
7482 }
7483 *pV = (*pV)*16 + (c & 0xff);
7484 return 1;
7485}
7486
7487/* A backslash character has been seen, read the next character and
7488** return its interpretation.
7489*/
7490static unsigned re_esc_char(ReCompiled *p){
7491 static const char zEsc[] = "afnrtv\\‍()*.+?[$^{|}]";
7492 static const char zTrans[] = "\a\f\n\r\t\v";
7493 int i, v = 0;
7494 char c;
7495 if( p->sIn.i>=p->sIn.mx ) return 0;
7496 c = p->sIn.z[p->sIn.i];
7497 if( c=='u' && p->sIn.i+4<p->sIn.mx ){
7498 const unsigned char *zIn = p->sIn.z + p->sIn.i;
7499 if( re_hex(zIn[1],&v)
7500 && re_hex(zIn[2],&v)
7501 && re_hex(zIn[3],&v)
7502 && re_hex(zIn[4],&v)
7503 ){
7504 p->sIn.i += 5;
7505 return v;
7506 }
7507 }
7508 if( c=='x' && p->sIn.i+2<p->sIn.mx ){
7509 const unsigned char *zIn = p->sIn.z + p->sIn.i;
7510 if( re_hex(zIn[1],&v)
7511 && re_hex(zIn[2],&v)
7512 ){
7513 p->sIn.i += 3;
7514 return v;
7515 }
7516 }
7517 for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
7518 if( zEsc[i] ){
7519 if( i<6 ) c = zTrans[i];
7520 p->sIn.i++;
7521 }else{
7522 p->zErr = "unknown \\ escape";
7523 }
7524 return c;
7525}
7526
7527/* Forward declaration */
7528static const char *re_subcompile_string(ReCompiled*);
7529
7530/* Peek at the next byte of input */
7531static unsigned char rePeek(ReCompiled *p){
7532 return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
7533}
7534
7535/* Compile RE text into a sequence of opcodes. Continue up to the
7536** first unmatched ")" character, then return. If an error is found,
7537** return a pointer to the error message string.
7538*/
7539static const char *re_subcompile_re(ReCompiled *p){
7540 const char *zErr;
7541 int iStart, iEnd, iGoto;
7542 iStart = p->nState;
7543 zErr = re_subcompile_string(p);
7544 if( zErr ) return zErr;
7545 while( rePeek(p)=='|' ){
7546 iEnd = p->nState;
7547 re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
7548 iGoto = re_append(p, RE_OP_GOTO, 0);
7549 p->sIn.i++;
7550 zErr = re_subcompile_string(p);
7551 if( zErr ) return zErr;
7552 p->aArg[iGoto] = p->nState - iGoto;
7553 }
7554 return 0;
7555}
7556
7557/* Compile an element of regular expression text (anything that can be
7558** an operand to the "|" operator). Return NULL on success or a pointer
7559** to the error message if there is a problem.
7560*/
7561static const char *re_subcompile_string(ReCompiled *p){
7562 int iPrev = -1;
7563 int iStart;
7564 unsigned c;
7565 const char *zErr;
7566 while( (c = p->xNextChar(&p->sIn))!=0 ){
7567 iStart = p->nState;
7568 switch( c ){
7569 case '|':
7570 case ')': {
7571 p->sIn.i--;
7572 return 0;
7573 }
7574 case '(': {
7575 zErr = re_subcompile_re(p);
7576 if( zErr ) return zErr;
7577 if( rePeek(p)!=')' ) return "unmatched '('";
7578 p->sIn.i++;
7579 break;
7580 }
7581 case '.': {
7582 if( rePeek(p)=='*' ){
7584 p->sIn.i++;
7585 }else{
7587 }
7588 break;
7589 }
7590 case '*': {
7591 if( iPrev<0 ) return "'*' without operand";
7592 re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
7593 re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
7594 break;
7595 }
7596 case '+': {
7597 if( iPrev<0 ) return "'+' without operand";
7599 break;
7600 }
7601 case '?': {
7602 if( iPrev<0 ) return "'?' without operand";
7603 re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
7604 break;
7605 }
7606 case '$': {
7608 break;
7609 }
7610 case '^': {
7612 break;
7613 }
7614 case '{': {
7615 int m = 0, n = 0;
7616 int sz, j;
7617 if( iPrev<0 ) return "'{m,n}' without operand";
7618 while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
7619 n = m;
7620 if( c==',' ){
7621 p->sIn.i++;
7622 n = 0;
7623 while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
7624 }
7625 if( c!='}' ) return "unmatched '{'";
7626 if( n>0 && n<m ) return "n less than m in '{m,n}'";
7627 p->sIn.i++;
7628 sz = p->nState - iPrev;
7629 if( m==0 ){
7630 if( n==0 ) return "both m and n are zero in '{m,n}'";
7631 re_insert(p, iPrev, RE_OP_FORK, sz+1);
7632 iPrev++;
7633 n--;
7634 }else{
7635 for(j=1; j<m; j++) re_copy(p, iPrev, sz);
7636 }
7637 for(j=m; j<n; j++){
7639 re_copy(p, iPrev, sz);
7640 }
7641 if( n==0 && m>0 ){
7643 }
7644 break;
7645 }
7646 case '[': {
7647 unsigned int iFirst = p->nState;
7648 if( rePeek(p)=='^' ){
7650 p->sIn.i++;
7651 }else{
7653 }
7654 while( (c = p->xNextChar(&p->sIn))!=0 ){
7655 if( c=='[' && rePeek(p)==':' ){
7656 return "POSIX character classes not supported";
7657 }
7658 if( c=='\\' ) c = re_esc_char(p);
7659 if( rePeek(p)=='-' ){
7661 p->sIn.i++;
7662 c = p->xNextChar(&p->sIn);
7663 if( c=='\\' ) c = re_esc_char(p);
7665 }else{
7667 }
7668 if( rePeek(p)==']' ){ p->sIn.i++; break; }
7669 }
7670 if( c==0 ) return "unclosed '['";
7671 if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
7672 break;
7673 }
7674 case '\\': {
7675 int specialOp = 0;
7676 switch( rePeek(p) ){
7677 case 'b': specialOp = RE_OP_BOUNDARY; break;
7678 case 'd': specialOp = RE_OP_DIGIT; break;
7679 case 'D': specialOp = RE_OP_NOTDIGIT; break;
7680 case 's': specialOp = RE_OP_SPACE; break;
7681 case 'S': specialOp = RE_OP_NOTSPACE; break;
7682 case 'w': specialOp = RE_OP_WORD; break;
7683 case 'W': specialOp = RE_OP_NOTWORD; break;
7684 }
7685 if( specialOp ){
7686 p->sIn.i++;
7687 re_append(p, specialOp, 0);
7688 }else{
7689 c = re_esc_char(p);
7691 }
7692 break;
7693 }
7694 default: {
7696 break;
7697 }
7698 }
7699 iPrev = iStart;
7700 }
7701 return 0;
7702}
7703
7704/* Free and reclaim all the memory used by a previously compiled
7705** regular expression. Applications should invoke this routine once
7706** for every call to re_compile() to avoid memory leaks.
7707*/
7708static void re_free(void *p){
7709 ReCompiled *pRe = (ReCompiled*)p;
7710 if( pRe ){
7713 sqlite3_free(pRe);
7714 }
7715}
7716
7717/*
7718** Compile a textual regular expression in zIn[] into a compiled regular
7719** expression suitable for us by re_match() and return a pointer to the
7720** compiled regular expression in *ppRe. Return NULL on success or an
7721** error message if something goes wrong.
7722*/
7723static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
7724 ReCompiled *pRe;
7725 const char *zErr;
7726 int i, j;
7727
7728 *ppRe = 0;
7729 pRe = sqlite3_malloc( sizeof(*pRe) );
7730 if( pRe==0 ){
7731 return "out of memory";
7732 }
7733 memset(pRe, 0, sizeof(*pRe));
7735 if( re_resize(pRe, 30) ){
7736 re_free(pRe);
7737 return "out of memory";
7738 }
7739 if( zIn[0]=='^' ){
7740 zIn++;
7741 }else{
7743 }
7744 pRe->sIn.z = (unsigned char*)zIn;
7745 pRe->sIn.i = 0;
7746 pRe->sIn.mx = (int)strlen(zIn);
7747 zErr = re_subcompile_re(pRe);
7748 if( zErr ){
7749 re_free(pRe);
7750 return zErr;
7751 }
7752 if( pRe->sIn.i>=pRe->sIn.mx ){
7754 *ppRe = pRe;
7755 }else{
7756 re_free(pRe);
7757 return "unrecognized character";
7758 }
7759
7760 /* The following is a performance optimization. If the regex begins with
7761 ** ".*" (if the input regex lacks an initial "^") and afterwards there are
7762 ** one or more matching characters, enter those matching characters into
7763 ** zInit[]. The re_match() routine can then search ahead in the input
7764 ** string looking for the initial match without having to run the whole
7765 ** regex engine over the string. Do not worry about trying to match
7766 ** unicode characters beyond plane 0 - those are very rare and this is
7767 ** just an optimization. */
7768 if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
7769 for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
7770 unsigned x = pRe->aArg[i];
7771 if( x<=0x7f ){
7772 pRe->zInit[j++] = (unsigned char)x;
7773 }else if( x<=0x7ff ){
7774 pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
7775 pRe->zInit[j++] = 0x80 | (x&0x3f);
7776 }else if( x<=0xffff ){
7777 pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
7778 pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
7779 pRe->zInit[j++] = 0x80 | (x&0x3f);
7780 }else{
7781 break;
7782 }
7783 }
7784 if( j>0 && pRe->zInit[j-1]==0 ) j--;
7785 pRe->nInit = j;
7786 }
7787 return pRe->zErr;
7788}
7789
7790/*
7791** Implementation of the regexp() SQL function. This function implements
7792** the build-in REGEXP operator. The first argument to the function is the
7793** pattern and the second argument is the string. So, the SQL statements:
7794**
7795** A REGEXP B
7796**
7797** is implemented as regexp(B,A).
7798*/
7799static void re_sql_func(
7800 sqlite3_context *context,
7801 int argc,
7802 sqlite3_value **argv
7803){
7804 ReCompiled *pRe; /* Compiled regular expression */
7805 const char *zPattern; /* The regular expression */
7806 const unsigned char *zStr;/* String being searched */
7807 const char *zErr; /* Compile error message */
7808 int setAux = 0; /* True to invoke sqlite3_set_auxdata() */
7809
7810 (void)argc; /* Unused */
7811 pRe = sqlite3_get_auxdata(context, 0);
7812 if( pRe==0 ){
7813 zPattern = (const char*)sqlite3_value_text(argv[0]);
7814 if( zPattern==0 ) return;
7815 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
7816 if( zErr ){
7817 re_free(pRe);
7818 sqlite3_result_error(context, zErr, -1);
7819 return;
7820 }
7821 if( pRe==0 ){
7823 return;
7824 }
7825 setAux = 1;
7826 }
7827 zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
7828 if( zStr!=0 ){
7829 sqlite3_result_int(context, re_match(pRe, zStr, -1));
7830 }
7831 if( setAux ){
7832 sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
7833 }
7834}
7835
7836#if defined(SQLITE_DEBUG)
7837/*
7838** This function is used for testing and debugging only. It is only available
7839** if the SQLITE_DEBUG compile-time option is used.
7840**
7841** Compile a regular expression and then convert the compiled expression into
7842** text and return that text.
7843*/
7844static void re_bytecode_func(
7845 sqlite3_context *context,
7846 int argc,
7847 sqlite3_value **argv
7848){
7849 const char *zPattern;
7850 const char *zErr;
7851 ReCompiled *pRe;
7852 sqlite3_str *pStr;
7853 int i;
7854 int n;
7855 char *z;
7856 (void)argc;
7857
7858 zPattern = (const char*)sqlite3_value_text(argv[0]);
7859 if( zPattern==0 ) return;
7860 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
7861 if( zErr ){
7862 re_free(pRe);
7863 sqlite3_result_error(context, zErr, -1);
7864 return;
7865 }
7866 if( pRe==0 ){
7867 sqlite3_result_error_nomem(context);
7868 return;
7869 }
7870 pStr = sqlite3_str_new(0);
7871 if( pStr==0 ) goto re_bytecode_func_err;
7872 if( pRe->nInit>0 ){
7873 sqlite3_str_appendf(pStr, "INIT ");
7874 for(i=0; i<pRe->nInit; i++){
7875 sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
7876 }
7877 sqlite3_str_appendf(pStr, "\n");
7878 }
7879 for(i=0; (unsigned)i<pRe->nState; i++){
7880 sqlite3_str_appendf(pStr, "%-8s %4d\n",
7881 ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
7882 }
7883 n = sqlite3_str_length(pStr);
7884 z = sqlite3_str_finish(pStr);
7885 if( n==0 ){
7886 sqlite3_free(z);
7887 }else{
7888 sqlite3_result_text(context, z, n-1, sqlite3_free);
7889 }
7890
7891re_bytecode_func_err:
7892 re_free(pRe);
7893}
7894
7895#endif /* SQLITE_DEBUG */
7896
7897
7898/*
7899** Invoke this routine to register the regexp() function with the
7900** SQLite database connection.
7901*/
7902#ifdef _WIN32
7903
7904#endif
7906 sqlite3 *db,
7907 char **pzErrMsg,
7908 const sqlite3_api_routines *pApi
7909){
7910 int rc = SQLITE_OK;
7912 (void)pzErrMsg; /* Unused */
7913 rc = sqlite3_create_function(db, "regexp", 2,
7915 0, re_sql_func, 0, 0);
7916 if( rc==SQLITE_OK ){
7917 /* The regexpi(PATTERN,STRING) function is a case-insensitive version
7918 ** of regexp(PATTERN,STRING). */
7919 rc = sqlite3_create_function(db, "regexpi", 2,
7921 (void*)db, re_sql_func, 0, 0);
7922#if defined(SQLITE_DEBUG)
7923 if( rc==SQLITE_OK ){
7924 rc = sqlite3_create_function(db, "regexp_bytecode", 1,
7925 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7926 0, re_bytecode_func, 0, 0);
7927 }
7928#endif /* SQLITE_DEBUG */
7929 }
7930 return rc;
7931}
7932
7933/************************* End ../ext/misc/regexp.c ********************/
7934#ifndef SQLITE_SHELL_FIDDLE
7935/************************* Begin ../ext/misc/fileio.c ******************/
7936/*
7937** 2014-06-13
7938**
7939** The author disclaims copyright to this source code. In place of
7940** a legal notice, here is a blessing:
7941**
7942** May you do good and not evil.
7943** May you find forgiveness for yourself and forgive others.
7944** May you share freely, never taking more than you give.
7945**
7946******************************************************************************
7947**
7948** This SQLite extension implements SQL functions readfile() and
7949** writefile(), and eponymous virtual type "fsdir".
7950**
7951** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
7952**
7953** If neither of the optional arguments is present, then this UDF
7954** function writes blob DATA to file FILE. If successful, the number
7955** of bytes written is returned. If an error occurs, NULL is returned.
7956**
7957** If the first option argument - MODE - is present, then it must
7958** be passed an integer value that corresponds to a POSIX mode
7959** value (file type + permissions, as returned in the stat.st_mode
7960** field by the stat() system call). Three types of files may
7961** be written/created:
7962**
7963** regular files: (mode & 0170000)==0100000
7964** symbolic links: (mode & 0170000)==0120000
7965** directories: (mode & 0170000)==0040000
7966**
7967** For a directory, the DATA is ignored. For a symbolic link, it is
7968** interpreted as text and used as the target of the link. For a
7969** regular file, it is interpreted as a blob and written into the
7970** named file. Regardless of the type of file, its permissions are
7971** set to (mode & 0777) before returning.
7972**
7973** If the optional MTIME argument is present, then it is interpreted
7974** as an integer - the number of seconds since the unix epoch. The
7975** modification-time of the target file is set to this value before
7976** returning.
7977**
7978** If five or more arguments are passed to this function and an
7979** error is encountered, an exception is raised.
7980**
7981** READFILE(FILE):
7982**
7983** Read and return the contents of file FILE (type blob) from disk.
7984**
7985** FSDIR:
7986**
7987** Used as follows:
7988**
7989** SELECT * FROM fsdir($path [, $dir]);
7990**
7991** Parameter $path is an absolute or relative pathname. If the file that it
7992** refers to does not exist, it is an error. If the path refers to a regular
7993** file or symbolic link, it returns a single row. Or, if the path refers
7994** to a directory, it returns one row for the directory, and one row for each
7995** file within the hierarchy rooted at $path.
7996**
7997** Each row has the following columns:
7998**
7999** name: Path to file or directory (text value).
8000** mode: Value of stat.st_mode for directory entry (an integer).
8001** mtime: Value of stat.st_mtime for directory entry (an integer).
8002** data: For a regular file, a blob containing the file data. For a
8003** symlink, a text value containing the text of the link. For a
8004** directory, NULL.
8005**
8006** If a non-NULL value is specified for the optional $dir parameter and
8007** $path is a relative path, then $path is interpreted relative to $dir.
8008** And the paths returned in the "name" column of the table are also
8009** relative to directory $dir.
8010**
8011** Notes on building this extension for Windows:
8012** Unless linked statically with the SQLite library, a preprocessor
8013** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
8014** DLL form of this extension for WIN32. See its use below for details.
8015*/
8016/* #include "sqlite3ext.h" */
8018#include <stdio.h>
8019#include <string.h>
8020#include <assert.h>
8021
8022#include <sys/types.h>
8023#include <sys/stat.h>
8024#include <fcntl.h>
8025#if !defined(_WIN32) && !defined(WIN32)
8026# include <unistd.h>
8027# include <dirent.h>
8028# include <utime.h>
8029# include <sys/time.h>
8030# define STRUCT_STAT struct stat
8031#else
8032# include "windows.h"
8033# include <io.h>
8034# include <direct.h>
8035/* # include "test_windirent.h" */
8036# define dirent DIRENT
8037# define STRUCT_STAT struct _stat
8038# define chmod(path,mode) fileio_chmod(path,mode)
8039# define mkdir(path,mode) fileio_mkdir(path)
8040#endif
8041#include <time.h>
8042#include <errno.h>
8043
8044/* When used as part of the CLI, the sqlite3_stdio.h module will have
8045** been included before this one. In that case use the sqlite3_stdio.h
8046** #defines. If not, create our own for fopen().
8047*/
8048#ifndef _SQLITE3_STDIO_H_
8049# define sqlite3_fopen fopen
8050#endif
8051
8052/*
8053** Structure of the fsdir() table-valued function
8054*/
8055 /* 0 1 2 3 4 5 */
8056#define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
8057#define FSDIR_COLUMN_NAME 0 /* Name of the file */
8058#define FSDIR_COLUMN_MODE 1 /* Access mode */
8059#define FSDIR_COLUMN_MTIME 2 /* Last modification time */
8060#define FSDIR_COLUMN_DATA 3 /* File content */
8061#define FSDIR_COLUMN_PATH 4 /* Path to top of search */
8062#define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */
8063
8064/*
8065** UTF8 chmod() function for Windows
8066*/
8067#if defined(_WIN32) || defined(WIN32)
8068static int fileio_chmod(const char *zPath, int pmode){
8069 sqlite3_int64 sz = strlen(zPath);
8070 wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
8071 int rc;
8072 if( b1==0 ) return -1;
8073 sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
8074 b1[sz] = 0;
8075 rc = _wchmod(b1, pmode);
8077 return rc;
8078}
8079#endif
8080
8081/*
8082** UTF8 mkdir() function for Windows
8083*/
8084#if defined(_WIN32) || defined(WIN32)
8085static int fileio_mkdir(const char *zPath){
8086 sqlite3_int64 sz = strlen(zPath);
8087 wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
8088 int rc;
8089 if( b1==0 ) return -1;
8090 sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
8091 b1[sz] = 0;
8092 rc = _wmkdir(b1);
8094 return rc;
8095}
8096#endif
8097
8098
8099/*
8100** Set the result stored by context ctx to a blob containing the
8101** contents of file zName. Or, leave the result unchanged (NULL)
8102** if the file does not exist or is unreadable.
8103**
8104** If the file exceeds the SQLite blob size limit, through an
8105** SQLITE_TOOBIG error.
8106**
8107** Throw an SQLITE_IOERR if there are difficulties pulling the file
8108** off of disk.
8109*/
8110static void readFileContents(sqlite3_context *ctx, const char *zName){
8111 FILE *in;
8112 sqlite3_int64 nIn;
8113 void *pBuf;
8114 sqlite3 *db;
8115 int mxBlob;
8116
8117 in = sqlite3_fopen(zName, "rb");
8118 if( in==0 ){
8119 /* File does not exist or is unreadable. Leave the result set to NULL. */
8120 return;
8121 }
8122 fseek(in, 0, SEEK_END);
8123 nIn = ftell(in);
8124 rewind(in);
8127 if( nIn>mxBlob ){
8129 fclose(in);
8130 return;
8131 }
8132 pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
8133 if( pBuf==0 ){
8135 fclose(in);
8136 return;
8137 }
8138 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
8140 }else{
8142 sqlite3_free(pBuf);
8143 }
8144 fclose(in);
8145}
8146
8147/*
8148** Implementation of the "readfile(X)" SQL function. The entire content
8149** of the file named X is read and returned as a BLOB. NULL is returned
8150** if the file does not exist or is unreadable.
8151*/
8152static void readfileFunc(
8153 sqlite3_context *context,
8154 int argc,
8155 sqlite3_value **argv
8156){
8157 const char *zName;
8158 (void)(argc); /* Unused parameter */
8159 zName = (const char*)sqlite3_value_text(argv[0]);
8160 if( zName==0 ) return;
8161 readFileContents(context, zName);
8162}
8163
8164/*
8165** Set the error message contained in context ctx to the results of
8166** vprintf(zFmt, ...).
8167*/
8168static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
8169 char *zMsg = 0;
8170 va_list ap;
8171 va_start(ap, zFmt);
8172 zMsg = sqlite3_vmprintf(zFmt, ap);
8173 sqlite3_result_error(ctx, zMsg, -1);
8174 sqlite3_free(zMsg);
8175 va_end(ap);
8176}
8177
8178#if defined(_WIN32)
8179/*
8180** This function is designed to convert a Win32 FILETIME structure into the
8181** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
8182*/
8183static sqlite3_uint64 fileTimeToUnixTime(
8184 LPFILETIME pFileTime
8185){
8186 SYSTEMTIME epochSystemTime;
8187 ULARGE_INTEGER epochIntervals;
8188 FILETIME epochFileTime;
8189 ULARGE_INTEGER fileIntervals;
8190
8191 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
8192 epochSystemTime.wYear = 1970;
8193 epochSystemTime.wMonth = 1;
8194 epochSystemTime.wDay = 1;
8195 SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
8196 epochIntervals.LowPart = epochFileTime.dwLowDateTime;
8197 epochIntervals.HighPart = epochFileTime.dwHighDateTime;
8198
8199 fileIntervals.LowPart = pFileTime->dwLowDateTime;
8200 fileIntervals.HighPart = pFileTime->dwHighDateTime;
8201
8202 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
8203}
8204
8205
8206#if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
8207# /* To allow a standalone DLL, use this next replacement function: */
8208# undef sqlite3_win32_utf8_to_unicode
8209# define sqlite3_win32_utf8_to_unicode utf8_to_utf16
8210#
8211LPWSTR utf8_to_utf16(const char *z){
8212 int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
8213 LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
8214 if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
8215 return rv;
8216 sqlite3_free(rv);
8217 return 0;
8218}
8219#endif
8220
8221/*
8222** This function attempts to normalize the time values found in the stat()
8223** buffer to UTC. This is necessary on Win32, where the runtime library
8224** appears to return these values as local times.
8225*/
8226static void statTimesToUtc(
8227 const char *zPath,
8228 STRUCT_STAT *pStatBuf
8229){
8230 HANDLE hFindFile;
8231 WIN32_FIND_DATAW fd;
8232 LPWSTR zUnicodeName;
8233 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
8234 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
8235 if( zUnicodeName ){
8236 memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
8237 hFindFile = FindFirstFileW(zUnicodeName, &fd);
8238 if( hFindFile!=NULL ){
8239 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
8240 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
8241 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
8242 FindClose(hFindFile);
8243 }
8244 sqlite3_free(zUnicodeName);
8245 }
8246}
8247#endif
8248
8249/*
8250** This function is used in place of stat(). On Windows, special handling
8251** is required in order for the included time to be returned as UTC. On all
8252** other systems, this function simply calls stat().
8253*/
8254static int fileStat(
8255 const char *zPath,
8256 STRUCT_STAT *pStatBuf
8257){
8258#if defined(_WIN32)
8259 sqlite3_int64 sz = strlen(zPath);
8260 wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
8261 int rc;
8262 if( b1==0 ) return 1;
8263 sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
8264 b1[sz] = 0;
8265 rc = _wstat(b1, pStatBuf);
8266 if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
8267 return rc;
8268#else
8269 return stat(zPath, pStatBuf);
8270#endif
8271}
8272
8273/*
8274** This function is used in place of lstat(). On Windows, special handling
8275** is required in order for the included time to be returned as UTC. On all
8276** other systems, this function simply calls lstat().
8277*/
8278static int fileLinkStat(
8279 const char *zPath,
8280 STRUCT_STAT *pStatBuf
8281){
8282#if defined(_WIN32)
8283 return fileStat(zPath, pStatBuf);
8284#else
8285 return lstat(zPath, pStatBuf);
8286#endif
8287}
8288
8289/*
8290** Argument zFile is the name of a file that will be created and/or written
8291** by SQL function writefile(). This function ensures that the directory
8292** zFile will be written to exists, creating it if required. The permissions
8293** for any path components created by this function are set in accordance
8294** with the current umask.
8295**
8296** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
8297** SQLITE_OK is returned if the directory is successfully created, or
8298** SQLITE_ERROR otherwise.
8299*/
8300static int makeDirectory(
8301 const char *zFile
8302){
8303 char *zCopy = sqlite3_mprintf("%s", zFile);
8304 int rc = SQLITE_OK;
8305
8306 if( zCopy==0 ){
8307 rc = SQLITE_NOMEM;
8308 }else{
8309 int nCopy = (int)strlen(zCopy);
8310 int i = 1;
8311
8312 while( rc==SQLITE_OK ){
8313 STRUCT_STAT sStat;
8314 int rc2;
8315
8316 for(; zCopy[i]!='/' && i<nCopy; i++);
8317 if( i==nCopy ) break;
8318 zCopy[i] = '\0';
8319
8320 rc2 = fileStat(zCopy, &sStat);
8321 if( rc2!=0 ){
8322 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
8323 }else{
8324 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
8325 }
8326 zCopy[i] = '/';
8327 i++;
8328 }
8329
8330 sqlite3_free(zCopy);
8331 }
8332
8333 return rc;
8334}
8335
8336/*
8337** This function does the work for the writefile() UDF. Refer to
8338** header comments at the top of this file for details.
8339*/
8340static int writeFile(
8341 sqlite3_context *pCtx, /* Context to return bytes written in */
8342 const char *zFile, /* File to write */
8343 sqlite3_value *pData, /* Data to write */
8344 mode_t mode, /* MODE parameter passed to writefile() */
8345 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */
8346){
8347 if( zFile==0 ) return 1;
8348#if !defined(_WIN32) && !defined(WIN32)
8349 if( S_ISLNK(mode) ){
8350 const char *zTo = (const char*)sqlite3_value_text(pData);
8351 if( zTo==0 ) return 1;
8352 unlink(zFile);
8353 if( symlink(zTo, zFile)<0 ) return 1;
8354 }else
8355#endif
8356 {
8357 if( S_ISDIR(mode) ){
8358 if( mkdir(zFile, mode) ){
8359 /* The mkdir() call to create the directory failed. This might not
8360 ** be an error though - if there is already a directory at the same
8361 ** path and either the permissions already match or can be changed
8362 ** to do so using chmod(), it is not an error. */
8363 STRUCT_STAT sStat;
8364 if( errno!=EEXIST
8365 || 0!=fileStat(zFile, &sStat)
8366 || !S_ISDIR(sStat.st_mode)
8367 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
8368 ){
8369 return 1;
8370 }
8371 }
8372 }else{
8373 sqlite3_int64 nWrite = 0;
8374 const char *z;
8375 int rc = 0;
8376 FILE *out = sqlite3_fopen(zFile, "wb");
8377 if( out==0 ) return 1;
8378 z = (const char*)sqlite3_value_blob(pData);
8379 if( z ){
8380 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
8381 nWrite = sqlite3_value_bytes(pData);
8382 if( nWrite!=n ){
8383 rc = 1;
8384 }
8385 }
8386 fclose(out);
8387 if( rc==0 && mode && chmod(zFile, mode & 0777) ){
8388 rc = 1;
8389 }
8390 if( rc ) return 2;
8391 sqlite3_result_int64(pCtx, nWrite);
8392 }
8393 }
8394
8395 if( mtime>=0 ){
8396#if defined(_WIN32)
8397#if !SQLITE_OS_WINRT
8398 /* Windows */
8399 FILETIME lastAccess;
8400 FILETIME lastWrite;
8401 SYSTEMTIME currentTime;
8402 LONGLONG intervals;
8403 HANDLE hFile;
8404 LPWSTR zUnicodeName;
8405 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
8406
8407 GetSystemTime(&currentTime);
8408 SystemTimeToFileTime(&currentTime, &lastAccess);
8409 intervals = (mtime*10000000) + 116444736000000000;
8410 lastWrite.dwLowDateTime = (DWORD)intervals;
8411 lastWrite.dwHighDateTime = intervals >> 32;
8412 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
8413 if( zUnicodeName==0 ){
8414 return 1;
8415 }
8416 hFile = CreateFileW(
8417 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
8418 FILE_FLAG_BACKUP_SEMANTICS, NULL
8419 );
8420 sqlite3_free(zUnicodeName);
8421 if( hFile!=INVALID_HANDLE_VALUE ){
8422 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
8423 CloseHandle(hFile);
8424 return !bResult;
8425 }else{
8426 return 1;
8427 }
8428#endif
8429#elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
8430 /* Recent unix */
8431 struct timespec times[2];
8432 times[0].tv_nsec = times[1].tv_nsec = 0;
8433 times[0].tv_sec = time(0);
8434 times[1].tv_sec = mtime;
8435 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
8436 return 1;
8437 }
8438#else
8439 /* Legacy unix.
8440 **
8441 ** Do not use utimes() on a symbolic link - it sees through the link and
8442 ** modifies the timestamps on the target. Or fails if the target does
8443 ** not exist. */
8444 if( 0==S_ISLNK(mode) ){
8445 struct timeval times[2];
8446 times[0].tv_usec = times[1].tv_usec = 0;
8447 times[0].tv_sec = time(0);
8448 times[1].tv_sec = mtime;
8449 if( utimes(zFile, times) ){
8450 return 1;
8451 }
8452 }
8453#endif
8454 }
8455
8456 return 0;
8457}
8458
8459/*
8460** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
8461** Refer to header comments at the top of this file for details.
8462*/
8463static void writefileFunc(
8464 sqlite3_context *context,
8465 int argc,
8466 sqlite3_value **argv
8467){
8468 const char *zFile;
8469 mode_t mode = 0;
8470 int res;
8471 sqlite3_int64 mtime = -1;
8472
8473 if( argc<2 || argc>4 ){
8475 "wrong number of arguments to function writefile()", -1
8476 );
8477 return;
8478 }
8479
8480 zFile = (const char*)sqlite3_value_text(argv[0]);
8481 if( zFile==0 ) return;
8482 if( argc>=3 ){
8483 mode = (mode_t)sqlite3_value_int(argv[2]);
8484 }
8485 if( argc==4 ){
8486 mtime = sqlite3_value_int64(argv[3]);
8487 }
8488
8489 res = writeFile(context, zFile, argv[1], mode, mtime);
8490 if( res==1 && errno==ENOENT ){
8491 if( makeDirectory(zFile)==SQLITE_OK ){
8492 res = writeFile(context, zFile, argv[1], mode, mtime);
8493 }
8494 }
8495
8496 if( argc>2 && res!=0 ){
8497 if( S_ISLNK(mode) ){
8498 ctxErrorMsg(context, "failed to create symlink: %s", zFile);
8499 }else if( S_ISDIR(mode) ){
8500 ctxErrorMsg(context, "failed to create directory: %s", zFile);
8501 }else{
8502 ctxErrorMsg(context, "failed to write file: %s", zFile);
8503 }
8504 }
8505}
8506
8507/*
8508** SQL function: lsmode(MODE)
8509**
8510** Given a numberic st_mode from stat(), convert it into a human-readable
8511** text string in the style of "ls -l".
8512*/
8513static void lsModeFunc(
8514 sqlite3_context *context,
8515 int argc,
8516 sqlite3_value **argv
8517){
8518 int i;
8519 int iMode = sqlite3_value_int(argv[0]);
8520 char z[16];
8521 (void)argc;
8522 if( S_ISLNK(iMode) ){
8523 z[0] = 'l';
8524 }else if( S_ISREG(iMode) ){
8525 z[0] = '-';
8526 }else if( S_ISDIR(iMode) ){
8527 z[0] = 'd';
8528 }else{
8529 z[0] = '?';
8530 }
8531 for(i=0; i<3; i++){
8532 int m = (iMode >> ((2-i)*3));
8533 char *a = &z[1 + i*3];
8534 a[0] = (m & 0x4) ? 'r' : '-';
8535 a[1] = (m & 0x2) ? 'w' : '-';
8536 a[2] = (m & 0x1) ? 'x' : '-';
8537 }
8538 z[10] = '\0';
8540}
8541
8542#ifndef SQLITE_OMIT_VIRTUALTABLE
8543
8544/*
8545** Cursor type for recursively iterating through a directory structure.
8546*/
8547typedef struct fsdir_cursor fsdir_cursor;
8548typedef struct FsdirLevel FsdirLevel;
8549
8551 DIR *pDir; /* From opendir() */
8552 char *zDir; /* Name of directory (nul-terminated) */
8553};
8554
8556 sqlite3_vtab_cursor base; /* Base class - must be first */
8557
8558 int nLvl; /* Number of entries in aLvl[] array */
8559 int iLvl; /* Index of current entry */
8560 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */
8561
8562 const char *zBase;
8564
8565 STRUCT_STAT sStat; /* Current lstat() results */
8566 char *zPath; /* Path to current entry */
8567 sqlite3_int64 iRowid; /* Current rowid */
8568};
8569
8570typedef struct fsdir_tab fsdir_tab;
8572 sqlite3_vtab base; /* Base class - must be first */
8573};
8574
8575/*
8576** Construct a new fsdir virtual table object.
8577*/
8578static int fsdirConnect(
8579 sqlite3 *db,
8580 void *pAux,
8581 int argc, const char *const*argv,
8582 sqlite3_vtab **ppVtab,
8583 char **pzErr
8584){
8585 fsdir_tab *pNew = 0;
8586 int rc;
8587 (void)pAux;
8588 (void)argc;
8589 (void)argv;
8590 (void)pzErr;
8591 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
8592 if( rc==SQLITE_OK ){
8593 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
8594 if( pNew==0 ) return SQLITE_NOMEM;
8595 memset(pNew, 0, sizeof(*pNew));
8597 }
8598 *ppVtab = (sqlite3_vtab*)pNew;
8599 return rc;
8600}
8601
8602/*
8603** This method is the destructor for fsdir vtab objects.
8604*/
8605static int fsdirDisconnect(sqlite3_vtab *pVtab){
8606 sqlite3_free(pVtab);
8607 return SQLITE_OK;
8608}
8609
8610/*
8611** Constructor for a new fsdir_cursor object.
8612*/
8613static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
8614 fsdir_cursor *pCur;
8615 (void)p;
8616 pCur = sqlite3_malloc( sizeof(*pCur) );
8617 if( pCur==0 ) return SQLITE_NOMEM;
8618 memset(pCur, 0, sizeof(*pCur));
8619 pCur->iLvl = -1;
8620 *ppCursor = &pCur->base;
8621 return SQLITE_OK;
8622}
8623
8624/*
8625** Reset a cursor back to the state it was in when first returned
8626** by fsdirOpen().
8627*/
8628static void fsdirResetCursor(fsdir_cursor *pCur){
8629 int i;
8630 for(i=0; i<=pCur->iLvl; i++){
8631 FsdirLevel *pLvl = &pCur->aLvl[i];
8632 if( pLvl->pDir ) closedir(pLvl->pDir);
8634 }
8637 pCur->aLvl = 0;
8638 pCur->zPath = 0;
8639 pCur->zBase = 0;
8640 pCur->nBase = 0;
8641 pCur->nLvl = 0;
8642 pCur->iLvl = -1;
8643 pCur->iRowid = 1;
8644}
8645
8646/*
8647** Destructor for an fsdir_cursor.
8648*/
8649static int fsdirClose(sqlite3_vtab_cursor *cur){
8650 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8651
8653 sqlite3_free(pCur);
8654 return SQLITE_OK;
8655}
8656
8657/*
8658** Set the error message for the virtual table associated with cursor
8659** pCur to the results of vprintf(zFmt, ...).
8660*/
8661static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
8662 va_list ap;
8663 va_start(ap, zFmt);
8665 va_end(ap);
8666}
8667
8668
8669/*
8670** Advance an fsdir_cursor to its next row of output.
8671*/
8672static int fsdirNext(sqlite3_vtab_cursor *cur){
8673 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8674 mode_t m = pCur->sStat.st_mode;
8675
8676 pCur->iRowid++;
8677 if( S_ISDIR(m) ){
8678 /* Descend into this directory */
8679 int iNew = pCur->iLvl + 1;
8680 FsdirLevel *pLvl;
8681 if( iNew>=pCur->nLvl ){
8682 int nNew = iNew+1;
8683 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
8684 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
8685 if( aNew==0 ) return SQLITE_NOMEM;
8686 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
8687 pCur->aLvl = aNew;
8688 pCur->nLvl = nNew;
8689 }
8690 pCur->iLvl = iNew;
8691 pLvl = &pCur->aLvl[iNew];
8692
8693 pLvl->zDir = pCur->zPath;
8694 pCur->zPath = 0;
8695 pLvl->pDir = opendir(pLvl->zDir);
8696 if( pLvl->pDir==0 ){
8697 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
8698 return SQLITE_ERROR;
8699 }
8700 }
8701
8702 while( pCur->iLvl>=0 ){
8703 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
8704 struct dirent *pEntry = readdir(pLvl->pDir);
8705 if( pEntry ){
8706 if( pEntry->d_name[0]=='.' ){
8707 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
8708 if( pEntry->d_name[1]=='\0' ) continue;
8709 }
8711 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
8712 if( pCur->zPath==0 ) return SQLITE_NOMEM;
8713 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
8714 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
8715 return SQLITE_ERROR;
8716 }
8717 return SQLITE_OK;
8718 }
8719 closedir(pLvl->pDir);
8721 pLvl->pDir = 0;
8722 pLvl->zDir = 0;
8723 pCur->iLvl--;
8724 }
8725
8726 /* EOF */
8728 pCur->zPath = 0;
8729 return SQLITE_OK;
8730}
8731
8732/*
8733** Return values of columns for the row at which the series_cursor
8734** is currently pointing.
8735*/
8736static int fsdirColumn(
8737 sqlite3_vtab_cursor *cur, /* The cursor */
8738 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
8739 int i /* Which column to return */
8740){
8741 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8742 switch( i ){
8743 case FSDIR_COLUMN_NAME: {
8745 break;
8746 }
8747
8748 case FSDIR_COLUMN_MODE:
8749 sqlite3_result_int64(ctx, pCur->sStat.st_mode);
8750 break;
8751
8752 case FSDIR_COLUMN_MTIME:
8753 sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
8754 break;
8755
8756 case FSDIR_COLUMN_DATA: {
8757 mode_t m = pCur->sStat.st_mode;
8758 if( S_ISDIR(m) ){
8760#if !defined(_WIN32) && !defined(WIN32)
8761 }else if( S_ISLNK(m) ){
8762 char aStatic[64];
8763 char *aBuf = aStatic;
8764 sqlite3_int64 nBuf = 64;
8765 int n;
8766
8767 while( 1 ){
8768 n = readlink(pCur->zPath, aBuf, nBuf);
8769 if( n<nBuf ) break;
8770 if( aBuf!=aStatic ) sqlite3_free(aBuf);
8771 nBuf = nBuf*2;
8772 aBuf = sqlite3_malloc64(nBuf);
8773 if( aBuf==0 ){
8774 sqlite3_result_error_nomem(ctx);
8775 return SQLITE_NOMEM;
8776 }
8777 }
8778
8779 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
8780 if( aBuf!=aStatic ) sqlite3_free(aBuf);
8781#endif
8782 }else{
8784 }
8785 }
8786 case FSDIR_COLUMN_PATH:
8787 default: {
8788 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
8789 ** always return their values as NULL */
8790 break;
8791 }
8792 }
8793 return SQLITE_OK;
8794}
8795
8796/*
8797** Return the rowid for the current row. In this implementation, the
8798** first row returned is assigned rowid value 1, and each subsequent
8799** row a value 1 more than that of the previous.
8800*/
8801static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
8802 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8803 *pRowid = pCur->iRowid;
8804 return SQLITE_OK;
8805}
8806
8807/*
8808** Return TRUE if the cursor has been moved off of the last
8809** row of output.
8810*/
8811static int fsdirEof(sqlite3_vtab_cursor *cur){
8812 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8813 return (pCur->zPath==0);
8814}
8815
8816/*
8817** xFilter callback.
8818**
8819** idxNum==1 PATH parameter only
8820** idxNum==2 Both PATH and DIR supplied
8821*/
8822static int fsdirFilter(
8823 sqlite3_vtab_cursor *cur,
8824 int idxNum, const char *idxStr,
8825 int argc, sqlite3_value **argv
8826){
8827 const char *zDir = 0;
8828 fsdir_cursor *pCur = (fsdir_cursor*)cur;
8829 (void)idxStr;
8831
8832 if( idxNum==0 ){
8833 fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
8834 return SQLITE_ERROR;
8835 }
8836
8837 assert( argc==idxNum && (argc==1 || argc==2) );
8838 zDir = (const char*)sqlite3_value_text(argv[0]);
8839 if( zDir==0 ){
8840 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
8841 return SQLITE_ERROR;
8842 }
8843 if( argc==2 ){
8844 pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
8845 }
8846 if( pCur->zBase ){
8847 pCur->nBase = (int)strlen(pCur->zBase)+1;
8848 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
8849 }else{
8850 pCur->zPath = sqlite3_mprintf("%s", zDir);
8851 }
8852
8853 if( pCur->zPath==0 ){
8854 return SQLITE_NOMEM;
8855 }
8856 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
8857 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
8858 return SQLITE_ERROR;
8859 }
8860
8861 return SQLITE_OK;
8862}
8863
8864/*
8865** SQLite will invoke this method one or more times while planning a query
8866** that uses the generate_series virtual table. This routine needs to create
8867** a query plan for each invocation and compute an estimated cost for that
8868** plan.
8869**
8870** In this implementation idxNum is used to represent the
8871** query plan. idxStr is unused.
8872**
8873** The query plan is represented by values of idxNum:
8874**
8875** (1) The path value is supplied by argv[0]
8876** (2) Path is in argv[0] and dir is in argv[1]
8877*/
8879 sqlite3_vtab *tab,
8880 sqlite3_index_info *pIdxInfo
8881){
8882 int i; /* Loop over constraints */
8883 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */
8884 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */
8885 int seenPath = 0; /* True if an unusable PATH= constraint is seen */
8886 int seenDir = 0; /* True if an unusable DIR= constraint is seen */
8887 const struct sqlite3_index_constraint *pConstraint;
8888
8889 (void)tab;
8890 pConstraint = pIdxInfo->aConstraint;
8891 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
8892 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
8893 switch( pConstraint->iColumn ){
8894 case FSDIR_COLUMN_PATH: {
8895 if( pConstraint->usable ){
8896 idxPath = i;
8897 seenPath = 0;
8898 }else if( idxPath<0 ){
8899 seenPath = 1;
8900 }
8901 break;
8902 }
8903 case FSDIR_COLUMN_DIR: {
8904 if( pConstraint->usable ){
8905 idxDir = i;
8906 seenDir = 0;
8907 }else if( idxDir<0 ){
8908 seenDir = 1;
8909 }
8910 break;
8911 }
8912 }
8913 }
8914 if( seenPath || seenDir ){
8915 /* If input parameters are unusable, disallow this plan */
8916 return SQLITE_CONSTRAINT;
8917 }
8918
8919 if( idxPath<0 ){
8920 pIdxInfo->idxNum = 0;
8921 /* The pIdxInfo->estimatedCost should have been initialized to a huge
8922 ** number. Leave it unchanged. */
8923 pIdxInfo->estimatedRows = 0x7fffffff;
8924 }else{
8925 pIdxInfo->aConstraintUsage[idxPath].omit = 1;
8926 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
8927 if( idxDir>=0 ){
8928 pIdxInfo->aConstraintUsage[idxDir].omit = 1;
8929 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
8930 pIdxInfo->idxNum = 2;
8931 pIdxInfo->estimatedCost = 10.0;
8932 }else{
8933 pIdxInfo->idxNum = 1;
8934 pIdxInfo->estimatedCost = 100.0;
8935 }
8936 }
8937
8938 return SQLITE_OK;
8939}
8940
8941/*
8942** Register the "fsdir" virtual table.
8943*/
8944static int fsdirRegister(sqlite3 *db){
8945 static sqlite3_module fsdirModule = {
8946 0, /* iVersion */
8947 0, /* xCreate */
8948 fsdirConnect, /* xConnect */
8949 fsdirBestIndex, /* xBestIndex */
8950 fsdirDisconnect, /* xDisconnect */
8951 0, /* xDestroy */
8952 fsdirOpen, /* xOpen - open a cursor */
8953 fsdirClose, /* xClose - close a cursor */
8954 fsdirFilter, /* xFilter - configure scan constraints */
8955 fsdirNext, /* xNext - advance a cursor */
8956 fsdirEof, /* xEof - check for end of scan */
8957 fsdirColumn, /* xColumn - read data */
8958 fsdirRowid, /* xRowid - read data */
8959 0, /* xUpdate */
8960 0, /* xBegin */
8961 0, /* xSync */
8962 0, /* xCommit */
8963 0, /* xRollback */
8964 0, /* xFindMethod */
8965 0, /* xRename */
8966 0, /* xSavepoint */
8967 0, /* xRelease */
8968 0, /* xRollbackTo */
8969 0, /* xShadowName */
8970 0 /* xIntegrity */
8971 };
8972
8973 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
8974 return rc;
8975}
8976#else /* SQLITE_OMIT_VIRTUALTABLE */
8977# define fsdirRegister(x) SQLITE_OK
8978#endif
8979
8980#ifdef _WIN32
8981
8982#endif
8984 sqlite3 *db,
8985 char **pzErrMsg,
8986 const sqlite3_api_routines *pApi
8987){
8988 int rc = SQLITE_OK;
8990 (void)pzErrMsg; /* Unused parameter */
8991 rc = sqlite3_create_function(db, "readfile", 1,
8993 readfileFunc, 0, 0);
8994 if( rc==SQLITE_OK ){
8995 rc = sqlite3_create_function(db, "writefile", -1,
8997 writefileFunc, 0, 0);
8998 }
8999 if( rc==SQLITE_OK ){
9000 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
9001 lsModeFunc, 0, 0);
9002 }
9003 if( rc==SQLITE_OK ){
9004 rc = fsdirRegister(db);
9005 }
9006 return rc;
9007}
9008
9009#if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
9010/* To allow a standalone DLL, make test_windirent.c use the same
9011 * redefined SQLite API calls as the above extension code does.
9012 * Just pull in this .c to accomplish this. As a beneficial side
9013 * effect, this extension becomes a single translation unit. */
9014# include "test_windirent.c"
9015#endif
9016
9017/************************* End ../ext/misc/fileio.c ********************/
9018/************************* Begin ../ext/misc/completion.c ******************/
9019/*
9020** 2017-07-10
9021**
9022** The author disclaims copyright to this source code. In place of
9023** a legal notice, here is a blessing:
9024**
9025** May you do good and not evil.
9026** May you find forgiveness for yourself and forgive others.
9027** May you share freely, never taking more than you give.
9028**
9029*************************************************************************
9030**
9031** This file implements an eponymous virtual table that returns suggested
9032** completions for a partial SQL input.
9033**
9034** Suggested usage:
9035**
9036** SELECT DISTINCT candidate COLLATE nocase
9037** FROM completion($prefix,$wholeline)
9038** ORDER BY 1;
9039**
9040** The two query parameters are optional. $prefix is the text of the
9041** current word being typed and that is to be completed. $wholeline is
9042** the complete input line, used for context.
9043**
9044** The raw completion() table might return the same candidate multiple
9045** times, for example if the same column name is used to two or more
9046** tables. And the candidates are returned in an arbitrary order. Hence,
9047** the DISTINCT and ORDER BY are recommended.
9048**
9049** This virtual table operates at the speed of human typing, and so there
9050** is no attempt to make it fast. Even a slow implementation will be much
9051** faster than any human can type.
9052**
9053*/
9054/* #include "sqlite3ext.h" */
9056#include <assert.h>
9057#include <string.h>
9058#include <ctype.h>
9059
9060#ifndef SQLITE_OMIT_VIRTUALTABLE
9061
9062#ifndef IsAlnum
9063#define IsAlnum(X) isalnum((unsigned char)X)
9064#endif
9065
9066
9067/* completion_vtab is a subclass of sqlite3_vtab which will
9068** serve as the underlying representation of a completion virtual table
9069*/
9070typedef struct completion_vtab completion_vtab;
9072 sqlite3_vtab base; /* Base class - must be first */
9073 sqlite3 *db; /* Database connection for this completion vtab */
9074};
9075
9076/* completion_cursor is a subclass of sqlite3_vtab_cursor which will
9077** serve as the underlying representation of a cursor that scans
9078** over rows of the result
9079*/
9080typedef struct completion_cursor completion_cursor;
9082 sqlite3_vtab_cursor base; /* Base class - must be first */
9083 sqlite3 *db; /* Database connection for this cursor */
9084 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */
9085 char *zPrefix; /* The prefix for the word we want to complete */
9086 char *zLine; /* The whole that we want to complete */
9087 const char *zCurrentRow; /* Current output row */
9088 int szRow; /* Length of the zCurrentRow string */
9089 sqlite3_stmt *pStmt; /* Current statement */
9090 sqlite3_int64 iRowid; /* The rowid */
9091 int ePhase; /* Current phase */
9092 int j; /* inter-phase counter */
9093};
9094
9095/* Values for ePhase:
9096*/
9097#define COMPLETION_FIRST_PHASE 1
9098#define COMPLETION_KEYWORDS 1
9099#define COMPLETION_PRAGMAS 2
9100#define COMPLETION_FUNCTIONS 3
9101#define COMPLETION_COLLATIONS 4
9102#define COMPLETION_INDEXES 5
9103#define COMPLETION_TRIGGERS 6
9104#define COMPLETION_DATABASES 7
9105#define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */
9106#define COMPLETION_COLUMNS 9
9107#define COMPLETION_MODULES 10
9108#define COMPLETION_EOF 11
9109
9110/*
9111** The completionConnect() method is invoked to create a new
9112** completion_vtab that describes the completion virtual table.
9113**
9114** Think of this routine as the constructor for completion_vtab objects.
9115**
9116** All this routine needs to do is:
9117**
9118** (1) Allocate the completion_vtab object and initialize all fields.
9119**
9120** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
9121** result set of queries against completion will look like.
9122*/
9124 sqlite3 *db,
9125 void *pAux,
9126 int argc, const char *const*argv,
9127 sqlite3_vtab **ppVtab,
9128 char **pzErr
9129){
9130 completion_vtab *pNew;
9131 int rc;
9132
9133 (void)(pAux); /* Unused parameter */
9134 (void)(argc); /* Unused parameter */
9135 (void)(argv); /* Unused parameter */
9136 (void)(pzErr); /* Unused parameter */
9137
9138/* Column numbers */
9139#define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */
9140#define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */
9141#define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
9142#define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
9143
9146 "CREATE TABLE x("
9147 " candidate TEXT,"
9148 " prefix TEXT HIDDEN,"
9149 " wholeline TEXT HIDDEN,"
9150 " phase INT HIDDEN" /* Used for debugging only */
9151 ")");
9152 if( rc==SQLITE_OK ){
9153 pNew = sqlite3_malloc( sizeof(*pNew) );
9154 *ppVtab = (sqlite3_vtab*)pNew;
9155 if( pNew==0 ) return SQLITE_NOMEM;
9156 memset(pNew, 0, sizeof(*pNew));
9157 pNew->db = db;
9158 }
9159 return rc;
9160}
9161
9162/*
9163** This method is the destructor for completion_cursor objects.
9164*/
9165static int completionDisconnect(sqlite3_vtab *pVtab){
9166 sqlite3_free(pVtab);
9167 return SQLITE_OK;
9168}
9169
9170/*
9171** Constructor for a new completion_cursor object.
9172*/
9173static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
9174 completion_cursor *pCur;
9175 pCur = sqlite3_malloc( sizeof(*pCur) );
9176 if( pCur==0 ) return SQLITE_NOMEM;
9177 memset(pCur, 0, sizeof(*pCur));
9178 pCur->db = ((completion_vtab*)p)->db;
9179 *ppCursor = &pCur->base;
9180 return SQLITE_OK;
9181}
9182
9183/*
9184** Reset the completion_cursor.
9185*/
9186static void completionCursorReset(completion_cursor *pCur){
9187 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0;
9188 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0;
9190 pCur->j = 0;
9191}
9192
9193/*
9194** Destructor for a completion_cursor.
9195*/
9196static int completionClose(sqlite3_vtab_cursor *cur){
9197 completionCursorReset((completion_cursor*)cur);
9198 sqlite3_free(cur);
9199 return SQLITE_OK;
9200}
9201
9202/*
9203** Advance a completion_cursor to its next row of output.
9204**
9205** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
9206** record the current state of the scan. This routine sets ->zCurrentRow
9207** to the current row of output and then returns. If no more rows remain,
9208** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
9209** table that has reached the end of its scan.
9210**
9211** The current implementation just lists potential identifiers and
9212** keywords and filters them by zPrefix. Future enhancements should
9213** take zLine into account to try to restrict the set of identifiers and
9214** keywords based on what would be legal at the current point of input.
9215*/
9216static int completionNext(sqlite3_vtab_cursor *cur){
9217 completion_cursor *pCur = (completion_cursor*)cur;
9218 int eNextPhase = 0; /* Next phase to try if current phase reaches end */
9219 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */
9220 pCur->iRowid++;
9221 while( pCur->ePhase!=COMPLETION_EOF ){
9222 switch( pCur->ePhase ){
9223 case COMPLETION_KEYWORDS: {
9224 if( pCur->j >= sqlite3_keyword_count() ){
9225 pCur->zCurrentRow = 0;
9227 }else{
9229 }
9230 iCol = -1;
9231 break;
9232 }
9233 case COMPLETION_DATABASES: {
9234 if( pCur->pStmt==0 ){
9235 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
9236 &pCur->pStmt, 0);
9237 }
9238 iCol = 1;
9239 eNextPhase = COMPLETION_TABLES;
9240 break;
9241 }
9242 case COMPLETION_TABLES: {
9243 if( pCur->pStmt==0 ){
9244 sqlite3_stmt *pS2;
9245 char *zSql = 0;
9246 const char *zSep = "";
9247 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
9248 while( sqlite3_step(pS2)==SQLITE_ROW ){
9249 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
9250 zSql = sqlite3_mprintf(
9251 "%z%s"
9252 "SELECT name FROM \"%w\".sqlite_schema",
9253 zSql, zSep, zDb
9254 );
9255 if( zSql==0 ) return SQLITE_NOMEM;
9256 zSep = " UNION ";
9257 }
9259 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
9260 sqlite3_free(zSql);
9261 }
9262 iCol = 0;
9263 eNextPhase = COMPLETION_COLUMNS;
9264 break;
9265 }
9266 case COMPLETION_COLUMNS: {
9267 if( pCur->pStmt==0 ){
9268 sqlite3_stmt *pS2;
9269 char *zSql = 0;
9270 const char *zSep = "";
9271 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
9272 while( sqlite3_step(pS2)==SQLITE_ROW ){
9273 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
9274 zSql = sqlite3_mprintf(
9275 "%z%s"
9276 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
9277 " JOIN pragma_table_xinfo(sm.name,%Q) AS pti"
9278 " WHERE sm.type='table'",
9279 zSql, zSep, zDb, zDb
9280 );
9281 if( zSql==0 ) return SQLITE_NOMEM;
9282 zSep = " UNION ";
9283 }
9285 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
9286 sqlite3_free(zSql);
9287 }
9288 iCol = 0;
9289 eNextPhase = COMPLETION_EOF;
9290 break;
9291 }
9292 }
9293 if( iCol<0 ){
9294 /* This case is when the phase presets zCurrentRow */
9295 if( pCur->zCurrentRow==0 ) continue;
9296 }else{
9298 /* Extract the next row of content */
9299 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
9301 }else{
9302 /* When all rows are finished, advance to the next phase */
9304 pCur->pStmt = 0;
9305 pCur->ePhase = eNextPhase;
9306 continue;
9307 }
9308 }
9309 if( pCur->nPrefix==0 ) break;
9310 if( pCur->nPrefix<=pCur->szRow
9312 ){
9313 break;
9314 }
9315 }
9316
9317 return SQLITE_OK;
9318}
9319
9320/*
9321** Return values of columns for the row at which the completion_cursor
9322** is currently pointing.
9323*/
9325 sqlite3_vtab_cursor *cur, /* The cursor */
9326 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
9327 int i /* Which column to return */
9328){
9329 completion_cursor *pCur = (completion_cursor*)cur;
9330 switch( i ){
9333 break;
9334 }
9337 break;
9338 }
9341 break;
9342 }
9345 break;
9346 }
9347 }
9348 return SQLITE_OK;
9349}
9350
9351/*
9352** Return the rowid for the current row. In this implementation, the
9353** rowid is the same as the output value.
9354*/
9355static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
9356 completion_cursor *pCur = (completion_cursor*)cur;
9357 *pRowid = pCur->iRowid;
9358 return SQLITE_OK;
9359}
9360
9361/*
9362** Return TRUE if the cursor has been moved off of the last
9363** row of output.
9364*/
9365static int completionEof(sqlite3_vtab_cursor *cur){
9366 completion_cursor *pCur = (completion_cursor*)cur;
9367 return pCur->ePhase >= COMPLETION_EOF;
9368}
9369
9370/*
9371** This method is called to "rewind" the completion_cursor object back
9372** to the first row of output. This method is always called at least
9373** once prior to any call to completionColumn() or completionRowid() or
9374** completionEof().
9375*/
9377 sqlite3_vtab_cursor *pVtabCursor,
9378 int idxNum, const char *idxStr,
9379 int argc, sqlite3_value **argv
9380){
9381 completion_cursor *pCur = (completion_cursor *)pVtabCursor;
9382 int iArg = 0;
9383 (void)(idxStr); /* Unused parameter */
9384 (void)(argc); /* Unused parameter */
9386 if( idxNum & 1 ){
9387 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
9388 if( pCur->nPrefix>0 ){
9390 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
9391 }
9392 iArg = 1;
9393 }
9394 if( idxNum & 2 ){
9395 pCur->nLine = sqlite3_value_bytes(argv[iArg]);
9396 if( pCur->nLine>0 ){
9398 if( pCur->zLine==0 ) return SQLITE_NOMEM;
9399 }
9400 }
9401 if( pCur->zLine!=0 && pCur->zPrefix==0 ){
9402 int i = pCur->nLine;
9403 while( i>0 && (IsAlnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
9404 i--;
9405 }
9406 pCur->nPrefix = pCur->nLine - i;
9407 if( pCur->nPrefix>0 ){
9408 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
9409 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
9410 }
9411 }
9412 pCur->iRowid = 0;
9414 return completionNext(pVtabCursor);
9415}
9416
9417/*
9418** SQLite will invoke this method one or more times while planning a query
9419** that uses the completion virtual table. This routine needs to create
9420** a query plan for each invocation and compute an estimated cost for that
9421** plan.
9422**
9423** There are two hidden parameters that act as arguments to the table-valued
9424** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix"
9425** is available and bit 1 is set if "wholeline" is available.
9426*/
9428 sqlite3_vtab *tab,
9429 sqlite3_index_info *pIdxInfo
9430){
9431 int i; /* Loop over constraints */
9432 int idxNum = 0; /* The query plan bitmask */
9433 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */
9434 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
9435 int nArg = 0; /* Number of arguments that completeFilter() expects */
9436 const struct sqlite3_index_constraint *pConstraint;
9437
9438 (void)(tab); /* Unused parameter */
9439 pConstraint = pIdxInfo->aConstraint;
9440 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
9441 if( pConstraint->usable==0 ) continue;
9442 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
9443 switch( pConstraint->iColumn ){
9445 prefixIdx = i;
9446 idxNum |= 1;
9447 break;
9449 wholelineIdx = i;
9450 idxNum |= 2;
9451 break;
9452 }
9453 }
9454 if( prefixIdx>=0 ){
9455 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
9456 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
9457 }
9458 if( wholelineIdx>=0 ){
9459 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
9460 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
9461 }
9462 pIdxInfo->idxNum = idxNum;
9463 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
9464 pIdxInfo->estimatedRows = 500 - 100*nArg;
9465 return SQLITE_OK;
9466}
9467
9468/*
9469** This following structure defines all the methods for the
9470** completion virtual table.
9471*/
9472static sqlite3_module completionModule = {
9473 0, /* iVersion */
9474 0, /* xCreate */
9475 completionConnect, /* xConnect */
9476 completionBestIndex, /* xBestIndex */
9477 completionDisconnect, /* xDisconnect */
9478 0, /* xDestroy */
9479 completionOpen, /* xOpen - open a cursor */
9480 completionClose, /* xClose - close a cursor */
9481 completionFilter, /* xFilter - configure scan constraints */
9482 completionNext, /* xNext - advance a cursor */
9483 completionEof, /* xEof - check for end of scan */
9484 completionColumn, /* xColumn - read data */
9485 completionRowid, /* xRowid - read data */
9486 0, /* xUpdate */
9487 0, /* xBegin */
9488 0, /* xSync */
9489 0, /* xCommit */
9490 0, /* xRollback */
9491 0, /* xFindMethod */
9492 0, /* xRename */
9493 0, /* xSavepoint */
9494 0, /* xRelease */
9495 0, /* xRollbackTo */
9496 0, /* xShadowName */
9497 0 /* xIntegrity */
9498};
9499
9500#endif /* SQLITE_OMIT_VIRTUALTABLE */
9501
9503 int rc = SQLITE_OK;
9504#ifndef SQLITE_OMIT_VIRTUALTABLE
9505 rc = sqlite3_create_module(db, "completion", &completionModule, 0);
9506#endif
9507 return rc;
9508}
9509
9510#ifdef _WIN32
9511
9512#endif
9514 sqlite3 *db,
9515 char **pzErrMsg,
9516 const sqlite3_api_routines *pApi
9517){
9518 int rc = SQLITE_OK;
9520 (void)(pzErrMsg); /* Unused parameter */
9521#ifndef SQLITE_OMIT_VIRTUALTABLE
9523#endif
9524 return rc;
9525}
9526
9527/************************* End ../ext/misc/completion.c ********************/
9528/************************* Begin ../ext/misc/appendvfs.c ******************/
9529/*
9530** 2017-10-20
9531**
9532** The author disclaims copyright to this source code. In place of
9533** a legal notice, here is a blessing:
9534**
9535** May you do good and not evil.
9536** May you find forgiveness for yourself and forgive others.
9537** May you share freely, never taking more than you give.
9538**
9539******************************************************************************
9540**
9541** This file implements a VFS shim that allows an SQLite database to be
9542** appended onto the end of some other file, such as an executable.
9543**
9544** A special record must appear at the end of the file that identifies the
9545** file as an appended database and provides the offset to the first page
9546** of the exposed content. (Or, it is the length of the content prefix.)
9547** For best performance page 1 should be located at a disk page boundary,
9548** though that is not required.
9549**
9550** When opening a database using this VFS, the connection might treat
9551** the file as an ordinary SQLite database, or it might treat it as a
9552** database appended onto some other file. The decision is made by
9553** applying the following rules in order:
9554**
9555** (1) An empty file is an ordinary database.
9556**
9557** (2) If the file ends with the appendvfs trailer string
9558** "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
9559**
9560** (3) If the file begins with the standard SQLite prefix string
9561** "SQLite format 3", that file is an ordinary database.
9562**
9563** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is
9564** set, then a new database is appended to the already existing file.
9565**
9566** (5) Otherwise, SQLITE_CANTOPEN is returned.
9567**
9568** To avoid unnecessary complications with the PENDING_BYTE, the size of
9569** the file containing the database is limited to 1GiB. (1073741824 bytes)
9570** This VFS will not read or write past the 1GiB mark. This restriction
9571** might be lifted in future versions. For now, if you need a larger
9572** database, then keep it in a separate file.
9573**
9574** If the file being opened is a plain database (not an appended one), then
9575** this shim is a pass-through into the default underlying VFS. (rule 3)
9576**/
9577/* #include "sqlite3ext.h" */
9579#include <string.h>
9580#include <assert.h>
9581
9582/* The append mark at the end of the database is:
9583**
9584** Start-Of-SQLite3-NNNNNNNN
9585** 123456789 123456789 12345
9586**
9587** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
9588** the offset to page 1, and also the length of the prefix content.
9589*/
9590#define APND_MARK_PREFIX "Start-Of-SQLite3-"
9591#define APND_MARK_PREFIX_SZ 17
9592#define APND_MARK_FOS_SZ 8
9594
9595/*
9596** Maximum size of the combined prefix + database + append-mark. This
9597** must be less than 0x40000000 to avoid locking issues on Windows.
9598*/
9599#define APND_MAX_SIZE (0x40000000)
9600
9601/*
9602** Try to align the database to an even multiple of APND_ROUNDUP bytes.
9603*/
9604#ifndef APND_ROUNDUP
9605#define APND_ROUNDUP 4096
9606#endif
9607#define APND_ALIGN_MASK ((sqlite3_int64)(APND_ROUNDUP-1))
9608#define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
9609
9610/*
9611** Forward declaration of objects used by this utility
9612*/
9613typedef struct sqlite3_vfs ApndVfs;
9614typedef struct ApndFile ApndFile;
9615
9616/* Access to a lower-level VFS that (might) implement dynamic loading,
9617** access to randomness, etc.
9618*/
9619#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData))
9620#define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
9621
9622/* An open appendvfs file
9623**
9624** An instance of this structure describes the appended database file.
9625** A separate sqlite3_file object is always appended. The appended
9626** sqlite3_file object (which can be accessed using ORIGFILE()) describes
9627** the entire file, including the prefix, the database, and the
9628** append-mark.
9629**
9630** The structure of an AppendVFS database is like this:
9631**
9632** +-------------+---------+----------+-------------+
9633** | prefix-file | padding | database | append-mark |
9634** +-------------+---------+----------+-------------+
9635** ^ ^
9636** | |
9637** iPgOne iMark
9638**
9639**
9640** "prefix file" - file onto which the database has been appended.
9641** "padding" - zero or more bytes inserted so that "database"
9642** starts on an APND_ROUNDUP boundary
9643** "database" - The SQLite database file
9644** "append-mark" - The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
9645** the offset from the start of prefix-file to the start
9646** of "database".
9647**
9648** The size of the database is iMark - iPgOne.
9649**
9650** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
9651** of iPgOne stored as a big-ending 64-bit integer.
9652**
9653** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
9654** Or, iMark is -1 to indicate that it has not yet been written.
9655*/
9656struct ApndFile {
9657 sqlite3_file base; /* Subclass. MUST BE FIRST! */
9658 sqlite3_int64 iPgOne; /* Offset to the start of the database */
9659 sqlite3_int64 iMark; /* Offset of the append mark. -1 if unwritten */
9660 /* Always followed by another sqlite3_file that describes the whole file */
9661};
9662
9663/*
9664** Methods for ApndFile
9665*/
9666static int apndClose(sqlite3_file*);
9667static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
9668static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
9669static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
9670static int apndSync(sqlite3_file*, int flags);
9671static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
9672static int apndLock(sqlite3_file*, int);
9673static int apndUnlock(sqlite3_file*, int);
9674static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
9675static int apndFileControl(sqlite3_file*, int op, void *pArg);
9676static int apndSectorSize(sqlite3_file*);
9677static int apndDeviceCharacteristics(sqlite3_file*);
9678static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
9679static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
9680static void apndShmBarrier(sqlite3_file*);
9681static int apndShmUnmap(sqlite3_file*, int deleteFlag);
9682static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
9683static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
9684
9685/*
9686** Methods for ApndVfs
9687*/
9688static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
9689static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
9690static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
9691static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
9692static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
9693static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
9694static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
9695static void apndDlClose(sqlite3_vfs*, void*);
9696static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
9697static int apndSleep(sqlite3_vfs*, int microseconds);
9698static int apndCurrentTime(sqlite3_vfs*, double*);
9699static int apndGetLastError(sqlite3_vfs*, int, char *);
9700static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
9701static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
9702static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
9703static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
9704
9705static sqlite3_vfs apnd_vfs = {
9706 3, /* iVersion (set when registered) */
9707 0, /* szOsFile (set when registered) */
9708 1024, /* mxPathname */
9709 0, /* pNext */
9710 "apndvfs", /* zName */
9711 0, /* pAppData (set when registered) */
9712 apndOpen, /* xOpen */
9713 apndDelete, /* xDelete */
9714 apndAccess, /* xAccess */
9715 apndFullPathname, /* xFullPathname */
9716 apndDlOpen, /* xDlOpen */
9717 apndDlError, /* xDlError */
9718 apndDlSym, /* xDlSym */
9719 apndDlClose, /* xDlClose */
9720 apndRandomness, /* xRandomness */
9721 apndSleep, /* xSleep */
9722 apndCurrentTime, /* xCurrentTime */
9723 apndGetLastError, /* xGetLastError */
9724 apndCurrentTimeInt64, /* xCurrentTimeInt64 */
9725 apndSetSystemCall, /* xSetSystemCall */
9726 apndGetSystemCall, /* xGetSystemCall */
9727 apndNextSystemCall /* xNextSystemCall */
9728};
9729
9730static const sqlite3_io_methods apnd_io_methods = {
9731 3, /* iVersion */
9732 apndClose, /* xClose */
9733 apndRead, /* xRead */
9734 apndWrite, /* xWrite */
9735 apndTruncate, /* xTruncate */
9736 apndSync, /* xSync */
9737 apndFileSize, /* xFileSize */
9738 apndLock, /* xLock */
9739 apndUnlock, /* xUnlock */
9740 apndCheckReservedLock, /* xCheckReservedLock */
9741 apndFileControl, /* xFileControl */
9742 apndSectorSize, /* xSectorSize */
9743 apndDeviceCharacteristics, /* xDeviceCharacteristics */
9744 apndShmMap, /* xShmMap */
9745 apndShmLock, /* xShmLock */
9746 apndShmBarrier, /* xShmBarrier */
9747 apndShmUnmap, /* xShmUnmap */
9748 apndFetch, /* xFetch */
9749 apndUnfetch /* xUnfetch */
9750};
9751
9752/*
9753** Close an apnd-file.
9754*/
9755static int apndClose(sqlite3_file *pFile){
9756 pFile = ORIGFILE(pFile);
9757 return pFile->pMethods->xClose(pFile);
9758}
9759
9760/*
9761** Read data from an apnd-file.
9762*/
9763static int apndRead(
9764 sqlite3_file *pFile,
9765 void *zBuf,
9766 int iAmt,
9767 sqlite_int64 iOfst
9768){
9769 ApndFile *paf = (ApndFile *)pFile;
9770 pFile = ORIGFILE(pFile);
9771 return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
9772}
9773
9774/*
9775** Add the append-mark onto what should become the end of the file.
9776* If and only if this succeeds, internal ApndFile.iMark is updated.
9777* Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
9778*/
9779static int apndWriteMark(
9780 ApndFile *paf,
9781 sqlite3_file *pFile,
9782 sqlite_int64 iWriteEnd
9783){
9784 sqlite_int64 iPgOne = paf->iPgOne;
9785 unsigned char a[APND_MARK_SIZE];
9786 int i = APND_MARK_FOS_SZ;
9787 int rc;
9788 assert(pFile == ORIGFILE(paf));
9790 while( --i >= 0 ){
9791 a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
9792 iPgOne >>= 8;
9793 }
9794 iWriteEnd += paf->iPgOne;
9795 if( SQLITE_OK==(rc = pFile->pMethods->xWrite
9796 (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
9797 paf->iMark = iWriteEnd;
9798 }
9799 return rc;
9800}
9801
9802/*
9803** Write data to an apnd-file.
9804*/
9805static int apndWrite(
9806 sqlite3_file *pFile,
9807 const void *zBuf,
9808 int iAmt,
9809 sqlite_int64 iOfst
9810){
9811 ApndFile *paf = (ApndFile *)pFile;
9812 sqlite_int64 iWriteEnd = iOfst + iAmt;
9813 if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
9814 pFile = ORIGFILE(pFile);
9815 /* If append-mark is absent or will be overwritten, write it. */
9816 if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
9817 int rc = apndWriteMark(paf, pFile, iWriteEnd);
9818 if( SQLITE_OK!=rc ) return rc;
9819 }
9820 return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
9821}
9822
9823/*
9824** Truncate an apnd-file.
9825*/
9826static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
9827 ApndFile *paf = (ApndFile *)pFile;
9828 pFile = ORIGFILE(pFile);
9829 /* The append mark goes out first so truncate failure does not lose it. */
9830 if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
9831 /* Truncate underlying file just past append mark */
9833}
9834
9835/*
9836** Sync an apnd-file.
9837*/
9838static int apndSync(sqlite3_file *pFile, int flags){
9839 pFile = ORIGFILE(pFile);
9840 return pFile->pMethods->xSync(pFile, flags);
9841}
9842
9843/*
9844** Return the current file-size of an apnd-file.
9845** If the append mark is not yet there, the file-size is 0.
9846*/
9847static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
9848 ApndFile *paf = (ApndFile *)pFile;
9849 *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
9850 return SQLITE_OK;
9851}
9852
9853/*
9854** Lock an apnd-file.
9855*/
9856static int apndLock(sqlite3_file *pFile, int eLock){
9857 pFile = ORIGFILE(pFile);
9858 return pFile->pMethods->xLock(pFile, eLock);
9859}
9860
9861/*
9862** Unlock an apnd-file.
9863*/
9864static int apndUnlock(sqlite3_file *pFile, int eLock){
9865 pFile = ORIGFILE(pFile);
9866 return pFile->pMethods->xUnlock(pFile, eLock);
9867}
9868
9869/*
9870** Check if another file-handle holds a RESERVED lock on an apnd-file.
9871*/
9872static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
9873 pFile = ORIGFILE(pFile);
9874 return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
9875}
9876
9877/*
9878** File control method. For custom operations on an apnd-file.
9879*/
9880static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
9881 ApndFile *paf = (ApndFile *)pFile;
9882 int rc;
9883 pFile = ORIGFILE(pFile);
9884 if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
9885 rc = pFile->pMethods->xFileControl(pFile, op, pArg);
9886 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
9887 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
9888 }
9889 return rc;
9890}
9891
9892/*
9893** Return the sector-size in bytes for an apnd-file.
9894*/
9895static int apndSectorSize(sqlite3_file *pFile){
9896 pFile = ORIGFILE(pFile);
9897 return pFile->pMethods->xSectorSize(pFile);
9898}
9899
9900/*
9901** Return the device characteristic flags supported by an apnd-file.
9902*/
9903static int apndDeviceCharacteristics(sqlite3_file *pFile){
9904 pFile = ORIGFILE(pFile);
9905 return pFile->pMethods->xDeviceCharacteristics(pFile);
9906}
9907
9908/* Create a shared memory file mapping */
9909static int apndShmMap(
9910 sqlite3_file *pFile,
9911 int iPg,
9912 int pgsz,
9913 int bExtend,
9914 void volatile **pp
9915){
9916 pFile = ORIGFILE(pFile);
9917 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
9918}
9919
9920/* Perform locking on a shared-memory segment */
9921static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
9922 pFile = ORIGFILE(pFile);
9923 return pFile->pMethods->xShmLock(pFile,offset,n,flags);
9924}
9925
9926/* Memory barrier operation on shared memory */
9927static void apndShmBarrier(sqlite3_file *pFile){
9928 pFile = ORIGFILE(pFile);
9929 pFile->pMethods->xShmBarrier(pFile);
9930}
9931
9932/* Unmap a shared memory segment */
9933static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
9934 pFile = ORIGFILE(pFile);
9935 return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
9936}
9937
9938/* Fetch a page of a memory-mapped file */
9939static int apndFetch(
9940 sqlite3_file *pFile,
9941 sqlite3_int64 iOfst,
9942 int iAmt,
9943 void **pp
9944){
9945 ApndFile *p = (ApndFile *)pFile;
9946 if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
9947 return SQLITE_IOERR; /* Cannot read what is not yet there. */
9948 }
9949 pFile = ORIGFILE(pFile);
9950 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
9951}
9952
9953/* Release a memory-mapped page */
9954static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
9955 ApndFile *p = (ApndFile *)pFile;
9956 pFile = ORIGFILE(pFile);
9957 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
9958}
9959
9960/*
9961** Try to read the append-mark off the end of a file. Return the
9962** start of the appended database if the append-mark is present.
9963** If there is no valid append-mark, return -1;
9964**
9965** An append-mark is only valid if the NNNNNNNN start-of-database offset
9966** indicates that the appended database contains at least one page. The
9967** start-of-database value must be a multiple of 512.
9968*/
9969static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
9970 int rc, i;
9971 sqlite3_int64 iMark;
9972 int msbs = 8 * (APND_MARK_FOS_SZ-1);
9973 unsigned char a[APND_MARK_SIZE];
9974
9975 if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
9977 if( rc ) return -1;
9978 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
9979 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
9980 for(i=1; i<8; i++){
9981 msbs -= 8;
9982 iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
9983 }
9984 if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
9985 if( iMark & 0x1ff ) return -1;
9986 return iMark;
9987}
9988
9989static const char apvfsSqliteHdr[] = "SQLite format 3";
9990/*
9991** Check to see if the file is an appendvfs SQLite database file.
9992** Return true iff it is such. Parameter sz is the file's size.
9993*/
9994static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
9995 int rc;
9996 char zHdr[16];
9997 sqlite3_int64 iMark = apndReadMark(sz, pFile);
9998 if( iMark>=0 ){
9999 /* If file has the correct end-marker, the expected odd size, and the
10000 ** SQLite DB type marker where the end-marker puts it, then it
10001 ** is an appendvfs database.
10002 */
10003 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
10004 if( SQLITE_OK==rc
10005 && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
10006 && (sz & 0x1ff) == APND_MARK_SIZE
10007 && sz>=512+APND_MARK_SIZE
10008 ){
10009 return 1; /* It's an appendvfs database */
10010 }
10011 }
10012 return 0;
10013}
10014
10015/*
10016** Check to see if the file is an ordinary SQLite database file.
10017** Return true iff so. Parameter sz is the file's size.
10018*/
10019static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
10020 char zHdr[16];
10021 if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
10022 || (sz & 0x1ff) != 0
10023 || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
10024 || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
10025 ){
10026 return 0;
10027 }else{
10028 return 1;
10029 }
10030}
10031
10032/*
10033** Open an apnd file handle.
10034*/
10035static int apndOpen(
10036 sqlite3_vfs *pApndVfs,
10037 const char *zName,
10038 sqlite3_file *pFile,
10039 int flags,
10040 int *pOutFlags
10041){
10042 ApndFile *pApndFile = (ApndFile*)pFile;
10043 sqlite3_file *pBaseFile = ORIGFILE(pFile);
10044 sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
10045 int rc;
10046 sqlite3_int64 sz = 0;
10047 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
10048 /* The appendvfs is not to be used for transient or temporary databases.
10049 ** Just use the base VFS open to initialize the given file object and
10050 ** open the underlying file. (Appendvfs is then unused for this file.)
10051 */
10052 return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
10053 }
10054 memset(pApndFile, 0, sizeof(ApndFile));
10056 pApndFile->iMark = -1; /* Append mark not yet written */
10057
10058 rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
10059 if( rc==SQLITE_OK ){
10060 rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
10061 if( rc ){
10062 pBaseFile->pMethods->xClose(pBaseFile);
10063 }
10064 }
10065 if( rc ){
10066 pFile->pMethods = 0;
10067 return rc;
10068 }
10069 if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
10070 /* The file being opened appears to be just an ordinary DB. Copy
10071 ** the base dispatch-table so this instance mimics the base VFS.
10072 */
10073 memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
10074 return SQLITE_OK;
10075 }
10076 pApndFile->iPgOne = apndReadMark(sz, pFile);
10077 if( pApndFile->iPgOne>=0 ){
10078 pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
10079 return SQLITE_OK;
10080 }
10081 if( (flags & SQLITE_OPEN_CREATE)==0 ){
10082 pBaseFile->pMethods->xClose(pBaseFile);
10083 rc = SQLITE_CANTOPEN;
10084 pFile->pMethods = 0;
10085 }else{
10086 /* Round newly added appendvfs location to #define'd page boundary.
10087 ** Note that nothing has yet been written to the underlying file.
10088 ** The append mark will be written along with first content write.
10089 ** Until then, paf->iMark value indicates it is not yet written.
10090 */
10091 pApndFile->iPgOne = APND_START_ROUNDUP(sz);
10092 }
10093 return rc;
10094}
10095
10096/*
10097** Delete an apnd file.
10098** For an appendvfs, this could mean delete the appendvfs portion,
10099** leaving the appendee as it was before it gained an appendvfs.
10100** For now, this code deletes the underlying file too.
10101*/
10102static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
10103 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
10104}
10105
10106/*
10107** All other VFS methods are pass-thrus.
10108*/
10109static int apndAccess(
10110 sqlite3_vfs *pVfs,
10111 const char *zPath,
10112 int flags,
10113 int *pResOut
10114){
10115 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
10116}
10118 sqlite3_vfs *pVfs,
10119 const char *zPath,
10120 int nOut,
10121 char *zOut
10122){
10123 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
10124}
10125static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
10126 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
10127}
10128static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
10129 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
10130}
10131static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
10132 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
10133}
10134static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
10135 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
10136}
10137static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
10138 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
10139}
10140static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
10141 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
10142}
10143static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
10144 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
10145}
10146static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
10147 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
10148}
10149static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
10150 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
10151}
10153 sqlite3_vfs *pVfs,
10154 const char *zName,
10156){
10157 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
10158}
10160 sqlite3_vfs *pVfs,
10161 const char *zName
10162){
10163 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
10164}
10165static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
10166 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
10167}
10168
10169
10170#ifdef _WIN32
10171
10172#endif
10173/*
10174** This routine is called when the extension is loaded.
10175** Register the new VFS.
10176*/
10178 sqlite3 *db,
10179 char **pzErrMsg,
10180 const sqlite3_api_routines *pApi
10181){
10182 int rc = SQLITE_OK;
10183 sqlite3_vfs *pOrig;
10185 (void)pzErrMsg;
10186 (void)db;
10187 pOrig = sqlite3_vfs_find(0);
10188 if( pOrig==0 ) return SQLITE_ERROR;
10190 apnd_vfs.pAppData = pOrig;
10191 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
10193#ifdef APPENDVFS_TEST
10194 if( rc==SQLITE_OK ){
10195 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
10196 }
10197#endif
10199 return rc;
10200}
10201
10202/************************* End ../ext/misc/appendvfs.c ********************/
10203#endif
10204#ifdef SQLITE_HAVE_ZLIB
10205/************************* Begin ../ext/misc/zipfile.c ******************/
10206/*
10207** 2017-12-26
10208**
10209** The author disclaims copyright to this source code. In place of
10210** a legal notice, here is a blessing:
10211**
10212** May you do good and not evil.
10213** May you find forgiveness for yourself and forgive others.
10214** May you share freely, never taking more than you give.
10215**
10216******************************************************************************
10217**
10218** This file implements a virtual table for reading and writing ZIP archive
10219** files.
10220**
10221** Usage example:
10222**
10223** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
10224**
10225** Current limitations:
10226**
10227** * No support for encryption
10228** * No support for ZIP archives spanning multiple files
10229** * No support for zip64 extensions
10230** * Only the "inflate/deflate" (zlib) compression method is supported
10231*/
10232/* #include "sqlite3ext.h" */
10233SQLITE_EXTENSION_INIT1
10234#include <stdio.h>
10235#include <string.h>
10236#include <assert.h>
10237#ifndef SQLITE_NO_STDINT
10238# include <stdint.h>
10239#endif
10240
10241#include <zlib.h>
10242
10243/* When used as part of the CLI, the sqlite3_stdio.h module will have
10244** been included before this one. In that case use the sqlite3_stdio.h
10245** #defines. If not, create our own for fopen().
10246*/
10247#ifndef _SQLITE3_STDIO_H_
10248# define sqlite3_fopen fopen
10249#endif
10250
10251#ifndef SQLITE_OMIT_VIRTUALTABLE
10252
10253#ifndef SQLITE_AMALGAMATION
10254
10255#ifndef UINT32_TYPE
10256# ifdef HAVE_UINT32_T
10257# define UINT32_TYPE uint32_t
10258# else
10259# define UINT32_TYPE unsigned int
10260# endif
10261#endif
10262#ifndef UINT16_TYPE
10263# ifdef HAVE_UINT16_T
10264# define UINT16_TYPE uint16_t
10265# else
10266# define UINT16_TYPE unsigned short int
10267# endif
10268#endif
10269/* typedef sqlite3_int64 i64; */
10270/* typedef unsigned char u8; */
10271/* typedef UINT32_TYPE u32; // 4-byte unsigned integer // */
10272/* typedef UINT16_TYPE u16; // 2-byte unsigned integer // */
10273#define MIN(a,b) ((a)<(b) ? (a) : (b))
10274
10275#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
10276# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
10277#endif
10278#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
10279# define ALWAYS(X) (1)
10280# define NEVER(X) (0)
10281#elif !defined(NDEBUG)
10282# define ALWAYS(X) ((X)?1:(assert(0),0))
10283# define NEVER(X) ((X)?(assert(0),1):0)
10284#else
10285# define ALWAYS(X) (X)
10286# define NEVER(X) (X)
10287#endif
10288
10289#endif /* SQLITE_AMALGAMATION */
10290
10291/*
10292** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
10293**
10294** In some ways it would be better to obtain these values from system
10295** header files. But, the dependency is undesirable and (a) these
10296** have been stable for decades, (b) the values are part of POSIX and
10297** are also made explicit in [man stat], and (c) are part of the
10298** file format for zip archives.
10299*/
10300#ifndef S_IFDIR
10301# define S_IFDIR 0040000
10302#endif
10303#ifndef S_IFREG
10304# define S_IFREG 0100000
10305#endif
10306#ifndef S_IFLNK
10307# define S_IFLNK 0120000
10308#endif
10309
10310static const char ZIPFILE_SCHEMA[] =
10311 "CREATE TABLE y("
10312 "name PRIMARY KEY," /* 0: Name of file in zip archive */
10313 "mode," /* 1: POSIX mode for file */
10314 "mtime," /* 2: Last modification time (secs since 1970)*/
10315 "sz," /* 3: Size of object */
10316 "rawdata," /* 4: Raw data */
10317 "data," /* 5: Uncompressed data */
10318 "method," /* 6: Compression method (integer) */
10319 "z HIDDEN" /* 7: Name of zip file */
10320 ") WITHOUT ROWID;";
10321
10322#define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */
10323#define ZIPFILE_BUFFER_SIZE (64*1024)
10324
10325
10326/*
10327** Magic numbers used to read and write zip files.
10328**
10329** ZIPFILE_NEWENTRY_MADEBY:
10330** Use this value for the "version-made-by" field in new zip file
10331** entries. The upper byte indicates "unix", and the lower byte
10332** indicates that the zip file matches pkzip specification 3.0.
10333** This is what info-zip seems to do.
10334**
10335** ZIPFILE_NEWENTRY_REQUIRED:
10336** Value for "version-required-to-extract" field of new entries.
10337** Version 2.0 is required to support folders and deflate compression.
10338**
10339** ZIPFILE_NEWENTRY_FLAGS:
10340** Value for "general-purpose-bit-flags" field of new entries. Bit
10341** 11 means "utf-8 filename and comment".
10342**
10343** ZIPFILE_SIGNATURE_CDS:
10344** First 4 bytes of a valid CDS record.
10345**
10346** ZIPFILE_SIGNATURE_LFH:
10347** First 4 bytes of a valid LFH record.
10348**
10349** ZIPFILE_SIGNATURE_EOCD
10350** First 4 bytes of a valid EOCD record.
10351*/
10352#define ZIPFILE_EXTRA_TIMESTAMP 0x5455
10353#define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30)
10354#define ZIPFILE_NEWENTRY_REQUIRED 20
10355#define ZIPFILE_NEWENTRY_FLAGS 0x800
10356#define ZIPFILE_SIGNATURE_CDS 0x02014b50
10357#define ZIPFILE_SIGNATURE_LFH 0x04034b50
10358#define ZIPFILE_SIGNATURE_EOCD 0x06054b50
10359
10360/*
10361** The sizes of the fixed-size part of each of the three main data
10362** structures in a zip archive.
10363*/
10364#define ZIPFILE_LFH_FIXED_SZ 30
10365#define ZIPFILE_EOCD_FIXED_SZ 22
10366#define ZIPFILE_CDS_FIXED_SZ 46
10367
10368/*
10369*** 4.3.16 End of central directory record:
10370***
10371*** end of central dir signature 4 bytes (0x06054b50)
10372*** number of this disk 2 bytes
10373*** number of the disk with the
10374*** start of the central directory 2 bytes
10375*** total number of entries in the
10376*** central directory on this disk 2 bytes
10377*** total number of entries in
10378*** the central directory 2 bytes
10379*** size of the central directory 4 bytes
10380*** offset of start of central
10381*** directory with respect to
10382*** the starting disk number 4 bytes
10383*** .ZIP file comment length 2 bytes
10384*** .ZIP file comment (variable size)
10385*/
10386typedef struct ZipfileEOCD ZipfileEOCD;
10387struct ZipfileEOCD {
10388 u16 iDisk;
10389 u16 iFirstDisk;
10390 u16 nEntry;
10391 u16 nEntryTotal;
10392 u32 nSize;
10393 u32 iOffset;
10394};
10395
10396/*
10397*** 4.3.12 Central directory structure:
10398***
10399*** ...
10400***
10401*** central file header signature 4 bytes (0x02014b50)
10402*** version made by 2 bytes
10403*** version needed to extract 2 bytes
10404*** general purpose bit flag 2 bytes
10405*** compression method 2 bytes
10406*** last mod file time 2 bytes
10407*** last mod file date 2 bytes
10408*** crc-32 4 bytes
10409*** compressed size 4 bytes
10410*** uncompressed size 4 bytes
10411*** file name length 2 bytes
10412*** extra field length 2 bytes
10413*** file comment length 2 bytes
10414*** disk number start 2 bytes
10415*** internal file attributes 2 bytes
10416*** external file attributes 4 bytes
10417*** relative offset of local header 4 bytes
10418*/
10419typedef struct ZipfileCDS ZipfileCDS;
10420struct ZipfileCDS {
10421 u16 iVersionMadeBy;
10422 u16 iVersionExtract;
10423 u16 flags;
10424 u16 iCompression;
10425 u16 mTime;
10426 u16 mDate;
10427 u32 crc32;
10428 u32 szCompressed;
10429 u32 szUncompressed;
10430 u16 nFile;
10431 u16 nExtra;
10432 u16 nComment;
10433 u16 iDiskStart;
10434 u16 iInternalAttr;
10435 u32 iExternalAttr;
10436 u32 iOffset;
10437 char *zFile; /* Filename (sqlite3_malloc()) */
10438};
10439
10440/*
10441*** 4.3.7 Local file header:
10442***
10443*** local file header signature 4 bytes (0x04034b50)
10444*** version needed to extract 2 bytes
10445*** general purpose bit flag 2 bytes
10446*** compression method 2 bytes
10447*** last mod file time 2 bytes
10448*** last mod file date 2 bytes
10449*** crc-32 4 bytes
10450*** compressed size 4 bytes
10451*** uncompressed size 4 bytes
10452*** file name length 2 bytes
10453*** extra field length 2 bytes
10454***
10455*/
10456typedef struct ZipfileLFH ZipfileLFH;
10457struct ZipfileLFH {
10458 u16 iVersionExtract;
10459 u16 flags;
10460 u16 iCompression;
10461 u16 mTime;
10462 u16 mDate;
10463 u32 crc32;
10464 u32 szCompressed;
10465 u32 szUncompressed;
10466 u16 nFile;
10467 u16 nExtra;
10468};
10469
10470typedef struct ZipfileEntry ZipfileEntry;
10471struct ZipfileEntry {
10472 ZipfileCDS cds; /* Parsed CDS record */
10473 u32 mUnixTime; /* Modification time, in UNIX format */
10474 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */
10475 i64 iDataOff; /* Offset to data in file (if aData==0) */
10476 u8 *aData; /* cds.szCompressed bytes of compressed data */
10477 ZipfileEntry *pNext; /* Next element in in-memory CDS */
10478};
10479
10480/*
10481** Cursor type for zipfile tables.
10482*/
10483typedef struct ZipfileCsr ZipfileCsr;
10484struct ZipfileCsr {
10485 sqlite3_vtab_cursor base; /* Base class - must be first */
10486 i64 iId; /* Cursor ID */
10487 u8 bEof; /* True when at EOF */
10488 u8 bNoop; /* If next xNext() call is no-op */
10489
10490 /* Used outside of write transactions */
10491 FILE *pFile; /* Zip file */
10492 i64 iNextOff; /* Offset of next record in central directory */
10493 ZipfileEOCD eocd; /* Parse of central directory record */
10494
10495 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */
10496 ZipfileEntry *pCurrent; /* Current entry */
10497 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */
10498};
10499
10500typedef struct ZipfileTab ZipfileTab;
10501struct ZipfileTab {
10502 sqlite3_vtab base; /* Base class - must be first */
10503 char *zFile; /* Zip file this table accesses (may be NULL) */
10504 sqlite3 *db; /* Host database connection */
10505 u8 *aBuffer; /* Temporary buffer used for various tasks */
10506
10507 ZipfileCsr *pCsrList; /* List of cursors */
10508 i64 iNextCsrid;
10509
10510 /* The following are used by write transactions only */
10511 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
10512 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */
10513 FILE *pWriteFd; /* File handle open on zip archive */
10514 i64 szCurrent; /* Current size of zip archive */
10515 i64 szOrig; /* Size of archive at start of transaction */
10516};
10517
10518/*
10519** Set the error message contained in context ctx to the results of
10520** vprintf(zFmt, ...).
10521*/
10522static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
10523 char *zMsg = 0;
10524 va_list ap;
10525 va_start(ap, zFmt);
10526 zMsg = sqlite3_vmprintf(zFmt, ap);
10527 sqlite3_result_error(ctx, zMsg, -1);
10528 sqlite3_free(zMsg);
10529 va_end(ap);
10530}
10531
10532/*
10533** If string zIn is quoted, dequote it in place. Otherwise, if the string
10534** is not quoted, do nothing.
10535*/
10536static void zipfileDequote(char *zIn){
10537 char q = zIn[0];
10538 if( q=='"' || q=='\'' || q=='`' || q=='[' ){
10539 int iIn = 1;
10540 int iOut = 0;
10541 if( q=='[' ) q = ']';
10542 while( ALWAYS(zIn[iIn]) ){
10543 char c = zIn[iIn++];
10544 if( c==q && zIn[iIn++]!=q ) break;
10545 zIn[iOut++] = c;
10546 }
10547 zIn[iOut] = '\0';
10548 }
10549}
10550
10551/*
10552** Construct a new ZipfileTab virtual table object.
10553**
10554** argv[0] -> module name ("zipfile")
10555** argv[1] -> database name
10556** argv[2] -> table name
10557** argv[...] -> "column name" and other module argument fields.
10558*/
10559static int zipfileConnect(
10560 sqlite3 *db,
10561 void *pAux,
10562 int argc, const char *const*argv,
10563 sqlite3_vtab **ppVtab,
10564 char **pzErr
10565){
10566 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
10567 int nFile = 0;
10568 const char *zFile = 0;
10569 ZipfileTab *pNew = 0;
10570 int rc;
10571 (void)pAux;
10572
10573 /* If the table name is not "zipfile", require that the argument be
10574 ** specified. This stops zipfile tables from being created as:
10575 **
10576 ** CREATE VIRTUAL TABLE zzz USING zipfile();
10577 **
10578 ** It does not prevent:
10579 **
10580 ** CREATE VIRTUAL TABLE zipfile USING zipfile();
10581 */
10582 assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
10583 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
10584 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
10585 return SQLITE_ERROR;
10586 }
10587
10588 if( argc>3 ){
10589 zFile = argv[3];
10590 nFile = (int)strlen(zFile)+1;
10591 }
10592
10593 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
10594 if( rc==SQLITE_OK ){
10595 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
10596 if( pNew==0 ) return SQLITE_NOMEM;
10597 memset(pNew, 0, nByte+nFile);
10598 pNew->db = db;
10599 pNew->aBuffer = (u8*)&pNew[1];
10600 if( zFile ){
10601 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
10602 memcpy(pNew->zFile, zFile, nFile);
10603 zipfileDequote(pNew->zFile);
10604 }
10605 }
10606 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
10607 *ppVtab = (sqlite3_vtab*)pNew;
10608 return rc;
10609}
10610
10611/*
10612** Free the ZipfileEntry structure indicated by the only argument.
10613*/
10614static void zipfileEntryFree(ZipfileEntry *p){
10615 if( p ){
10616 sqlite3_free(p->cds.zFile);
10617 sqlite3_free(p);
10618 }
10619}
10620
10621/*
10622** Release resources that should be freed at the end of a write
10623** transaction.
10624*/
10625static void zipfileCleanupTransaction(ZipfileTab *pTab){
10626 ZipfileEntry *pEntry;
10627 ZipfileEntry *pNext;
10628
10629 if( pTab->pWriteFd ){
10630 fclose(pTab->pWriteFd);
10631 pTab->pWriteFd = 0;
10632 }
10633 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
10634 pNext = pEntry->pNext;
10635 zipfileEntryFree(pEntry);
10636 }
10637 pTab->pFirstEntry = 0;
10638 pTab->pLastEntry = 0;
10639 pTab->szCurrent = 0;
10640 pTab->szOrig = 0;
10641}
10642
10643/*
10644** This method is the destructor for zipfile vtab objects.
10645*/
10646static int zipfileDisconnect(sqlite3_vtab *pVtab){
10647 zipfileCleanupTransaction((ZipfileTab*)pVtab);
10648 sqlite3_free(pVtab);
10649 return SQLITE_OK;
10650}
10651
10652/*
10653** Constructor for a new ZipfileCsr object.
10654*/
10655static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
10656 ZipfileTab *pTab = (ZipfileTab*)p;
10657 ZipfileCsr *pCsr;
10658 pCsr = sqlite3_malloc(sizeof(*pCsr));
10659 *ppCsr = (sqlite3_vtab_cursor*)pCsr;
10660 if( pCsr==0 ){
10661 return SQLITE_NOMEM;
10662 }
10663 memset(pCsr, 0, sizeof(*pCsr));
10664 pCsr->iId = ++pTab->iNextCsrid;
10665 pCsr->pCsrNext = pTab->pCsrList;
10666 pTab->pCsrList = pCsr;
10667 return SQLITE_OK;
10668}
10669
10670/*
10671** Reset a cursor back to the state it was in when first returned
10672** by zipfileOpen().
10673*/
10674static void zipfileResetCursor(ZipfileCsr *pCsr){
10675 ZipfileEntry *p;
10676 ZipfileEntry *pNext;
10677
10678 pCsr->bEof = 0;
10679 if( pCsr->pFile ){
10680 fclose(pCsr->pFile);
10681 pCsr->pFile = 0;
10682 zipfileEntryFree(pCsr->pCurrent);
10683 pCsr->pCurrent = 0;
10684 }
10685
10686 for(p=pCsr->pFreeEntry; p; p=pNext){
10687 pNext = p->pNext;
10688 zipfileEntryFree(p);
10689 }
10690}
10691
10692/*
10693** Destructor for an ZipfileCsr.
10694*/
10695static int zipfileClose(sqlite3_vtab_cursor *cur){
10696 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10697 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
10698 ZipfileCsr **pp;
10699 zipfileResetCursor(pCsr);
10700
10701 /* Remove this cursor from the ZipfileTab.pCsrList list. */
10702 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
10703 *pp = pCsr->pCsrNext;
10704
10705 sqlite3_free(pCsr);
10706 return SQLITE_OK;
10707}
10708
10709/*
10710** Set the error message for the virtual table associated with cursor
10711** pCsr to the results of vprintf(zFmt, ...).
10712*/
10713static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
10714 va_list ap;
10715 va_start(ap, zFmt);
10716 sqlite3_free(pTab->base.zErrMsg);
10717 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
10718 va_end(ap);
10719}
10720static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
10721 va_list ap;
10722 va_start(ap, zFmt);
10723 sqlite3_free(pCsr->base.pVtab->zErrMsg);
10724 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
10725 va_end(ap);
10726}
10727
10728/*
10729** Read nRead bytes of data from offset iOff of file pFile into buffer
10730** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
10731** otherwise.
10732**
10733** If an error does occur, output variable (*pzErrmsg) may be set to point
10734** to an English language error message. It is the responsibility of the
10735** caller to eventually free this buffer using
10736** sqlite3_free().
10737*/
10738static int zipfileReadData(
10739 FILE *pFile, /* Read from this file */
10740 u8 *aRead, /* Read into this buffer */
10741 int nRead, /* Number of bytes to read */
10742 i64 iOff, /* Offset to read from */
10743 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */
10744){
10745 size_t n;
10746 fseek(pFile, (long)iOff, SEEK_SET);
10747 n = fread(aRead, 1, nRead, pFile);
10748 if( (int)n!=nRead ){
10749 *pzErrmsg = sqlite3_mprintf("error in fread()");
10750 return SQLITE_ERROR;
10751 }
10752 return SQLITE_OK;
10753}
10754
10755static int zipfileAppendData(
10756 ZipfileTab *pTab,
10757 const u8 *aWrite,
10758 int nWrite
10759){
10760 if( nWrite>0 ){
10761 size_t n = nWrite;
10762 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
10763 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
10764 if( (int)n!=nWrite ){
10765 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
10766 return SQLITE_ERROR;
10767 }
10768 pTab->szCurrent += nWrite;
10769 }
10770 return SQLITE_OK;
10771}
10772
10773/*
10774** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
10775*/
10776static u16 zipfileGetU16(const u8 *aBuf){
10777 return (aBuf[1] << 8) + aBuf[0];
10778}
10779
10780/*
10781** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
10782*/
10783static u32 zipfileGetU32(const u8 *aBuf){
10784 if( aBuf==0 ) return 0;
10785 return ((u32)(aBuf[3]) << 24)
10786 + ((u32)(aBuf[2]) << 16)
10787 + ((u32)(aBuf[1]) << 8)
10788 + ((u32)(aBuf[0]) << 0);
10789}
10790
10791/*
10792** Write a 16-bit little endiate integer into buffer aBuf.
10793*/
10794static void zipfilePutU16(u8 *aBuf, u16 val){
10795 aBuf[0] = val & 0xFF;
10796 aBuf[1] = (val>>8) & 0xFF;
10797}
10798
10799/*
10800** Write a 32-bit little endiate integer into buffer aBuf.
10801*/
10802static void zipfilePutU32(u8 *aBuf, u32 val){
10803 aBuf[0] = val & 0xFF;
10804 aBuf[1] = (val>>8) & 0xFF;
10805 aBuf[2] = (val>>16) & 0xFF;
10806 aBuf[3] = (val>>24) & 0xFF;
10807}
10808
10809#define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
10810#define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
10811
10812#define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
10813#define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
10814
10815/*
10816** Magic numbers used to read CDS records.
10817*/
10818#define ZIPFILE_CDS_NFILE_OFF 28
10819#define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
10820
10821/*
10822** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
10823** if the record is not well-formed, or SQLITE_OK otherwise.
10824*/
10825static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
10826 u8 *aRead = aBuf;
10827 u32 sig = zipfileRead32(aRead);
10828 int rc = SQLITE_OK;
10829 if( sig!=ZIPFILE_SIGNATURE_CDS ){
10830 rc = SQLITE_ERROR;
10831 }else{
10832 pCDS->iVersionMadeBy = zipfileRead16(aRead);
10833 pCDS->iVersionExtract = zipfileRead16(aRead);
10834 pCDS->flags = zipfileRead16(aRead);
10835 pCDS->iCompression = zipfileRead16(aRead);
10836 pCDS->mTime = zipfileRead16(aRead);
10837 pCDS->mDate = zipfileRead16(aRead);
10838 pCDS->crc32 = zipfileRead32(aRead);
10839 pCDS->szCompressed = zipfileRead32(aRead);
10840 pCDS->szUncompressed = zipfileRead32(aRead);
10841 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
10842 pCDS->nFile = zipfileRead16(aRead);
10843 pCDS->nExtra = zipfileRead16(aRead);
10844 pCDS->nComment = zipfileRead16(aRead);
10845 pCDS->iDiskStart = zipfileRead16(aRead);
10846 pCDS->iInternalAttr = zipfileRead16(aRead);
10847 pCDS->iExternalAttr = zipfileRead32(aRead);
10848 pCDS->iOffset = zipfileRead32(aRead);
10849 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
10850 }
10851
10852 return rc;
10853}
10854
10855/*
10856** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
10857** if the record is not well-formed, or SQLITE_OK otherwise.
10858*/
10859static int zipfileReadLFH(
10860 u8 *aBuffer,
10861 ZipfileLFH *pLFH
10862){
10863 u8 *aRead = aBuffer;
10864 int rc = SQLITE_OK;
10865
10866 u32 sig = zipfileRead32(aRead);
10867 if( sig!=ZIPFILE_SIGNATURE_LFH ){
10868 rc = SQLITE_ERROR;
10869 }else{
10870 pLFH->iVersionExtract = zipfileRead16(aRead);
10871 pLFH->flags = zipfileRead16(aRead);
10872 pLFH->iCompression = zipfileRead16(aRead);
10873 pLFH->mTime = zipfileRead16(aRead);
10874 pLFH->mDate = zipfileRead16(aRead);
10875 pLFH->crc32 = zipfileRead32(aRead);
10876 pLFH->szCompressed = zipfileRead32(aRead);
10877 pLFH->szUncompressed = zipfileRead32(aRead);
10878 pLFH->nFile = zipfileRead16(aRead);
10879 pLFH->nExtra = zipfileRead16(aRead);
10880 }
10881 return rc;
10882}
10883
10884
10885/*
10886** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
10887** Scan through this buffer to find an "extra-timestamp" field. If one
10888** exists, extract the 32-bit modification-timestamp from it and store
10889** the value in output parameter *pmTime.
10890**
10891** Zero is returned if no extra-timestamp record could be found (and so
10892** *pmTime is left unchanged), or non-zero otherwise.
10893**
10894** The general format of an extra field is:
10895**
10896** Header ID 2 bytes
10897** Data Size 2 bytes
10898** Data N bytes
10899*/
10900static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
10901 int ret = 0;
10902 u8 *p = aExtra;
10903 u8 *pEnd = &aExtra[nExtra];
10904
10905 while( p<pEnd ){
10906 u16 id = zipfileRead16(p);
10907 u16 nByte = zipfileRead16(p);
10908
10909 switch( id ){
10910 case ZIPFILE_EXTRA_TIMESTAMP: {
10911 u8 b = p[0];
10912 if( b & 0x01 ){ /* 0x01 -> modtime is present */
10913 *pmTime = zipfileGetU32(&p[1]);
10914 ret = 1;
10915 }
10916 break;
10917 }
10918 }
10919
10920 p += nByte;
10921 }
10922 return ret;
10923}
10924
10925/*
10926** Convert the standard MS-DOS timestamp stored in the mTime and mDate
10927** fields of the CDS structure passed as the only argument to a 32-bit
10928** UNIX seconds-since-the-epoch timestamp. Return the result.
10929**
10930** "Standard" MS-DOS time format:
10931**
10932** File modification time:
10933** Bits 00-04: seconds divided by 2
10934** Bits 05-10: minute
10935** Bits 11-15: hour
10936** File modification date:
10937** Bits 00-04: day
10938** Bits 05-08: month (1-12)
10939** Bits 09-15: years from 1980
10940**
10941** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
10942*/
10943static u32 zipfileMtime(ZipfileCDS *pCDS){
10944 int Y,M,D,X1,X2,A,B,sec,min,hr;
10945 i64 JDsec;
10946 Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
10947 M = ((pCDS->mDate >> 5) & 0x0F);
10948 D = (pCDS->mDate & 0x1F);
10949 sec = (pCDS->mTime & 0x1F)*2;
10950 min = (pCDS->mTime >> 5) & 0x3F;
10951 hr = (pCDS->mTime >> 11) & 0x1F;
10952 if( M<=2 ){
10953 Y--;
10954 M += 12;
10955 }
10956 X1 = 36525*(Y+4716)/100;
10957 X2 = 306001*(M+1)/10000;
10958 A = Y/100;
10959 B = 2 - A + (A/4);
10960 JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
10961 return (u32)(JDsec - (i64)24405875*(i64)8640);
10962}
10963
10964/*
10965** The opposite of zipfileMtime(). This function populates the mTime and
10966** mDate fields of the CDS structure passed as the first argument according
10967** to the UNIX timestamp value passed as the second.
10968*/
10969static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
10970 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
10971 i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
10972
10973 int A, B, C, D, E;
10974 int yr, mon, day;
10975 int hr, min, sec;
10976
10977 A = (int)((JD - 1867216.25)/36524.25);
10978 A = (int)(JD + 1 + A - (A/4));
10979 B = A + 1524;
10980 C = (int)((B - 122.1)/365.25);
10981 D = (36525*(C&32767))/100;
10982 E = (int)((B-D)/30.6001);
10983
10984 day = B - D - (int)(30.6001*E);
10985 mon = (E<14 ? E-1 : E-13);
10986 yr = mon>2 ? C-4716 : C-4715;
10987
10988 hr = (mUnixTime % (24*60*60)) / (60*60);
10989 min = (mUnixTime % (60*60)) / 60;
10990 sec = (mUnixTime % 60);
10991
10992 if( yr>=1980 ){
10993 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
10994 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
10995 }else{
10996 pCds->mDate = pCds->mTime = 0;
10997 }
10998
10999 assert( mUnixTime<315507600
11000 || mUnixTime==zipfileMtime(pCds)
11001 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
11002 /* || (mUnixTime % 2) */
11003 );
11004}
11005
11006/*
11007** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
11008** size) containing an entire zip archive image. Or, if aBlob is NULL,
11009** then pFile is a file-handle open on a zip file. In either case, this
11010** function creates a ZipfileEntry object based on the zip archive entry
11011** for which the CDS record is at offset iOff.
11012**
11013** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
11014** the new object. Otherwise, an SQLite error code is returned and the
11015** final value of (*ppEntry) undefined.
11016*/
11017static int zipfileGetEntry(
11018 ZipfileTab *pTab, /* Store any error message here */
11019 const u8 *aBlob, /* Pointer to in-memory file image */
11020 int nBlob, /* Size of aBlob[] in bytes */
11021 FILE *pFile, /* If aBlob==0, read from this file */
11022 i64 iOff, /* Offset of CDS record */
11023 ZipfileEntry **ppEntry /* OUT: Pointer to new object */
11024){
11025 u8 *aRead;
11026 char **pzErr = &pTab->base.zErrMsg;
11027 int rc = SQLITE_OK;
11028 (void)nBlob;
11029
11030 if( aBlob==0 ){
11031 aRead = pTab->aBuffer;
11032 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
11033 }else{
11034 aRead = (u8*)&aBlob[iOff];
11035 }
11036
11037 if( rc==SQLITE_OK ){
11038 sqlite3_int64 nAlloc;
11039 ZipfileEntry *pNew;
11040
11041 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
11042 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
11043 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
11044
11045 nAlloc = sizeof(ZipfileEntry) + nExtra;
11046 if( aBlob ){
11047 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
11048 }
11049
11050 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
11051 if( pNew==0 ){
11052 rc = SQLITE_NOMEM;
11053 }else{
11054 memset(pNew, 0, sizeof(ZipfileEntry));
11055 rc = zipfileReadCDS(aRead, &pNew->cds);
11056 if( rc!=SQLITE_OK ){
11057 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
11058 }else if( aBlob==0 ){
11059 rc = zipfileReadData(
11060 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
11061 );
11062 }else{
11063 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
11064 }
11065 }
11066
11067 if( rc==SQLITE_OK ){
11068 u32 *pt = &pNew->mUnixTime;
11069 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
11070 pNew->aExtra = (u8*)&pNew[1];
11071 memcpy(pNew->aExtra, &aRead[nFile], nExtra);
11072 if( pNew->cds.zFile==0 ){
11073 rc = SQLITE_NOMEM;
11074 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
11075 pNew->mUnixTime = zipfileMtime(&pNew->cds);
11076 }
11077 }
11078
11079 if( rc==SQLITE_OK ){
11080 static const int szFix = ZIPFILE_LFH_FIXED_SZ;
11081 ZipfileLFH lfh;
11082 if( pFile ){
11083 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
11084 }else{
11085 aRead = (u8*)&aBlob[pNew->cds.iOffset];
11086 }
11087
11088 if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
11089 if( rc==SQLITE_OK ){
11090 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
11091 pNew->iDataOff += lfh.nFile + lfh.nExtra;
11092 if( aBlob && pNew->cds.szCompressed ){
11093 pNew->aData = &pNew->aExtra[nExtra];
11094 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
11095 }
11096 }else{
11097 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
11098 (int)pNew->cds.iOffset
11099 );
11100 }
11101 }
11102
11103 if( rc!=SQLITE_OK ){
11104 zipfileEntryFree(pNew);
11105 }else{
11106 *ppEntry = pNew;
11107 }
11108 }
11109
11110 return rc;
11111}
11112
11113/*
11114** Advance an ZipfileCsr to its next row of output.
11115*/
11116static int zipfileNext(sqlite3_vtab_cursor *cur){
11117 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
11118 int rc = SQLITE_OK;
11119
11120 if( pCsr->pFile ){
11121 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
11122 zipfileEntryFree(pCsr->pCurrent);
11123 pCsr->pCurrent = 0;
11124 if( pCsr->iNextOff>=iEof ){
11125 pCsr->bEof = 1;
11126 }else{
11127 ZipfileEntry *p = 0;
11128 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
11129 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
11130 if( rc==SQLITE_OK ){
11131 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
11132 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
11133 }
11134 pCsr->pCurrent = p;
11135 }
11136 }else{
11137 if( !pCsr->bNoop ){
11138 pCsr->pCurrent = pCsr->pCurrent->pNext;
11139 }
11140 if( pCsr->pCurrent==0 ){
11141 pCsr->bEof = 1;
11142 }
11143 }
11144
11145 pCsr->bNoop = 0;
11146 return rc;
11147}
11148
11149static void zipfileFree(void *p) {
11150 sqlite3_free(p);
11151}
11152
11153/*
11154** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
11155** size is nOut bytes. This function uncompresses the data and sets the
11156** return value in context pCtx to the result (a blob).
11157**
11158** If an error occurs, an error code is left in pCtx instead.
11159*/
11160static void zipfileInflate(
11161 sqlite3_context *pCtx, /* Store result here */
11162 const u8 *aIn, /* Compressed data */
11163 int nIn, /* Size of buffer aIn[] in bytes */
11164 int nOut /* Expected output size */
11165){
11166 u8 *aRes = sqlite3_malloc(nOut);
11167 if( aRes==0 ){
11168 sqlite3_result_error_nomem(pCtx);
11169 }else{
11170 int err;
11171 z_stream str;
11172 memset(&str, 0, sizeof(str));
11173
11174 str.next_in = (Byte*)aIn;
11175 str.avail_in = nIn;
11176 str.next_out = (Byte*)aRes;
11177 str.avail_out = nOut;
11178
11179 err = inflateInit2(&str, -15);
11180 if( err!=Z_OK ){
11181 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
11182 }else{
11183 err = inflate(&str, Z_NO_FLUSH);
11184 if( err!=Z_STREAM_END ){
11185 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
11186 }else{
11187 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
11188 aRes = 0;
11189 }
11190 }
11191 sqlite3_free(aRes);
11192 inflateEnd(&str);
11193 }
11194}
11195
11196/*
11197** Buffer aIn (size nIn bytes) contains uncompressed data. This function
11198** compresses it and sets (*ppOut) to point to a buffer containing the
11199** compressed data. The caller is responsible for eventually calling
11200** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
11201** is set to the size of buffer (*ppOut) in bytes.
11202**
11203** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
11204** code is returned and an error message left in virtual-table handle
11205** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
11206** case.
11207*/
11208static int zipfileDeflate(
11209 const u8 *aIn, int nIn, /* Input */
11210 u8 **ppOut, int *pnOut, /* Output */
11211 char **pzErr /* OUT: Error message */
11212){
11213 int rc = SQLITE_OK;
11214 sqlite3_int64 nAlloc;
11215 z_stream str;
11216 u8 *aOut;
11217
11218 memset(&str, 0, sizeof(str));
11219 str.next_in = (Bytef*)aIn;
11220 str.avail_in = nIn;
11221 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
11222
11223 nAlloc = deflateBound(&str, nIn);
11224 aOut = (u8*)sqlite3_malloc64(nAlloc);
11225 if( aOut==0 ){
11226 rc = SQLITE_NOMEM;
11227 }else{
11228 int res;
11229 str.next_out = aOut;
11230 str.avail_out = nAlloc;
11231 res = deflate(&str, Z_FINISH);
11232 if( res==Z_STREAM_END ){
11233 *ppOut = aOut;
11234 *pnOut = (int)str.total_out;
11235 }else{
11236 sqlite3_free(aOut);
11237 *pzErr = sqlite3_mprintf("zipfile: deflate() error");
11238 rc = SQLITE_ERROR;
11239 }
11240 deflateEnd(&str);
11241 }
11242
11243 return rc;
11244}
11245
11246
11247/*
11248** Return values of columns for the row at which the series_cursor
11249** is currently pointing.
11250*/
11251static int zipfileColumn(
11252 sqlite3_vtab_cursor *cur, /* The cursor */
11253 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
11254 int i /* Which column to return */
11255){
11256 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
11257 ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
11258 int rc = SQLITE_OK;
11259 switch( i ){
11260 case 0: /* name */
11261 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
11262 break;
11263 case 1: /* mode */
11264 /* TODO: Whether or not the following is correct surely depends on
11265 ** the platform on which the archive was created. */
11266 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
11267 break;
11268 case 2: { /* mtime */
11269 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
11270 break;
11271 }
11272 case 3: { /* sz */
11273 if( sqlite3_vtab_nochange(ctx)==0 ){
11274 sqlite3_result_int64(ctx, pCDS->szUncompressed);
11275 }
11276 break;
11277 }
11278 case 4: /* rawdata */
11279 if( sqlite3_vtab_nochange(ctx) ) break;
11280 case 5: { /* data */
11281 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
11282 int sz = pCDS->szCompressed;
11283 int szFinal = pCDS->szUncompressed;
11284 if( szFinal>0 ){
11285 u8 *aBuf;
11286 u8 *aFree = 0;
11287 if( pCsr->pCurrent->aData ){
11288 aBuf = pCsr->pCurrent->aData;
11289 }else{
11290 aBuf = aFree = sqlite3_malloc64(sz);
11291 if( aBuf==0 ){
11292 rc = SQLITE_NOMEM;
11293 }else{
11294 FILE *pFile = pCsr->pFile;
11295 if( pFile==0 ){
11296 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
11297 }
11298 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
11299 &pCsr->base.pVtab->zErrMsg
11300 );
11301 }
11302 }
11303 if( rc==SQLITE_OK ){
11304 if( i==5 && pCDS->iCompression ){
11305 zipfileInflate(ctx, aBuf, sz, szFinal);
11306 }else{
11307 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
11308 }
11309 }
11310 sqlite3_free(aFree);
11311 }else{
11312 /* Figure out if this is a directory or a zero-sized file. Consider
11313 ** it to be a directory either if the mode suggests so, or if
11314 ** the final character in the name is '/'. */
11315 u32 mode = pCDS->iExternalAttr >> 16;
11316 if( !(mode & S_IFDIR)
11317 && pCDS->nFile>=1
11318 && pCDS->zFile[pCDS->nFile-1]!='/'
11319 ){
11320 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
11321 }
11322 }
11323 }
11324 break;
11325 }
11326 case 6: /* method */
11327 sqlite3_result_int(ctx, pCDS->iCompression);
11328 break;
11329 default: /* z */
11330 assert( i==7 );
11331 sqlite3_result_int64(ctx, pCsr->iId);
11332 break;
11333 }
11334
11335 return rc;
11336}
11337
11338/*
11339** Return TRUE if the cursor is at EOF.
11340*/
11341static int zipfileEof(sqlite3_vtab_cursor *cur){
11342 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
11343 return pCsr->bEof;
11344}
11345
11346/*
11347** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
11348** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
11349** is guaranteed to be a file-handle open on a zip file.
11350**
11351** This function attempts to locate the EOCD record within the zip archive
11352** and populate *pEOCD with the results of decoding it. SQLITE_OK is
11353** returned if successful. Otherwise, an SQLite error code is returned and
11354** an English language error message may be left in virtual-table pTab.
11355*/
11356static int zipfileReadEOCD(
11357 ZipfileTab *pTab, /* Return errors here */
11358 const u8 *aBlob, /* Pointer to in-memory file image */
11359 int nBlob, /* Size of aBlob[] in bytes */
11360 FILE *pFile, /* Read from this file if aBlob==0 */
11361 ZipfileEOCD *pEOCD /* Object to populate */
11362){
11363 u8 *aRead = pTab->aBuffer; /* Temporary buffer */
11364 int nRead; /* Bytes to read from file */
11365 int rc = SQLITE_OK;
11366
11367 memset(pEOCD, 0, sizeof(ZipfileEOCD));
11368 if( aBlob==0 ){
11369 i64 iOff; /* Offset to read from */
11370 i64 szFile; /* Total size of file in bytes */
11371 fseek(pFile, 0, SEEK_END);
11372 szFile = (i64)ftell(pFile);
11373 if( szFile==0 ){
11374 return SQLITE_OK;
11375 }
11376 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
11377 iOff = szFile - nRead;
11378 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
11379 }else{
11380 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
11381 aRead = (u8*)&aBlob[nBlob-nRead];
11382 }
11383
11384 if( rc==SQLITE_OK ){
11385 int i;
11386
11387 /* Scan backwards looking for the signature bytes */
11388 for(i=nRead-20; i>=0; i--){
11389 if( aRead[i]==0x50 && aRead[i+1]==0x4b
11390 && aRead[i+2]==0x05 && aRead[i+3]==0x06
11391 ){
11392 break;
11393 }
11394 }
11395 if( i<0 ){
11396 pTab->base.zErrMsg = sqlite3_mprintf(
11397 "cannot find end of central directory record"
11398 );
11399 return SQLITE_ERROR;
11400 }
11401
11402 aRead += i+4;
11403 pEOCD->iDisk = zipfileRead16(aRead);
11404 pEOCD->iFirstDisk = zipfileRead16(aRead);
11405 pEOCD->nEntry = zipfileRead16(aRead);
11406 pEOCD->nEntryTotal = zipfileRead16(aRead);
11407 pEOCD->nSize = zipfileRead32(aRead);
11408 pEOCD->iOffset = zipfileRead32(aRead);
11409 }
11410
11411 return rc;
11412}
11413
11414/*
11415** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
11416** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
11417** to the end of the list. Otherwise, it is added to the list immediately
11418** before pBefore (which is guaranteed to be a part of said list).
11419*/
11420static void zipfileAddEntry(
11421 ZipfileTab *pTab,
11422 ZipfileEntry *pBefore,
11423 ZipfileEntry *pNew
11424){
11425 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
11426 assert( pNew->pNext==0 );
11427 if( pBefore==0 ){
11428 if( pTab->pFirstEntry==0 ){
11429 pTab->pFirstEntry = pTab->pLastEntry = pNew;
11430 }else{
11431 assert( pTab->pLastEntry->pNext==0 );
11432 pTab->pLastEntry->pNext = pNew;
11433 pTab->pLastEntry = pNew;
11434 }
11435 }else{
11436 ZipfileEntry **pp;
11437 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
11438 pNew->pNext = pBefore;
11439 *pp = pNew;
11440 }
11441}
11442
11443static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
11444 ZipfileEOCD eocd;
11445 int rc;
11446 int i;
11447 i64 iOff;
11448
11449 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
11450 iOff = eocd.iOffset;
11451 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
11452 ZipfileEntry *pNew = 0;
11453 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
11454
11455 if( rc==SQLITE_OK ){
11456 zipfileAddEntry(pTab, 0, pNew);
11457 iOff += ZIPFILE_CDS_FIXED_SZ;
11458 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
11459 }
11460 }
11461 return rc;
11462}
11463
11464/*
11465** xFilter callback.
11466*/
11467static int zipfileFilter(
11468 sqlite3_vtab_cursor *cur,
11469 int idxNum, const char *idxStr,
11470 int argc, sqlite3_value **argv
11471){
11472 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
11473 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
11474 const char *zFile = 0; /* Zip file to scan */
11475 int rc = SQLITE_OK; /* Return Code */
11476 int bInMemory = 0; /* True for an in-memory zipfile */
11477
11478 (void)idxStr;
11479 (void)argc;
11480
11481 zipfileResetCursor(pCsr);
11482
11483 if( pTab->zFile ){
11484 zFile = pTab->zFile;
11485 }else if( idxNum==0 ){
11486 zipfileCursorErr(pCsr, "zipfile() function requires an argument");
11487 return SQLITE_ERROR;
11488 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
11489 static const u8 aEmptyBlob = 0;
11490 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
11491 int nBlob = sqlite3_value_bytes(argv[0]);
11492 assert( pTab->pFirstEntry==0 );
11493 if( aBlob==0 ){
11494 aBlob = &aEmptyBlob;
11495 nBlob = 0;
11496 }
11497 rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
11498 pCsr->pFreeEntry = pTab->pFirstEntry;
11499 pTab->pFirstEntry = pTab->pLastEntry = 0;
11500 if( rc!=SQLITE_OK ) return rc;
11501 bInMemory = 1;
11502 }else{
11503 zFile = (const char*)sqlite3_value_text(argv[0]);
11504 }
11505
11506 if( 0==pTab->pWriteFd && 0==bInMemory ){
11507 pCsr->pFile = zFile ? sqlite3_fopen(zFile, "rb") : 0;
11508 if( pCsr->pFile==0 ){
11509 zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
11510 rc = SQLITE_ERROR;
11511 }else{
11512 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
11513 if( rc==SQLITE_OK ){
11514 if( pCsr->eocd.nEntry==0 ){
11515 pCsr->bEof = 1;
11516 }else{
11517 pCsr->iNextOff = pCsr->eocd.iOffset;
11518 rc = zipfileNext(cur);
11519 }
11520 }
11521 }
11522 }else{
11523 pCsr->bNoop = 1;
11524 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
11525 rc = zipfileNext(cur);
11526 }
11527
11528 return rc;
11529}
11530
11531/*
11532** xBestIndex callback.
11533*/
11534static int zipfileBestIndex(
11535 sqlite3_vtab *tab,
11536 sqlite3_index_info *pIdxInfo
11537){
11538 int i;
11539 int idx = -1;
11540 int unusable = 0;
11541 (void)tab;
11542
11543 for(i=0; i<pIdxInfo->nConstraint; i++){
11544 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
11545 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
11546 if( pCons->usable==0 ){
11547 unusable = 1;
11548 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
11549 idx = i;
11550 }
11551 }
11552 pIdxInfo->estimatedCost = 1000.0;
11553 if( idx>=0 ){
11554 pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
11555 pIdxInfo->aConstraintUsage[idx].omit = 1;
11556 pIdxInfo->idxNum = 1;
11557 }else if( unusable ){
11558 return SQLITE_CONSTRAINT;
11559 }
11560 return SQLITE_OK;
11561}
11562
11563static ZipfileEntry *zipfileNewEntry(const char *zPath){
11564 ZipfileEntry *pNew;
11565 pNew = sqlite3_malloc(sizeof(ZipfileEntry));
11566 if( pNew ){
11567 memset(pNew, 0, sizeof(ZipfileEntry));
11568 pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
11569 if( pNew->cds.zFile==0 ){
11570 sqlite3_free(pNew);
11571 pNew = 0;
11572 }
11573 }
11574 return pNew;
11575}
11576
11577static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
11578 ZipfileCDS *pCds = &pEntry->cds;
11579 u8 *a = aBuf;
11580
11581 pCds->nExtra = 9;
11582
11583 /* Write the LFH itself */
11584 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
11585 zipfileWrite16(a, pCds->iVersionExtract);
11586 zipfileWrite16(a, pCds->flags);
11587 zipfileWrite16(a, pCds->iCompression);
11588 zipfileWrite16(a, pCds->mTime);
11589 zipfileWrite16(a, pCds->mDate);
11590 zipfileWrite32(a, pCds->crc32);
11591 zipfileWrite32(a, pCds->szCompressed);
11592 zipfileWrite32(a, pCds->szUncompressed);
11593 zipfileWrite16(a, (u16)pCds->nFile);
11594 zipfileWrite16(a, pCds->nExtra);
11595 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
11596
11597 /* Add the file name */
11598 memcpy(a, pCds->zFile, (int)pCds->nFile);
11599 a += (int)pCds->nFile;
11600
11601 /* The "extra" data */
11602 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
11603 zipfileWrite16(a, 5);
11604 *a++ = 0x01;
11605 zipfileWrite32(a, pEntry->mUnixTime);
11606
11607 return a-aBuf;
11608}
11609
11610static int zipfileAppendEntry(
11611 ZipfileTab *pTab,
11612 ZipfileEntry *pEntry,
11613 const u8 *pData,
11614 int nData
11615){
11616 u8 *aBuf = pTab->aBuffer;
11617 int nBuf;
11618 int rc;
11619
11620 nBuf = zipfileSerializeLFH(pEntry, aBuf);
11621 rc = zipfileAppendData(pTab, aBuf, nBuf);
11622 if( rc==SQLITE_OK ){
11623 pEntry->iDataOff = pTab->szCurrent;
11624 rc = zipfileAppendData(pTab, pData, nData);
11625 }
11626
11627 return rc;
11628}
11629
11630static int zipfileGetMode(
11631 sqlite3_value *pVal,
11632 int bIsDir, /* If true, default to directory */
11633 u32 *pMode, /* OUT: Mode value */
11634 char **pzErr /* OUT: Error message */
11635){
11636 const char *z = (const char*)sqlite3_value_text(pVal);
11637 u32 mode = 0;
11638 if( z==0 ){
11639 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
11640 }else if( z[0]>='0' && z[0]<='9' ){
11641 mode = (unsigned int)sqlite3_value_int(pVal);
11642 }else{
11643 const char zTemplate[11] = "-rwxrwxrwx";
11644 int i;
11645 if( strlen(z)!=10 ) goto parse_error;
11646 switch( z[0] ){
11647 case '-': mode |= S_IFREG; break;
11648 case 'd': mode |= S_IFDIR; break;
11649 case 'l': mode |= S_IFLNK; break;
11650 default: goto parse_error;
11651 }
11652 for(i=1; i<10; i++){
11653 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
11654 else if( z[i]!='-' ) goto parse_error;
11655 }
11656 }
11657 if( ((mode & S_IFDIR)==0)==bIsDir ){
11658 /* The "mode" attribute is a directory, but data has been specified.
11659 ** Or vice-versa - no data but "mode" is a file or symlink. */
11660 *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
11661 return SQLITE_CONSTRAINT;
11662 }
11663 *pMode = mode;
11664 return SQLITE_OK;
11665
11666 parse_error:
11667 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
11668 return SQLITE_ERROR;
11669}
11670
11671/*
11672** Both (const char*) arguments point to nul-terminated strings. Argument
11673** nB is the value of strlen(zB). This function returns 0 if the strings are
11674** identical, ignoring any trailing '/' character in either path. */
11675static int zipfileComparePath(const char *zA, const char *zB, int nB){
11676 int nA = (int)strlen(zA);
11677 if( nA>0 && zA[nA-1]=='/' ) nA--;
11678 if( nB>0 && zB[nB-1]=='/' ) nB--;
11679 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
11680 return 1;
11681}
11682
11683static int zipfileBegin(sqlite3_vtab *pVtab){
11684 ZipfileTab *pTab = (ZipfileTab*)pVtab;
11685 int rc = SQLITE_OK;
11686
11687 assert( pTab->pWriteFd==0 );
11688 if( pTab->zFile==0 || pTab->zFile[0]==0 ){
11689 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
11690 return SQLITE_ERROR;
11691 }
11692
11693 /* Open a write fd on the file. Also load the entire central directory
11694 ** structure into memory. During the transaction any new file data is
11695 ** appended to the archive file, but the central directory is accumulated
11696 ** in main-memory until the transaction is committed. */
11697 pTab->pWriteFd = sqlite3_fopen(pTab->zFile, "ab+");
11698 if( pTab->pWriteFd==0 ){
11699 pTab->base.zErrMsg = sqlite3_mprintf(
11700 "zipfile: failed to open file %s for writing", pTab->zFile
11701 );
11702 rc = SQLITE_ERROR;
11703 }else{
11704 fseek(pTab->pWriteFd, 0, SEEK_END);
11705 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
11706 rc = zipfileLoadDirectory(pTab, 0, 0);
11707 }
11708
11709 if( rc!=SQLITE_OK ){
11710 zipfileCleanupTransaction(pTab);
11711 }
11712
11713 return rc;
11714}
11715
11716/*
11717** Return the current time as a 32-bit timestamp in UNIX epoch format (like
11718** time(2)).
11719*/
11720static u32 zipfileTime(void){
11721 sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
11722 u32 ret;
11723 if( pVfs==0 ) return 0;
11724 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
11725 i64 ms;
11726 pVfs->xCurrentTimeInt64(pVfs, &ms);
11727 ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
11728 }else{
11729 double day;
11730 pVfs->xCurrentTime(pVfs, &day);
11731 ret = (u32)((day - 2440587.5) * 86400);
11732 }
11733 return ret;
11734}
11735
11736/*
11737** Return a 32-bit timestamp in UNIX epoch format.
11738**
11739** If the value passed as the only argument is either NULL or an SQL NULL,
11740** return the current time. Otherwise, return the value stored in (*pVal)
11741** cast to a 32-bit unsigned integer.
11742*/
11743static u32 zipfileGetTime(sqlite3_value *pVal){
11744 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
11745 return zipfileTime();
11746 }
11747 return (u32)sqlite3_value_int64(pVal);
11748}
11749
11750/*
11751** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
11752** linked list. Remove it from the list and free the object.
11753*/
11754static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
11755 if( pOld ){
11756 if( pTab->pFirstEntry==pOld ){
11757 pTab->pFirstEntry = pOld->pNext;
11758 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
11759 }else{
11760 ZipfileEntry *p;
11761 for(p=pTab->pFirstEntry; p; p=p->pNext){
11762 if( p->pNext==pOld ){
11763 p->pNext = pOld->pNext;
11764 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
11765 break;
11766 }
11767 }
11768 }
11769 zipfileEntryFree(pOld);
11770 }
11771}
11772
11773/*
11774** xUpdate method.
11775*/
11776static int zipfileUpdate(
11777 sqlite3_vtab *pVtab,
11778 int nVal,
11779 sqlite3_value **apVal,
11780 sqlite_int64 *pRowid
11781){
11782 ZipfileTab *pTab = (ZipfileTab*)pVtab;
11783 int rc = SQLITE_OK; /* Return Code */
11784 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */
11785
11786 u32 mode = 0; /* Mode for new entry */
11787 u32 mTime = 0; /* Modification time for new entry */
11788 i64 sz = 0; /* Uncompressed size */
11789 const char *zPath = 0; /* Path for new entry */
11790 int nPath = 0; /* strlen(zPath) */
11791 const u8 *pData = 0; /* Pointer to buffer containing content */
11792 int nData = 0; /* Size of pData buffer in bytes */
11793 int iMethod = 0; /* Compression method for new entry */
11794 u8 *pFree = 0; /* Free this */
11795 char *zFree = 0; /* Also free this */
11796 ZipfileEntry *pOld = 0;
11797 ZipfileEntry *pOld2 = 0;
11798 int bUpdate = 0; /* True for an update that modifies "name" */
11799 int bIsDir = 0;
11800 u32 iCrc32 = 0;
11801
11802 (void)pRowid;
11803
11804 if( pTab->pWriteFd==0 ){
11805 rc = zipfileBegin(pVtab);
11806 if( rc!=SQLITE_OK ) return rc;
11807 }
11808
11809 /* If this is a DELETE or UPDATE, find the archive entry to delete. */
11810 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
11811 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
11812 int nDelete = (int)strlen(zDelete);
11813 if( nVal>1 ){
11814 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
11815 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
11816 bUpdate = 1;
11817 }
11818 }
11819 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
11820 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
11821 break;
11822 }
11823 assert( pOld->pNext );
11824 }
11825 }
11826
11827 if( nVal>1 ){
11828 /* Check that "sz" and "rawdata" are both NULL: */
11829 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
11830 zipfileTableErr(pTab, "sz must be NULL");
11831 rc = SQLITE_CONSTRAINT;
11832 }
11833 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
11834 zipfileTableErr(pTab, "rawdata must be NULL");
11835 rc = SQLITE_CONSTRAINT;
11836 }
11837
11838 if( rc==SQLITE_OK ){
11839 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
11840 /* data=NULL. A directory */
11841 bIsDir = 1;
11842 }else{
11843 /* Value specified for "data", and possibly "method". This must be
11844 ** a regular file or a symlink. */
11845 const u8 *aIn = sqlite3_value_blob(apVal[7]);
11846 int nIn = sqlite3_value_bytes(apVal[7]);
11847 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
11848
11849 iMethod = sqlite3_value_int(apVal[8]);
11850 sz = nIn;
11851 pData = aIn;
11852 nData = nIn;
11853 if( iMethod!=0 && iMethod!=8 ){
11854 zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
11855 rc = SQLITE_CONSTRAINT;
11856 }else{
11857 if( bAuto || iMethod ){
11858 int nCmp;
11859 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
11860 if( rc==SQLITE_OK ){
11861 if( iMethod || nCmp<nIn ){
11862 iMethod = 8;
11863 pData = pFree;
11864 nData = nCmp;
11865 }
11866 }
11867 }
11868 iCrc32 = crc32(0, aIn, nIn);
11869 }
11870 }
11871 }
11872
11873 if( rc==SQLITE_OK ){
11874 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
11875 }
11876
11877 if( rc==SQLITE_OK ){
11878 zPath = (const char*)sqlite3_value_text(apVal[2]);
11879 if( zPath==0 ) zPath = "";
11880 nPath = (int)strlen(zPath);
11881 mTime = zipfileGetTime(apVal[4]);
11882 }
11883
11884 if( rc==SQLITE_OK && bIsDir ){
11885 /* For a directory, check that the last character in the path is a
11886 ** '/'. This appears to be required for compatibility with info-zip
11887 ** (the unzip command on unix). It does not create directories
11888 ** otherwise. */
11889 if( nPath<=0 || zPath[nPath-1]!='/' ){
11890 zFree = sqlite3_mprintf("%s/", zPath);
11891 zPath = (const char*)zFree;
11892 if( zFree==0 ){
11893 rc = SQLITE_NOMEM;
11894 nPath = 0;
11895 }else{
11896 nPath = (int)strlen(zPath);
11897 }
11898 }
11899 }
11900
11901 /* Check that we're not inserting a duplicate entry -OR- updating an
11902 ** entry with a path, thereby making it into a duplicate. */
11903 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
11904 ZipfileEntry *p;
11905 for(p=pTab->pFirstEntry; p; p=p->pNext){
11906 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
11907 switch( sqlite3_vtab_on_conflict(pTab->db) ){
11908 case SQLITE_IGNORE: {
11909 goto zipfile_update_done;
11910 }
11911 case SQLITE_REPLACE: {
11912 pOld2 = p;
11913 break;
11914 }
11915 default: {
11916 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
11917 rc = SQLITE_CONSTRAINT;
11918 break;
11919 }
11920 }
11921 break;
11922 }
11923 }
11924 }
11925
11926 if( rc==SQLITE_OK ){
11927 /* Create the new CDS record. */
11928 pNew = zipfileNewEntry(zPath);
11929 if( pNew==0 ){
11930 rc = SQLITE_NOMEM;
11931 }else{
11932 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
11933 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
11934 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
11935 pNew->cds.iCompression = (u16)iMethod;
11936 zipfileMtimeToDos(&pNew->cds, mTime);
11937 pNew->cds.crc32 = iCrc32;
11938 pNew->cds.szCompressed = nData;
11939 pNew->cds.szUncompressed = (u32)sz;
11940 pNew->cds.iExternalAttr = (mode<<16);
11941 pNew->cds.iOffset = (u32)pTab->szCurrent;
11942 pNew->cds.nFile = (u16)nPath;
11943 pNew->mUnixTime = (u32)mTime;
11944 rc = zipfileAppendEntry(pTab, pNew, pData, nData);
11945 zipfileAddEntry(pTab, pOld, pNew);
11946 }
11947 }
11948 }
11949
11950 if( rc==SQLITE_OK && (pOld || pOld2) ){
11951 ZipfileCsr *pCsr;
11952 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
11953 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
11954 pCsr->pCurrent = pCsr->pCurrent->pNext;
11955 pCsr->bNoop = 1;
11956 }
11957 }
11958
11959 zipfileRemoveEntryFromList(pTab, pOld);
11960 zipfileRemoveEntryFromList(pTab, pOld2);
11961 }
11962
11963zipfile_update_done:
11964 sqlite3_free(pFree);
11965 sqlite3_free(zFree);
11966 return rc;
11967}
11968
11969static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
11970 u8 *a = aBuf;
11971 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
11972 zipfileWrite16(a, p->iDisk);
11973 zipfileWrite16(a, p->iFirstDisk);
11974 zipfileWrite16(a, p->nEntry);
11975 zipfileWrite16(a, p->nEntryTotal);
11976 zipfileWrite32(a, p->nSize);
11977 zipfileWrite32(a, p->iOffset);
11978 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/
11979
11980 return a-aBuf;
11981}
11982
11983static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
11984 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
11985 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
11986 return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
11987}
11988
11989/*
11990** Serialize the CDS structure into buffer aBuf[]. Return the number
11991** of bytes written.
11992*/
11993static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
11994 u8 *a = aBuf;
11995 ZipfileCDS *pCDS = &pEntry->cds;
11996
11997 if( pEntry->aExtra==0 ){
11998 pCDS->nExtra = 9;
11999 }
12000
12001 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
12002 zipfileWrite16(a, pCDS->iVersionMadeBy);
12003 zipfileWrite16(a, pCDS->iVersionExtract);
12004 zipfileWrite16(a, pCDS->flags);
12005 zipfileWrite16(a, pCDS->iCompression);
12006 zipfileWrite16(a, pCDS->mTime);
12007 zipfileWrite16(a, pCDS->mDate);
12008 zipfileWrite32(a, pCDS->crc32);
12009 zipfileWrite32(a, pCDS->szCompressed);
12010 zipfileWrite32(a, pCDS->szUncompressed);
12011 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
12012 zipfileWrite16(a, pCDS->nFile);
12013 zipfileWrite16(a, pCDS->nExtra);
12014 zipfileWrite16(a, pCDS->nComment);
12015 zipfileWrite16(a, pCDS->iDiskStart);
12016 zipfileWrite16(a, pCDS->iInternalAttr);
12017 zipfileWrite32(a, pCDS->iExternalAttr);
12018 zipfileWrite32(a, pCDS->iOffset);
12019
12020 memcpy(a, pCDS->zFile, pCDS->nFile);
12021 a += pCDS->nFile;
12022
12023 if( pEntry->aExtra ){
12024 int n = (int)pCDS->nExtra + (int)pCDS->nComment;
12025 memcpy(a, pEntry->aExtra, n);
12026 a += n;
12027 }else{
12028 assert( pCDS->nExtra==9 );
12029 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
12030 zipfileWrite16(a, 5);
12031 *a++ = 0x01;
12032 zipfileWrite32(a, pEntry->mUnixTime);
12033 }
12034
12035 return a-aBuf;
12036}
12037
12038static int zipfileCommit(sqlite3_vtab *pVtab){
12039 ZipfileTab *pTab = (ZipfileTab*)pVtab;
12040 int rc = SQLITE_OK;
12041 if( pTab->pWriteFd ){
12042 i64 iOffset = pTab->szCurrent;
12043 ZipfileEntry *p;
12044 ZipfileEOCD eocd;
12045 int nEntry = 0;
12046
12047 /* Write out all entries */
12048 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
12049 int n = zipfileSerializeCDS(p, pTab->aBuffer);
12050 rc = zipfileAppendData(pTab, pTab->aBuffer, n);
12051 nEntry++;
12052 }
12053
12054 /* Write out the EOCD record */
12055 eocd.iDisk = 0;
12056 eocd.iFirstDisk = 0;
12057 eocd.nEntry = (u16)nEntry;
12058 eocd.nEntryTotal = (u16)nEntry;
12059 eocd.nSize = (u32)(pTab->szCurrent - iOffset);
12060 eocd.iOffset = (u32)iOffset;
12061 rc = zipfileAppendEOCD(pTab, &eocd);
12062
12063 zipfileCleanupTransaction(pTab);
12064 }
12065 return rc;
12066}
12067
12068static int zipfileRollback(sqlite3_vtab *pVtab){
12069 return zipfileCommit(pVtab);
12070}
12071
12072static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
12073 ZipfileCsr *pCsr;
12074 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
12075 if( iId==pCsr->iId ) break;
12076 }
12077 return pCsr;
12078}
12079
12080static void zipfileFunctionCds(
12081 sqlite3_context *context,
12082 int argc,
12083 sqlite3_value **argv
12084){
12085 ZipfileCsr *pCsr;
12086 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
12087 assert( argc>0 );
12088
12089 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
12090 if( pCsr ){
12091 ZipfileCDS *p = &pCsr->pCurrent->cds;
12092 char *zRes = sqlite3_mprintf("{"
12093 "\"version-made-by\" : %u, "
12094 "\"version-to-extract\" : %u, "
12095 "\"flags\" : %u, "
12096 "\"compression\" : %u, "
12097 "\"time\" : %u, "
12098 "\"date\" : %u, "
12099 "\"crc32\" : %u, "
12100 "\"compressed-size\" : %u, "
12101 "\"uncompressed-size\" : %u, "
12102 "\"file-name-length\" : %u, "
12103 "\"extra-field-length\" : %u, "
12104 "\"file-comment-length\" : %u, "
12105 "\"disk-number-start\" : %u, "
12106 "\"internal-attr\" : %u, "
12107 "\"external-attr\" : %u, "
12108 "\"offset\" : %u }",
12109 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
12110 (u32)p->flags, (u32)p->iCompression,
12111 (u32)p->mTime, (u32)p->mDate,
12112 (u32)p->crc32, (u32)p->szCompressed,
12113 (u32)p->szUncompressed, (u32)p->nFile,
12114 (u32)p->nExtra, (u32)p->nComment,
12115 (u32)p->iDiskStart, (u32)p->iInternalAttr,
12116 (u32)p->iExternalAttr, (u32)p->iOffset
12117 );
12118
12119 if( zRes==0 ){
12120 sqlite3_result_error_nomem(context);
12121 }else{
12122 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
12123 sqlite3_free(zRes);
12124 }
12125 }
12126}
12127
12128/*
12129** xFindFunction method.
12130*/
12131static int zipfileFindFunction(
12132 sqlite3_vtab *pVtab, /* Virtual table handle */
12133 int nArg, /* Number of SQL function arguments */
12134 const char *zName, /* Name of SQL function */
12135 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
12136 void **ppArg /* OUT: User data for *pxFunc */
12137){
12138 (void)nArg;
12139 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
12140 *pxFunc = zipfileFunctionCds;
12141 *ppArg = (void*)pVtab;
12142 return 1;
12143 }
12144 return 0;
12145}
12146
12147typedef struct ZipfileBuffer ZipfileBuffer;
12148struct ZipfileBuffer {
12149 u8 *a; /* Pointer to buffer */
12150 int n; /* Size of buffer in bytes */
12151 int nAlloc; /* Byte allocated at a[] */
12152};
12153
12154typedef struct ZipfileCtx ZipfileCtx;
12155struct ZipfileCtx {
12156 int nEntry;
12157 ZipfileBuffer body;
12158 ZipfileBuffer cds;
12159};
12160
12161static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
12162 if( pBuf->n+nByte>pBuf->nAlloc ){
12163 u8 *aNew;
12164 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
12165 int nReq = pBuf->n + nByte;
12166
12167 while( nNew<nReq ) nNew = nNew*2;
12168 aNew = sqlite3_realloc64(pBuf->a, nNew);
12169 if( aNew==0 ) return SQLITE_NOMEM;
12170 pBuf->a = aNew;
12171 pBuf->nAlloc = (int)nNew;
12172 }
12173 return SQLITE_OK;
12174}
12175
12176/*
12177** xStep() callback for the zipfile() aggregate. This can be called in
12178** any of the following ways:
12179**
12180** SELECT zipfile(name,data) ...
12181** SELECT zipfile(name,mode,mtime,data) ...
12182** SELECT zipfile(name,mode,mtime,data,method) ...
12183*/
12184static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
12185 ZipfileCtx *p; /* Aggregate function context */
12186 ZipfileEntry e; /* New entry to add to zip archive */
12187
12188 sqlite3_value *pName = 0;
12189 sqlite3_value *pMode = 0;
12190 sqlite3_value *pMtime = 0;
12191 sqlite3_value *pData = 0;
12192 sqlite3_value *pMethod = 0;
12193
12194 int bIsDir = 0;
12195 u32 mode;
12196 int rc = SQLITE_OK;
12197 char *zErr = 0;
12198
12199 int iMethod = -1; /* Compression method to use (0 or 8) */
12200
12201 const u8 *aData = 0; /* Possibly compressed data for new entry */
12202 int nData = 0; /* Size of aData[] in bytes */
12203 int szUncompressed = 0; /* Size of data before compression */
12204 u8 *aFree = 0; /* Free this before returning */
12205 u32 iCrc32 = 0; /* crc32 of uncompressed data */
12206
12207 char *zName = 0; /* Path (name) of new entry */
12208 int nName = 0; /* Size of zName in bytes */
12209 char *zFree = 0; /* Free this before returning */
12210 int nByte;
12211
12212 memset(&e, 0, sizeof(e));
12213 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
12214 if( p==0 ) return;
12215
12216 /* Martial the arguments into stack variables */
12217 if( nVal!=2 && nVal!=4 && nVal!=5 ){
12218 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
12219 rc = SQLITE_ERROR;
12220 goto zipfile_step_out;
12221 }
12222 pName = apVal[0];
12223 if( nVal==2 ){
12224 pData = apVal[1];
12225 }else{
12226 pMode = apVal[1];
12227 pMtime = apVal[2];
12228 pData = apVal[3];
12229 if( nVal==5 ){
12230 pMethod = apVal[4];
12231 }
12232 }
12233
12234 /* Check that the 'name' parameter looks ok. */
12235 zName = (char*)sqlite3_value_text(pName);
12236 nName = sqlite3_value_bytes(pName);
12237 if( zName==0 ){
12238 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
12239 rc = SQLITE_ERROR;
12240 goto zipfile_step_out;
12241 }
12242
12243 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
12244 ** deflate compression) or NULL (choose automatically). */
12245 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
12246 iMethod = (int)sqlite3_value_int64(pMethod);
12247 if( iMethod!=0 && iMethod!=8 ){
12248 zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
12249 rc = SQLITE_ERROR;
12250 goto zipfile_step_out;
12251 }
12252 }
12253
12254 /* Now inspect the data. If this is NULL, then the new entry must be a
12255 ** directory. Otherwise, figure out whether or not the data should
12256 ** be deflated or simply stored in the zip archive. */
12257 if( sqlite3_value_type(pData)==SQLITE_NULL ){
12258 bIsDir = 1;
12259 iMethod = 0;
12260 }else{
12261 aData = sqlite3_value_blob(pData);
12262 szUncompressed = nData = sqlite3_value_bytes(pData);
12263 iCrc32 = crc32(0, aData, nData);
12264 if( iMethod<0 || iMethod==8 ){
12265 int nOut = 0;
12266 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
12267 if( rc!=SQLITE_OK ){
12268 goto zipfile_step_out;
12269 }
12270 if( iMethod==8 || nOut<nData ){
12271 aData = aFree;
12272 nData = nOut;
12273 iMethod = 8;
12274 }else{
12275 iMethod = 0;
12276 }
12277 }
12278 }
12279
12280 /* Decode the "mode" argument. */
12281 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
12282 if( rc ) goto zipfile_step_out;
12283
12284 /* Decode the "mtime" argument. */
12285 e.mUnixTime = zipfileGetTime(pMtime);
12286
12287 /* If this is a directory entry, ensure that there is exactly one '/'
12288 ** at the end of the path. Or, if this is not a directory and the path
12289 ** ends in '/' it is an error. */
12290 if( bIsDir==0 ){
12291 if( nName>0 && zName[nName-1]=='/' ){
12292 zErr = sqlite3_mprintf("non-directory name must not end with /");
12293 rc = SQLITE_ERROR;
12294 goto zipfile_step_out;
12295 }
12296 }else{
12297 if( nName==0 || zName[nName-1]!='/' ){
12298 zName = zFree = sqlite3_mprintf("%s/", zName);
12299 if( zName==0 ){
12300 rc = SQLITE_NOMEM;
12301 goto zipfile_step_out;
12302 }
12303 nName = (int)strlen(zName);
12304 }else{
12305 while( nName>1 && zName[nName-2]=='/' ) nName--;
12306 }
12307 }
12308
12309 /* Assemble the ZipfileEntry object for the new zip archive entry */
12310 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
12311 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
12312 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
12313 e.cds.iCompression = (u16)iMethod;
12314 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
12315 e.cds.crc32 = iCrc32;
12316 e.cds.szCompressed = nData;
12317 e.cds.szUncompressed = szUncompressed;
12318 e.cds.iExternalAttr = (mode<<16);
12319 e.cds.iOffset = p->body.n;
12320 e.cds.nFile = (u16)nName;
12321 e.cds.zFile = zName;
12322
12323 /* Append the LFH to the body of the new archive */
12324 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
12325 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
12326 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
12327
12328 /* Append the data to the body of the new archive */
12329 if( nData>0 ){
12330 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
12331 memcpy(&p->body.a[p->body.n], aData, nData);
12332 p->body.n += nData;
12333 }
12334
12335 /* Append the CDS record to the directory of the new archive */
12336 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
12337 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
12338 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
12339
12340 /* Increment the count of entries in the archive */
12341 p->nEntry++;
12342
12343 zipfile_step_out:
12344 sqlite3_free(aFree);
12345 sqlite3_free(zFree);
12346 if( rc ){
12347 if( zErr ){
12348 sqlite3_result_error(pCtx, zErr, -1);
12349 }else{
12350 sqlite3_result_error_code(pCtx, rc);
12351 }
12352 }
12353 sqlite3_free(zErr);
12354}
12355
12356/*
12357** xFinalize() callback for zipfile aggregate function.
12358*/
12359static void zipfileFinal(sqlite3_context *pCtx){
12360 ZipfileCtx *p;
12361 ZipfileEOCD eocd;
12362 sqlite3_int64 nZip;
12363 u8 *aZip;
12364
12365 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
12366 if( p==0 ) return;
12367 if( p->nEntry>0 ){
12368 memset(&eocd, 0, sizeof(eocd));
12369 eocd.nEntry = (u16)p->nEntry;
12370 eocd.nEntryTotal = (u16)p->nEntry;
12371 eocd.nSize = p->cds.n;
12372 eocd.iOffset = p->body.n;
12373
12374 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
12375 aZip = (u8*)sqlite3_malloc64(nZip);
12376 if( aZip==0 ){
12377 sqlite3_result_error_nomem(pCtx);
12378 }else{
12379 memcpy(aZip, p->body.a, p->body.n);
12380 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
12381 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
12382 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
12383 }
12384 }
12385
12386 sqlite3_free(p->body.a);
12387 sqlite3_free(p->cds.a);
12388}
12389
12390
12391/*
12392** Register the "zipfile" virtual table.
12393*/
12394static int zipfileRegister(sqlite3 *db){
12395 static sqlite3_module zipfileModule = {
12396 1, /* iVersion */
12397 zipfileConnect, /* xCreate */
12398 zipfileConnect, /* xConnect */
12399 zipfileBestIndex, /* xBestIndex */
12400 zipfileDisconnect, /* xDisconnect */
12401 zipfileDisconnect, /* xDestroy */
12402 zipfileOpen, /* xOpen - open a cursor */
12403 zipfileClose, /* xClose - close a cursor */
12404 zipfileFilter, /* xFilter - configure scan constraints */
12405 zipfileNext, /* xNext - advance a cursor */
12406 zipfileEof, /* xEof - check for end of scan */
12407 zipfileColumn, /* xColumn - read data */
12408 0, /* xRowid - read data */
12409 zipfileUpdate, /* xUpdate */
12410 zipfileBegin, /* xBegin */
12411 0, /* xSync */
12412 zipfileCommit, /* xCommit */
12413 zipfileRollback, /* xRollback */
12414 zipfileFindFunction, /* xFindMethod */
12415 0, /* xRename */
12416 0, /* xSavepoint */
12417 0, /* xRelease */
12418 0, /* xRollback */
12419 0, /* xShadowName */
12420 0 /* xIntegrity */
12421 };
12422
12423 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0);
12424 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
12425 if( rc==SQLITE_OK ){
12426 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
12427 zipfileStep, zipfileFinal
12428 );
12429 }
12430 assert( sizeof(i64)==8 );
12431 assert( sizeof(u32)==4 );
12432 assert( sizeof(u16)==2 );
12433 assert( sizeof(u8)==1 );
12434 return rc;
12435}
12436#else /* SQLITE_OMIT_VIRTUALTABLE */
12437# define zipfileRegister(x) SQLITE_OK
12438#endif
12439
12440#ifdef _WIN32
12441
12442#endif
12443int sqlite3_zipfile_init(
12444 sqlite3 *db,
12445 char **pzErrMsg,
12446 const sqlite3_api_routines *pApi
12447){
12448 SQLITE_EXTENSION_INIT2(pApi);
12449 (void)pzErrMsg; /* Unused parameter */
12450 return zipfileRegister(db);
12451}
12452
12453/************************* End ../ext/misc/zipfile.c ********************/
12454/************************* Begin ../ext/misc/sqlar.c ******************/
12455/*
12456** 2017-12-17
12457**
12458** The author disclaims copyright to this source code. In place of
12459** a legal notice, here is a blessing:
12460**
12461** May you do good and not evil.
12462** May you find forgiveness for yourself and forgive others.
12463** May you share freely, never taking more than you give.
12464**
12465******************************************************************************
12466**
12467** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
12468** for working with sqlar archives and used by the shell tool's built-in
12469** sqlar support.
12470*/
12471/* #include "sqlite3ext.h" */
12472SQLITE_EXTENSION_INIT1
12473#include <zlib.h>
12474#include <assert.h>
12475
12476/*
12477** Implementation of the "sqlar_compress(X)" SQL function.
12478**
12479** If the type of X is SQLITE_BLOB, and compressing that blob using
12480** zlib utility function compress() yields a smaller blob, return the
12481** compressed blob. Otherwise, return a copy of X.
12482**
12483** SQLar uses the "zlib format" for compressed content. The zlib format
12484** contains a two-byte identification header and a four-byte checksum at
12485** the end. This is different from ZIP which uses the raw deflate format.
12486**
12487** Future enhancements to SQLar might add support for new compression formats.
12488** If so, those new formats will be identified by alternative headers in the
12489** compressed data.
12490*/
12491static void sqlarCompressFunc(
12492 sqlite3_context *context,
12493 int argc,
12494 sqlite3_value **argv
12495){
12496 assert( argc==1 );
12497 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
12498 const Bytef *pData = sqlite3_value_blob(argv[0]);
12499 uLong nData = sqlite3_value_bytes(argv[0]);
12500 uLongf nOut = compressBound(nData);
12501 Bytef *pOut;
12502
12503 pOut = (Bytef*)sqlite3_malloc(nOut);
12504 if( pOut==0 ){
12505 sqlite3_result_error_nomem(context);
12506 return;
12507 }else{
12508 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
12509 sqlite3_result_error(context, "error in compress()", -1);
12510 }else if( nOut<nData ){
12511 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
12512 }else{
12513 sqlite3_result_value(context, argv[0]);
12514 }
12515 sqlite3_free(pOut);
12516 }
12517 }else{
12518 sqlite3_result_value(context, argv[0]);
12519 }
12520}
12521
12522/*
12523** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
12524**
12525** Parameter SZ is interpreted as an integer. If it is less than or
12526** equal to zero, then this function returns a copy of X. Or, if
12527** SZ is equal to the size of X when interpreted as a blob, also
12528** return a copy of X. Otherwise, decompress blob X using zlib
12529** utility function uncompress() and return the results (another
12530** blob).
12531*/
12532static void sqlarUncompressFunc(
12533 sqlite3_context *context,
12534 int argc,
12535 sqlite3_value **argv
12536){
12537 uLong nData;
12538 sqlite3_int64 sz;
12539
12540 assert( argc==2 );
12541 sz = sqlite3_value_int(argv[1]);
12542
12543 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
12544 sqlite3_result_value(context, argv[0]);
12545 }else{
12546 uLongf szf = sz;
12547 const Bytef *pData= sqlite3_value_blob(argv[0]);
12548 Bytef *pOut = sqlite3_malloc(sz);
12549 if( pOut==0 ){
12550 sqlite3_result_error_nomem(context);
12551 }else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){
12552 sqlite3_result_error(context, "error in uncompress()", -1);
12553 }else{
12554 sqlite3_result_blob(context, pOut, szf, SQLITE_TRANSIENT);
12555 }
12556 sqlite3_free(pOut);
12557 }
12558}
12559
12560#ifdef _WIN32
12561
12562#endif
12563int sqlite3_sqlar_init(
12564 sqlite3 *db,
12565 char **pzErrMsg,
12566 const sqlite3_api_routines *pApi
12567){
12568 int rc = SQLITE_OK;
12569 SQLITE_EXTENSION_INIT2(pApi);
12570 (void)pzErrMsg; /* Unused parameter */
12571 rc = sqlite3_create_function(db, "sqlar_compress", 1,
12572 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
12573 sqlarCompressFunc, 0, 0);
12574 if( rc==SQLITE_OK ){
12575 rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
12576 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
12577 sqlarUncompressFunc, 0, 0);
12578 }
12579 return rc;
12580}
12581
12582/************************* End ../ext/misc/sqlar.c ********************/
12583#endif
12584/************************* Begin ../ext/expert/sqlite3expert.h ******************/
12585/*
12586** 2017 April 07
12587**
12588** The author disclaims copyright to this source code. In place of
12589** a legal notice, here is a blessing:
12590**
12591** May you do good and not evil.
12592** May you find forgiveness for yourself and forgive others.
12593** May you share freely, never taking more than you give.
12594**
12595*************************************************************************
12596*/
12597#if !defined(SQLITEEXPERT_H)
12598#define SQLITEEXPERT_H 1
12599/* #include "sqlite3.h" */
12600
12601typedef struct sqlite3expert sqlite3expert;
12602
12603/*
12604** Create a new sqlite3expert object.
12605**
12606** If successful, a pointer to the new object is returned and (*pzErr) set
12607** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
12608** an English-language error message. In this case it is the responsibility
12609** of the caller to eventually free the error message buffer using
12610** sqlite3_free().
12611*/
12612sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
12613
12614/*
12615** Configure an sqlite3expert object.
12616**
12617** EXPERT_CONFIG_SAMPLE:
12618** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
12619** each candidate index. This involves scanning and sorting the entire
12620** contents of each user database table once for each candidate index
12621** associated with the table. For large databases, this can be
12622** prohibitively slow. This option allows the sqlite3expert object to
12623** be configured so that sqlite_stat1 data is instead generated based on a
12624** subset of each table, or so that no sqlite_stat1 data is used at all.
12625**
12626** A single integer argument is passed to this option. If the value is less
12627** than or equal to zero, then no sqlite_stat1 data is generated or used by
12628** the analysis - indexes are recommended based on the database schema only.
12629** Or, if the value is 100 or greater, complete sqlite_stat1 data is
12630** generated for each candidate index (this is the default). Finally, if the
12631** value falls between 0 and 100, then it represents the percentage of user
12632** table rows that should be considered when generating sqlite_stat1 data.
12633**
12634** Examples:
12635**
12636** // Do not generate any sqlite_stat1 data
12637** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
12638**
12639** // Generate sqlite_stat1 data based on 10% of the rows in each table.
12640** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
12641*/
12642int sqlite3_expert_config(sqlite3expert *p, int op, ...);
12643
12644#define EXPERT_CONFIG_SAMPLE 1 /* int */
12645
12646/*
12647** Specify zero or more SQL statements to be included in the analysis.
12648**
12649** Buffer zSql must contain zero or more complete SQL statements. This
12650** function parses all statements contained in the buffer and adds them
12651** to the internal list of statements to analyze. If successful, SQLITE_OK
12652** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
12653** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
12654** may be set to point to an English language error message. In this case
12655** the caller is responsible for eventually freeing the error message buffer
12656** using sqlite3_free().
12657**
12658** If an error does occur while processing one of the statements in the
12659** buffer passed as the second argument, none of the statements in the
12660** buffer are added to the analysis.
12661**
12662** This function must be called before sqlite3_expert_analyze(). If a call
12663** to this function is made on an sqlite3expert object that has already
12664** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
12665** immediately and no statements are added to the analysis.
12666*/
12668 sqlite3expert *p, /* From a successful sqlite3_expert_new() */
12669 const char *zSql, /* SQL statement(s) to add */
12670 char **pzErr /* OUT: Error message (if any) */
12671);
12672
12673
12674/*
12675** This function is called after the sqlite3expert object has been configured
12676** with all SQL statements using sqlite3_expert_sql() to actually perform
12677** the analysis. Once this function has been called, it is not possible to
12678** add further SQL statements to the analysis.
12679**
12680** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
12681** an error occurs, an SQLite error code is returned and (*pzErr) set to
12682** point to a buffer containing an English language error message. In this
12683** case it is the responsibility of the caller to eventually free the buffer
12684** using sqlite3_free().
12685**
12686** If an error does occur within this function, the sqlite3expert object
12687** is no longer useful for any purpose. At that point it is no longer
12688** possible to add further SQL statements to the object or to re-attempt
12689** the analysis. The sqlite3expert object must still be freed using a call
12690** sqlite3_expert_destroy().
12691*/
12692int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
12693
12694/*
12695** Return the total number of statements loaded using sqlite3_expert_sql().
12696** The total number of SQL statements may be different from the total number
12697** to calls to sqlite3_expert_sql().
12698*/
12699int sqlite3_expert_count(sqlite3expert*);
12700
12701/*
12702** Return a component of the report.
12703**
12704** This function is called after sqlite3_expert_analyze() to extract the
12705** results of the analysis. Each call to this function returns either a
12706** NULL pointer or a pointer to a buffer containing a nul-terminated string.
12707** The value passed as the third argument must be one of the EXPERT_REPORT_*
12708** #define constants defined below.
12709**
12710** For some EXPERT_REPORT_* parameters, the buffer returned contains
12711** information relating to a specific SQL statement. In these cases that
12712** SQL statement is identified by the value passed as the second argument.
12713** SQL statements are numbered from 0 in the order in which they are parsed.
12714** If an out-of-range value (less than zero or equal to or greater than the
12715** value returned by sqlite3_expert_count()) is passed as the second argument
12716** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
12717**
12718** EXPERT_REPORT_SQL:
12719** Return the text of SQL statement iStmt.
12720**
12721** EXPERT_REPORT_INDEXES:
12722** Return a buffer containing the CREATE INDEX statements for all recommended
12723** indexes for statement iStmt. If there are no new recommeded indexes, NULL
12724** is returned.
12725**
12726** EXPERT_REPORT_PLAN:
12727** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
12728** iStmt after the proposed indexes have been added to the database schema.
12729**
12730** EXPERT_REPORT_CANDIDATES:
12731** Return a pointer to a buffer containing the CREATE INDEX statements
12732** for all indexes that were tested (for all SQL statements). The iStmt
12733** parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
12734*/
12735const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
12736
12737/*
12738** Values for the third argument passed to sqlite3_expert_report().
12739*/
12740#define EXPERT_REPORT_SQL 1
12741#define EXPERT_REPORT_INDEXES 2
12742#define EXPERT_REPORT_PLAN 3
12743#define EXPERT_REPORT_CANDIDATES 4
12744
12745/*
12746** Free an (sqlite3expert*) handle and all associated resources. There
12747** should be one call to this function for each successful call to
12748** sqlite3-expert_new().
12749*/
12750void sqlite3_expert_destroy(sqlite3expert*);
12751
12752#endif /* !defined(SQLITEEXPERT_H) */
12753
12754/************************* End ../ext/expert/sqlite3expert.h ********************/
12755/************************* Begin ../ext/expert/sqlite3expert.c ******************/
12756/*
12757** 2017 April 09
12758**
12759** The author disclaims copyright to this source code. In place of
12760** a legal notice, here is a blessing:
12761**
12762** May you do good and not evil.
12763** May you find forgiveness for yourself and forgive others.
12764** May you share freely, never taking more than you give.
12765**
12766*************************************************************************
12767*/
12768/* #include "sqlite3expert.h" */
12769#include <assert.h>
12770#include <string.h>
12771#include <stdio.h>
12772
12773#if !defined(SQLITE_AMALGAMATION)
12774#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
12775# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
12776#endif
12777#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
12778# define ALWAYS(X) (1)
12779# define NEVER(X) (0)
12780#elif !defined(NDEBUG)
12781# define ALWAYS(X) ((X)?1:(assert(0),0))
12782# define NEVER(X) ((X)?(assert(0),1):0)
12783#else
12784# define ALWAYS(X) (X)
12785# define NEVER(X) (X)
12786#endif
12787#endif /* !defined(SQLITE_AMALGAMATION) */
12788
12789
12790#ifndef SQLITE_OMIT_VIRTUALTABLE
12791
12792/* typedef sqlite3_int64 i64; */
12793/* typedef sqlite3_uint64 u64; */
12794
12795typedef struct IdxColumn IdxColumn;
12796typedef struct IdxConstraint IdxConstraint;
12797typedef struct IdxScan IdxScan;
12798typedef struct IdxStatement IdxStatement;
12799typedef struct IdxTable IdxTable;
12800typedef struct IdxWrite IdxWrite;
12801
12802#define STRLEN (int)strlen
12803
12804/*
12805** A temp table name that we assume no user database will actually use.
12806** If this assumption proves incorrect triggers on the table with the
12807** conflicting name will be ignored.
12808*/
12809#define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
12810
12811/*
12812** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
12813** any other type of single-ended range constraint on a column).
12814**
12815** pLink:
12816** Used to temporarily link IdxConstraint objects into lists while
12817** creating candidate indexes.
12818*/
12820 char *zColl; /* Collation sequence */
12821 int bRange; /* True for range, false for eq */
12822 int iCol; /* Constrained table column */
12823 int bFlag; /* Used by idxFindCompatible() */
12824 int bDesc; /* True if ORDER BY <expr> DESC */
12825 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */
12826 IdxConstraint *pLink; /* See above */
12827};
12828
12829/*
12830** A single scan of a single table.
12831*/
12832struct IdxScan {
12833 IdxTable *pTab; /* Associated table object */
12834 int iDb; /* Database containing table zTable */
12835 i64 covering; /* Mask of columns required for cov. index */
12836 IdxConstraint *pOrder; /* ORDER BY columns */
12837 IdxConstraint *pEq; /* List of == constraints */
12838 IdxConstraint *pRange; /* List of < constraints */
12839 IdxScan *pNextScan; /* Next IdxScan object for same analysis */
12840};
12841
12842/*
12843** Information regarding a single database table. Extracted from
12844** "PRAGMA table_info" by function idxGetTableInfo().
12845*/
12847 char *zName;
12848 char *zColl;
12849 int iPk;
12850};
12851struct IdxTable {
12852 int nCol;
12853 char *zName; /* Table name */
12854 IdxColumn *aCol;
12855 IdxTable *pNext; /* Next table in linked list of all tables */
12856};
12857
12858/*
12859** An object of the following type is created for each unique table/write-op
12860** seen. The objects are stored in a singly-linked list beginning at
12861** sqlite3expert.pWrite.
12862*/
12863struct IdxWrite {
12864 IdxTable *pTab;
12865 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */
12867};
12868
12869/*
12870** Each statement being analyzed is represented by an instance of this
12871** structure.
12872*/
12874 int iId; /* Statement number */
12875 char *zSql; /* SQL statement */
12876 char *zIdx; /* Indexes */
12877 char *zEQP; /* Plan */
12879};
12880
12881
12882/*
12883** A hash table for storing strings. With space for a payload string
12884** with each entry. Methods are:
12885**
12886** idxHashInit()
12887** idxHashClear()
12888** idxHashAdd()
12889** idxHashSearch()
12890*/
12891#define IDX_HASH_SIZE 1023
12892typedef struct IdxHashEntry IdxHashEntry;
12893typedef struct IdxHash IdxHash;
12895 char *zKey; /* nul-terminated key */
12896 char *zVal; /* nul-terminated value string */
12897 char *zVal2; /* nul-terminated value string 2 */
12898 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */
12899 IdxHashEntry *pNext; /* Next entry in hash */
12900};
12901struct IdxHash {
12902 IdxHashEntry *pFirst;
12903 IdxHashEntry *aHash[IDX_HASH_SIZE];
12904};
12905
12906/*
12907** sqlite3expert object.
12908*/
12910 int iSample; /* Percentage of tables to sample for stat1 */
12911 sqlite3 *db; /* User database */
12912 sqlite3 *dbm; /* In-memory db for this analysis */
12913 sqlite3 *dbv; /* Vtab schema for this analysis */
12914 IdxTable *pTable; /* List of all IdxTable objects */
12915 IdxScan *pScan; /* List of scan objects */
12916 IdxWrite *pWrite; /* List of write objects */
12917 IdxStatement *pStatement; /* List of IdxStatement objects */
12918 int bRun; /* True once analysis has run */
12919 char **pzErrmsg;
12920 int rc; /* Error code from whereinfo hook */
12921 IdxHash hIdx; /* Hash containing all candidate indexes */
12922 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */
12923};
12924
12925
12926/*
12927** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
12928** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
12929*/
12930static void *idxMalloc(int *pRc, int nByte){
12931 void *pRet;
12932 assert( *pRc==SQLITE_OK );
12933 assert( nByte>0 );
12934 pRet = sqlite3_malloc(nByte);
12935 if( pRet ){
12936 memset(pRet, 0, nByte);
12937 }else{
12938 *pRc = SQLITE_NOMEM;
12939 }
12940 return pRet;
12941}
12942
12943/*
12944** Initialize an IdxHash hash table.
12945*/
12946static void idxHashInit(IdxHash *pHash){
12947 memset(pHash, 0, sizeof(IdxHash));
12948}
12949
12950/*
12951** Reset an IdxHash hash table.
12952*/
12953static void idxHashClear(IdxHash *pHash){
12954 int i;
12955 for(i=0; i<IDX_HASH_SIZE; i++){
12956 IdxHashEntry *pEntry;
12957 IdxHashEntry *pNext;
12958 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
12959 pNext = pEntry->pHashNext;
12961 sqlite3_free(pEntry);
12962 }
12963 }
12964 memset(pHash, 0, sizeof(IdxHash));
12965}
12966
12967/*
12968** Return the index of the hash bucket that the string specified by the
12969** arguments to this function belongs.
12970*/
12971static int idxHashString(const char *z, int n){
12972 unsigned int ret = 0;
12973 int i;
12974 for(i=0; i<n; i++){
12975 ret += (ret<<3) + (unsigned char)(z[i]);
12976 }
12977 return (int)(ret % IDX_HASH_SIZE);
12978}
12979
12980/*
12981** If zKey is already present in the hash table, return non-zero and do
12982** nothing. Otherwise, add an entry with key zKey and payload string zVal to
12983** the hash table passed as the second argument.
12984*/
12985static int idxHashAdd(
12986 int *pRc,
12987 IdxHash *pHash,
12988 const char *zKey,
12989 const char *zVal
12990){
12991 int nKey = STRLEN(zKey);
12992 int iHash = idxHashString(zKey, nKey);
12993 int nVal = (zVal ? STRLEN(zVal) : 0);
12994 IdxHashEntry *pEntry;
12995 assert( iHash>=0 );
12996 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
12997 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
12998 return 1;
12999 }
13000 }
13001 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
13002 if( pEntry ){
13003 pEntry->zKey = (char*)&pEntry[1];
13004 memcpy(pEntry->zKey, zKey, nKey);
13005 if( zVal ){
13006 pEntry->zVal = &pEntry->zKey[nKey+1];
13007 memcpy(pEntry->zVal, zVal, nVal);
13008 }
13009 pEntry->pHashNext = pHash->aHash[iHash];
13010 pHash->aHash[iHash] = pEntry;
13011
13012 pEntry->pNext = pHash->pFirst;
13013 pHash->pFirst = pEntry;
13014 }
13015 return 0;
13016}
13017
13018/*
13019** If zKey/nKey is present in the hash table, return a pointer to the
13020** hash-entry object.
13021*/
13022static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
13023 int iHash;
13024 IdxHashEntry *pEntry;
13025 if( nKey<0 ) nKey = STRLEN(zKey);
13026 iHash = idxHashString(zKey, nKey);
13027 assert( iHash>=0 );
13028 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
13029 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
13030 return pEntry;
13031 }
13032 }
13033 return 0;
13034}
13035
13036/*
13037** If the hash table contains an entry with a key equal to the string
13038** passed as the final two arguments to this function, return a pointer
13039** to the payload string. Otherwise, if zKey/nKey is not present in the
13040** hash table, return NULL.
13041*/
13042static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
13043 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
13044 if( pEntry ) return pEntry->zVal;
13045 return 0;
13046}
13047
13048/*
13049** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
13050** variable to point to a copy of nul-terminated string zColl.
13051*/
13052static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
13053 IdxConstraint *pNew;
13054 int nColl = STRLEN(zColl);
13055
13056 assert( *pRc==SQLITE_OK );
13057 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
13058 if( pNew ){
13059 pNew->zColl = (char*)&pNew[1];
13060 memcpy(pNew->zColl, zColl, nColl+1);
13061 }
13062 return pNew;
13063}
13064
13065/*
13066** An error associated with database handle db has just occurred. Pass
13067** the error message to callback function xOut.
13068*/
13070 sqlite3 *db, /* Database handle */
13071 char **pzErrmsg /* Write error here */
13072){
13073 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
13074}
13075
13076/*
13077** Prepare an SQL statement.
13078*/
13080 sqlite3 *db, /* Database handle to compile against */
13081 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
13082 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
13083 const char *zSql /* SQL statement to compile */
13084){
13085 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
13086 if( rc!=SQLITE_OK ){
13087 *ppStmt = 0;
13088 idxDatabaseError(db, pzErrmsg);
13089 }
13090 return rc;
13091}
13092
13093/*
13094** Prepare an SQL statement using the results of a printf() formatting.
13095*/
13097 sqlite3 *db, /* Database handle to compile against */
13098 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
13099 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
13100 const char *zFmt, /* printf() format of SQL statement */
13101 ... /* Trailing printf() arguments */
13102){
13103 va_list ap;
13104 int rc;
13105 char *zSql;
13106 va_start(ap, zFmt);
13107 zSql = sqlite3_vmprintf(zFmt, ap);
13108 if( zSql==0 ){
13109 rc = SQLITE_NOMEM;
13110 }else{
13111 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
13112 sqlite3_free(zSql);
13113 }
13114 va_end(ap);
13115 return rc;
13116}
13117
13118
13119/*************************************************************************
13120** Beginning of virtual table implementation.
13121*/
13122typedef struct ExpertVtab ExpertVtab;
13124 sqlite3_vtab base;
13125 IdxTable *pTab;
13126 sqlite3expert *pExpert;
13127};
13128
13129typedef struct ExpertCsr ExpertCsr;
13131 sqlite3_vtab_cursor base;
13132 sqlite3_stmt *pData;
13133};
13134
13135static char *expertDequote(const char *zIn){
13136 int n = STRLEN(zIn);
13137 char *zRet = sqlite3_malloc(n);
13138
13139 assert( zIn[0]=='\'' );
13140 assert( zIn[n-1]=='\'' );
13141
13142 if( zRet ){
13143 int iOut = 0;
13144 int iIn = 0;
13145 for(iIn=1; iIn<(n-1); iIn++){
13146 if( zIn[iIn]=='\'' ){
13147 assert( zIn[iIn+1]=='\'' );
13148 iIn++;
13149 }
13150 zRet[iOut++] = zIn[iIn];
13151 }
13152 zRet[iOut] = '\0';
13153 }
13154
13155 return zRet;
13156}
13157
13158/*
13159** This function is the implementation of both the xConnect and xCreate
13160** methods of the r-tree virtual table.
13161**
13162** argv[0] -> module name
13163** argv[1] -> database name
13164** argv[2] -> table name
13165** argv[...] -> column names...
13166*/
13167static int expertConnect(
13168 sqlite3 *db,
13169 void *pAux,
13170 int argc, const char *const*argv,
13171 sqlite3_vtab **ppVtab,
13172 char **pzErr
13173){
13174 sqlite3expert *pExpert = (sqlite3expert*)pAux;
13175 ExpertVtab *p = 0;
13176 int rc;
13177
13178 if( argc!=4 ){
13179 *pzErr = sqlite3_mprintf("internal error!");
13180 rc = SQLITE_ERROR;
13181 }else{
13182 char *zCreateTable = expertDequote(argv[3]);
13183 if( zCreateTable ){
13184 rc = sqlite3_declare_vtab(db, zCreateTable);
13185 if( rc==SQLITE_OK ){
13186 p = idxMalloc(&rc, sizeof(ExpertVtab));
13187 }
13188 if( rc==SQLITE_OK ){
13189 p->pExpert = pExpert;
13190 p->pTab = pExpert->pTable;
13191 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
13192 }
13193 sqlite3_free(zCreateTable);
13194 }else{
13195 rc = SQLITE_NOMEM;
13196 }
13197 }
13198
13199 *ppVtab = (sqlite3_vtab*)p;
13200 return rc;
13201}
13202
13203static int expertDisconnect(sqlite3_vtab *pVtab){
13204 ExpertVtab *p = (ExpertVtab*)pVtab;
13206 return SQLITE_OK;
13207}
13208
13209static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
13210 ExpertVtab *p = (ExpertVtab*)pVtab;
13211 int rc = SQLITE_OK;
13212 int n = 0;
13213 IdxScan *pScan;
13214 const int opmask =
13218
13219 pScan = idxMalloc(&rc, sizeof(IdxScan));
13220 if( pScan ){
13221 int i;
13222
13223 /* Link the new scan object into the list */
13224 pScan->pTab = p->pTab;
13226 p->pExpert->pScan = pScan;
13227
13228 /* Add the constraints to the IdxScan object */
13229 for(i=0; i<pIdxInfo->nConstraint; i++){
13230 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
13231 if( pCons->usable
13232 && pCons->iColumn>=0
13233 && p->pTab->aCol[pCons->iColumn].iPk==0
13234 && (pCons->op & opmask)
13235 ){
13236 IdxConstraint *pNew;
13237 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
13238 pNew = idxNewConstraint(&rc, zColl);
13239 if( pNew ){
13240 pNew->iCol = pCons->iColumn;
13241 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
13242 pNew->pNext = pScan->pEq;
13243 pScan->pEq = pNew;
13244 }else{
13245 pNew->bRange = 1;
13246 pNew->pNext = pScan->pRange;
13247 pScan->pRange = pNew;
13248 }
13249 }
13250 n++;
13251 pIdxInfo->aConstraintUsage[i].argvIndex = n;
13252 }
13253 }
13254
13255 /* Add the ORDER BY to the IdxScan object */
13256 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
13257 int iCol = pIdxInfo->aOrderBy[i].iColumn;
13258 if( iCol>=0 ){
13259 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
13260 if( pNew ){
13261 pNew->iCol = iCol;
13262 pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
13263 pNew->pNext = pScan->pOrder;
13264 pNew->pLink = pScan->pOrder;
13265 pScan->pOrder = pNew;
13266 n++;
13267 }
13268 }
13269 }
13270 }
13271
13272 pIdxInfo->estimatedCost = 1000000.0 / (n+1);
13273 return rc;
13274}
13275
13276static int expertUpdate(
13277 sqlite3_vtab *pVtab,
13278 int nData,
13279 sqlite3_value **azData,
13280 sqlite_int64 *pRowid
13281){
13282 (void)pVtab;
13283 (void)nData;
13284 (void)azData;
13285 (void)pRowid;
13286 return SQLITE_OK;
13287}
13288
13289/*
13290** Virtual table module xOpen method.
13291*/
13292static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
13293 int rc = SQLITE_OK;
13294 ExpertCsr *pCsr;
13295 (void)pVTab;
13296 pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
13297 *ppCursor = (sqlite3_vtab_cursor*)pCsr;
13298 return rc;
13299}
13300
13301/*
13302** Virtual table module xClose method.
13303*/
13304static int expertClose(sqlite3_vtab_cursor *cur){
13305 ExpertCsr *pCsr = (ExpertCsr*)cur;
13307 sqlite3_free(pCsr);
13308 return SQLITE_OK;
13309}
13310
13311/*
13312** Virtual table module xEof method.
13313**
13314** Return non-zero if the cursor does not currently point to a valid
13315** record (i.e if the scan has finished), or zero otherwise.
13316*/
13317static int expertEof(sqlite3_vtab_cursor *cur){
13318 ExpertCsr *pCsr = (ExpertCsr*)cur;
13319 return pCsr->pData==0;
13320}
13321
13322/*
13323** Virtual table module xNext method.
13324*/
13325static int expertNext(sqlite3_vtab_cursor *cur){
13326 ExpertCsr *pCsr = (ExpertCsr*)cur;
13327 int rc = SQLITE_OK;
13328
13329 assert( pCsr->pData );
13330 rc = sqlite3_step(pCsr->pData);
13331 if( rc!=SQLITE_ROW ){
13333 pCsr->pData = 0;
13334 }else{
13335 rc = SQLITE_OK;
13336 }
13337
13338 return rc;
13339}
13340
13341/*
13342** Virtual table module xRowid method.
13343*/
13344static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
13345 (void)cur;
13346 *pRowid = 0;
13347 return SQLITE_OK;
13348}
13349
13350/*
13351** Virtual table module xColumn method.
13352*/
13353static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
13354 ExpertCsr *pCsr = (ExpertCsr*)cur;
13355 sqlite3_value *pVal;
13356 pVal = sqlite3_column_value(pCsr->pData, i);
13357 if( pVal ){
13359 }
13360 return SQLITE_OK;
13361}
13362
13363/*
13364** Virtual table module xFilter method.
13365*/
13366static int expertFilter(
13367 sqlite3_vtab_cursor *cur,
13368 int idxNum, const char *idxStr,
13369 int argc, sqlite3_value **argv
13370){
13371 ExpertCsr *pCsr = (ExpertCsr*)cur;
13372 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
13373 sqlite3expert *pExpert = pVtab->pExpert;
13374 int rc;
13375
13376 (void)idxNum;
13377 (void)idxStr;
13378 (void)argc;
13379 (void)argv;
13381 pCsr->pData = 0;
13382 if( rc==SQLITE_OK ){
13384 "SELECT * FROM main.%Q WHERE sqlite_expert_sample()", pVtab->pTab->zName
13385 );
13386 }
13387
13388 if( rc==SQLITE_OK ){
13389 rc = expertNext(cur);
13390 }
13391 return rc;
13392}
13393
13394static int idxRegisterVtab(sqlite3expert *p){
13395 static sqlite3_module expertModule = {
13396 2, /* iVersion */
13397 expertConnect, /* xCreate - create a table */
13398 expertConnect, /* xConnect - connect to an existing table */
13399 expertBestIndex, /* xBestIndex - Determine search strategy */
13400 expertDisconnect, /* xDisconnect - Disconnect from a table */
13401 expertDisconnect, /* xDestroy - Drop a table */
13402 expertOpen, /* xOpen - open a cursor */
13403 expertClose, /* xClose - close a cursor */
13404 expertFilter, /* xFilter - configure scan constraints */
13405 expertNext, /* xNext - advance a cursor */
13406 expertEof, /* xEof */
13407 expertColumn, /* xColumn - read data */
13408 expertRowid, /* xRowid - read data */
13409 expertUpdate, /* xUpdate - write data */
13410 0, /* xBegin - begin transaction */
13411 0, /* xSync - sync transaction */
13412 0, /* xCommit - commit transaction */
13413 0, /* xRollback - rollback transaction */
13414 0, /* xFindFunction - function overloading */
13415 0, /* xRename - rename the table */
13416 0, /* xSavepoint */
13417 0, /* xRelease */
13418 0, /* xRollbackTo */
13419 0, /* xShadowName */
13420 0, /* xIntegrity */
13421 };
13422
13423 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
13424}
13425/*
13426** End of virtual table implementation.
13427*************************************************************************/
13428/*
13429** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
13430** is called, set it to the return value of sqlite3_finalize() before
13431** returning. Otherwise, discard the sqlite3_finalize() return value.
13432*/
13433static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
13434 int rc = sqlite3_finalize(pStmt);
13435 if( *pRc==SQLITE_OK ) *pRc = rc;
13436}
13437
13438/*
13439** Attempt to allocate an IdxTable structure corresponding to table zTab
13440** in the main database of connection db. If successful, set (*ppOut) to
13441** point to the new object and return SQLITE_OK. Otherwise, return an
13442** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
13443** set to point to an error string.
13444**
13445** It is the responsibility of the caller to eventually free either the
13446** IdxTable object or error message using sqlite3_free().
13447*/
13449 sqlite3 *db, /* Database connection to read details from */
13450 const char *zTab, /* Table name */
13451 IdxTable **ppOut, /* OUT: New object (if successful) */
13452 char **pzErrmsg /* OUT: Error message (if not) */
13453){
13454 sqlite3_stmt *p1 = 0;
13455 int nCol = 0;
13456 int nTab;
13457 int nByte;
13458 IdxTable *pNew = 0;
13459 int rc, rc2;
13460 char *pCsr = 0;
13461 int nPk = 0;
13462
13463 *ppOut = 0;
13464 if( zTab==0 ) return SQLITE_ERROR;
13465 nTab = STRLEN(zTab);
13466 nByte = sizeof(IdxTable) + nTab + 1;
13467 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
13468 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
13469 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
13470 const char *zColSeq = 0;
13471 if( zCol==0 ){
13472 rc = SQLITE_ERROR;
13473 break;
13474 }
13475 nByte += 1 + STRLEN(zCol);
13477 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
13478 );
13479 if( zColSeq==0 ) zColSeq = "binary";
13480 nByte += 1 + STRLEN(zColSeq);
13481 nCol++;
13482 nPk += (sqlite3_column_int(p1, 5)>0);
13483 }
13484 rc2 = sqlite3_reset(p1);
13485 if( rc==SQLITE_OK ) rc = rc2;
13486
13487 nByte += sizeof(IdxColumn) * nCol;
13488 if( rc==SQLITE_OK ){
13489 pNew = idxMalloc(&rc, nByte);
13490 }
13491 if( rc==SQLITE_OK ){
13492 pNew->aCol = (IdxColumn*)&pNew[1];
13493 pNew->nCol = nCol;
13494 pCsr = (char*)&pNew->aCol[nCol];
13495 }
13496
13497 nCol = 0;
13498 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
13499 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
13500 const char *zColSeq = 0;
13501 int nCopy;
13502 if( zCol==0 ) continue;
13503 nCopy = STRLEN(zCol) + 1;
13504 pNew->aCol[nCol].zName = pCsr;
13505 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
13506 memcpy(pCsr, zCol, nCopy);
13507 pCsr += nCopy;
13508
13510 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
13511 );
13512 if( rc==SQLITE_OK ){
13513 if( zColSeq==0 ) zColSeq = "binary";
13514 nCopy = STRLEN(zColSeq) + 1;
13515 pNew->aCol[nCol].zColl = pCsr;
13516 memcpy(pCsr, zColSeq, nCopy);
13517 pCsr += nCopy;
13518 }
13519
13520 nCol++;
13521 }
13522 idxFinalize(&rc, p1);
13523
13524 if( rc!=SQLITE_OK ){
13525 sqlite3_free(pNew);
13526 pNew = 0;
13527 }else if( ALWAYS(pNew!=0) ){
13528 pNew->zName = pCsr;
13529 if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
13530 }
13531
13532 *ppOut = pNew;
13533 return rc;
13534}
13535
13536/*
13537** This function is a no-op if *pRc is set to anything other than
13538** SQLITE_OK when it is called.
13539**
13540** If *pRc is initially set to SQLITE_OK, then the text specified by
13541** the printf() style arguments is appended to zIn and the result returned
13542** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
13543** zIn before returning.
13544*/
13545static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
13546 va_list ap;
13547 char *zAppend = 0;
13548 char *zRet = 0;
13549 int nIn = zIn ? STRLEN(zIn) : 0;
13550 int nAppend = 0;
13551 va_start(ap, zFmt);
13552 if( *pRc==SQLITE_OK ){
13553 zAppend = sqlite3_vmprintf(zFmt, ap);
13554 if( zAppend ){
13555 nAppend = STRLEN(zAppend);
13556 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
13557 }
13558 if( zAppend && zRet ){
13559 if( nIn ) memcpy(zRet, zIn, nIn);
13560 memcpy(&zRet[nIn], zAppend, nAppend+1);
13561 }else{
13562 sqlite3_free(zRet);
13563 zRet = 0;
13564 *pRc = SQLITE_NOMEM;
13565 }
13566 sqlite3_free(zAppend);
13567 sqlite3_free(zIn);
13568 }
13569 va_end(ap);
13570 return zRet;
13571}
13572
13573/*
13574** Return true if zId must be quoted in order to use it as an SQL
13575** identifier, or false otherwise.
13576*/
13577static int idxIdentifierRequiresQuotes(const char *zId){
13578 int i;
13579 int nId = STRLEN(zId);
13580
13581 if( sqlite3_keyword_check(zId, nId) ) return 1;
13582
13583 for(i=0; zId[i]; i++){
13584 if( !(zId[i]=='_')
13585 && !(zId[i]>='0' && zId[i]<='9')
13586 && !(zId[i]>='a' && zId[i]<='z')
13587 && !(zId[i]>='A' && zId[i]<='Z')
13588 ){
13589 return 1;
13590 }
13591 }
13592 return 0;
13593}
13594
13595/*
13596** This function appends an index column definition suitable for constraint
13597** pCons to the string passed as zIn and returns the result.
13598*/
13599static char *idxAppendColDefn(
13600 int *pRc, /* IN/OUT: Error code */
13601 char *zIn, /* Column defn accumulated so far */
13602 IdxTable *pTab, /* Table index will be created on */
13603 IdxConstraint *pCons
13604){
13605 char *zRet = zIn;
13606 IdxColumn *p = &pTab->aCol[pCons->iCol];
13607 if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
13608
13610 zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
13611 }else{
13612 zRet = idxAppendText(pRc, zRet, "%s", p->zName);
13613 }
13614
13617 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
13618 }else{
13619 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
13620 }
13621 }
13622
13623 if( pCons->bDesc ){
13624 zRet = idxAppendText(pRc, zRet, " DESC");
13625 }
13626 return zRet;
13627}
13628
13629/*
13630** Search database dbm for an index compatible with the one idxCreateFromCons()
13631** would create from arguments pScan, pEq and pTail. If no error occurs and
13632** such an index is found, return non-zero. Or, if no such index is found,
13633** return zero.
13634**
13635** If an error occurs, set *pRc to an SQLite error code and return zero.
13636*/
13638 int *pRc, /* OUT: Error code */
13639 sqlite3* dbm, /* Database to search */
13640 IdxScan *pScan, /* Scan for table to search for index on */
13641 IdxConstraint *pEq, /* List of == constraints */
13642 IdxConstraint *pTail /* List of range constraints */
13643){
13644 const char *zTbl = pScan->pTab->zName;
13645 sqlite3_stmt *pIdxList = 0;
13646 IdxConstraint *pIter;
13647 int nEq = 0; /* Number of elements in pEq */
13648 int rc;
13649
13650 /* Count the elements in list pEq */
13651 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
13652
13653 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
13654 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
13655 int bMatch = 1;
13656 IdxConstraint *pT = pTail;
13657 sqlite3_stmt *pInfo = 0;
13658 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
13659 if( zIdx==0 ) continue;
13660
13661 /* Zero the IdxConstraint.bFlag values in the pEq list */
13662 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
13663
13664 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
13665 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
13666 int iIdx = sqlite3_column_int(pInfo, 0);
13667 int iCol = sqlite3_column_int(pInfo, 1);
13668 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
13669
13670 if( iIdx<nEq ){
13671 for(pIter=pEq; pIter; pIter=pIter->pLink){
13672 if( pIter->bFlag ) continue;
13673 if( pIter->iCol!=iCol ) continue;
13674 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
13675 pIter->bFlag = 1;
13676 break;
13677 }
13678 if( pIter==0 ){
13679 bMatch = 0;
13680 break;
13681 }
13682 }else{
13683 if( pT ){
13684 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
13685 bMatch = 0;
13686 break;
13687 }
13688 pT = pT->pLink;
13689 }
13690 }
13691 }
13692 idxFinalize(&rc, pInfo);
13693
13694 if( rc==SQLITE_OK && bMatch ){
13695 sqlite3_finalize(pIdxList);
13696 return 1;
13697 }
13698 }
13699 idxFinalize(&rc, pIdxList);
13700
13701 *pRc = rc;
13702 return 0;
13703}
13704
13705/* Callback for sqlite3_exec() with query with leading count(*) column.
13706 * The first argument is expected to be an int*, referent to be incremented
13707 * if that leading column is not exactly '0'.
13708 */
13709static int countNonzeros(void* pCount, int nc,
13710 char* azResults[], char* azColumns[]){
13711 (void)azColumns; /* Suppress unused parameter warning */
13712 if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
13713 *((int *)pCount) += 1;
13714 }
13715 return 0;
13716}
13717
13719 sqlite3expert *p,
13720 IdxScan *pScan,
13721 IdxConstraint *pEq,
13722 IdxConstraint *pTail
13723){
13724 sqlite3 *dbm = p->dbm;
13725 int rc = SQLITE_OK;
13726 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
13727 IdxTable *pTab = pScan->pTab;
13728 char *zCols = 0;
13729 char *zIdx = 0;
13730 IdxConstraint *pCons;
13731 unsigned int h = 0;
13732 const char *zFmt;
13733
13734 for(pCons=pEq; pCons; pCons=pCons->pLink){
13735 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
13736 }
13737 for(pCons=pTail; pCons; pCons=pCons->pLink){
13738 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
13739 }
13740
13741 if( rc==SQLITE_OK ){
13742 /* Hash the list of columns to come up with a name for the index */
13743 const char *zTable = pScan->pTab->zName;
13744 int quoteTable = idxIdentifierRequiresQuotes(zTable);
13745 char *zName = 0; /* Index name */
13746 int collisions = 0;
13747 do{
13748 int i;
13749 char *zFind;
13750 for(i=0; zCols[i]; i++){
13751 h += ((h<<3) + zCols[i]);
13752 }
13753 sqlite3_free(zName);
13754 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
13755 if( zName==0 ) break;
13756 /* Is is unique among table, view and index names? */
13757 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
13758 " AND type in ('index','table','view')";
13759 zFind = sqlite3_mprintf(zFmt, zName);
13760 i = 0;
13761 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
13762 assert(rc==SQLITE_OK);
13763 sqlite3_free(zFind);
13764 if( i==0 ){
13765 collisions = 0;
13766 break;
13767 }
13768 ++collisions;
13769 }while( collisions<50 && zName!=0 );
13770 if( collisions ){
13771 /* This return means "Gave up trying to find a unique index name." */
13773 }else if( zName==0 ){
13774 rc = SQLITE_NOMEM;
13775 }else{
13776 if( quoteTable ){
13777 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
13778 }else{
13779 zFmt = "CREATE INDEX %s ON %s(%s)";
13780 }
13781 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
13782 if( !zIdx ){
13783 rc = SQLITE_NOMEM;
13784 }else{
13785 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
13786 if( rc!=SQLITE_OK ){
13788 }else{
13789 idxHashAdd(&rc, &p->hIdx, zName, zIdx);
13790 }
13791 }
13792 sqlite3_free(zName);
13793 sqlite3_free(zIdx);
13794 }
13795 }
13796
13797 sqlite3_free(zCols);
13798 }
13799 return rc;
13800}
13801
13802/*
13803** Return true if list pList (linked by IdxConstraint.pLink) contains
13804** a constraint compatible with *p. Otherwise return false.
13805*/
13806static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
13807 IdxConstraint *pCmp;
13808 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
13809 if( p->iCol==pCmp->iCol ) return 1;
13810 }
13811 return 0;
13812}
13813
13815 sqlite3expert *p,
13816 IdxScan *pScan, /* Create indexes for this scan */
13817 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */
13818){
13819 IdxConstraint *p1 = 0;
13820 IdxConstraint *pCon;
13821 int rc;
13822
13823 /* Gather up all the == constraints. */
13824 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
13825 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
13826 pCon->pLink = p1;
13827 p1 = pCon;
13828 }
13829 }
13830
13831 /* Create an index using the == constraints collected above. And the
13832 ** range constraint/ORDER BY terms passed in by the caller, if any. */
13833 rc = idxCreateFromCons(p, pScan, p1, pTail);
13834
13835 /* If no range/ORDER BY passed by the caller, create a version of the
13836 ** index for each range constraint. */
13837 if( pTail==0 ){
13838 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
13839 assert( pCon->pLink==0 );
13840 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
13841 rc = idxCreateFromCons(p, pScan, p1, pCon);
13842 }
13843 }
13844 }
13845
13846 return rc;
13847}
13848
13849/*
13850** Create candidate indexes in database [dbm] based on the data in
13851** linked-list pScan.
13852*/
13853static int idxCreateCandidates(sqlite3expert *p){
13854 int rc = SQLITE_OK;
13855 IdxScan *pIter;
13856
13857 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
13858 rc = idxCreateFromWhere(p, pIter, 0);
13859 if( rc==SQLITE_OK && pIter->pOrder ){
13860 rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
13861 }
13862 }
13863
13864 return rc;
13865}
13866
13867/*
13868** Free all elements of the linked list starting at pConstraint.
13869*/
13870static void idxConstraintFree(IdxConstraint *pConstraint){
13871 IdxConstraint *pNext;
13872 IdxConstraint *p;
13873
13874 for(p=pConstraint; p; p=pNext){
13875 pNext = p->pNext;
13877 }
13878}
13879
13880/*
13881** Free all elements of the linked list starting from pScan up until pLast
13882** (pLast is not freed).
13883*/
13884static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
13885 IdxScan *p;
13886 IdxScan *pNext;
13887 for(p=pScan; p!=pLast; p=pNext){
13888 pNext = p->pNextScan;
13893 }
13894}
13895
13896/*
13897** Free all elements of the linked list starting from pStatement up
13898** until pLast (pLast is not freed).
13899*/
13900static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
13901 IdxStatement *p;
13902 IdxStatement *pNext;
13903 for(p=pStatement; p!=pLast; p=pNext){
13904 pNext = p->pNext;
13908 }
13909}
13910
13911/*
13912** Free the linked list of IdxTable objects starting at pTab.
13913*/
13914static void idxTableFree(IdxTable *pTab){
13915 IdxTable *pIter;
13916 IdxTable *pNext;
13917 for(pIter=pTab; pIter; pIter=pNext){
13918 pNext = pIter->pNext;
13919 sqlite3_free(pIter);
13920 }
13921}
13922
13923/*
13924** Free the linked list of IdxWrite objects starting at pTab.
13925*/
13926static void idxWriteFree(IdxWrite *pTab){
13927 IdxWrite *pIter;
13928 IdxWrite *pNext;
13929 for(pIter=pTab; pIter; pIter=pNext){
13930 pNext = pIter->pNext;
13931 sqlite3_free(pIter);
13932 }
13933}
13934
13935
13936
13937/*
13938** This function is called after candidate indexes have been created. It
13939** runs all the queries to see which indexes they prefer, and populates
13940** IdxStatement.zIdx and IdxStatement.zEQP with the results.
13941*/
13943 sqlite3expert *p,
13944 char **pzErr /* OUT: Error message (sqlite3_malloc) */
13945){
13946 IdxStatement *pStmt;
13947 sqlite3 *dbm = p->dbm;
13948 int rc = SQLITE_OK;
13949
13950 IdxHash hIdx;
13951 idxHashInit(&hIdx);
13952
13953 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
13954 IdxHashEntry *pEntry;
13955 sqlite3_stmt *pExplain = 0;
13956 idxHashClear(&hIdx);
13957 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
13958 "EXPLAIN QUERY PLAN %s", pStmt->zSql
13959 );
13960 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
13961 /* int iId = sqlite3_column_int(pExplain, 0); */
13962 /* int iParent = sqlite3_column_int(pExplain, 1); */
13963 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
13964 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
13965 int nDetail;
13966 int i;
13967
13968 if( !zDetail ) continue;
13969 nDetail = STRLEN(zDetail);
13970
13971 for(i=0; i<nDetail; i++){
13972 const char *zIdx = 0;
13973 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
13974 zIdx = &zDetail[i+13];
13975 }else if( i+22<nDetail
13976 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
13977 ){
13978 zIdx = &zDetail[i+22];
13979 }
13980 if( zIdx ){
13981 const char *zSql;
13982 int nIdx = 0;
13983 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
13984 nIdx++;
13985 }
13986 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
13987 if( zSql ){
13988 idxHashAdd(&rc, &hIdx, zSql, 0);
13989 if( rc ) goto find_indexes_out;
13990 }
13991 break;
13992 }
13993 }
13994
13995 if( zDetail[0]!='-' ){
13996 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
13997 }
13998 }
13999
14000 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
14001 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
14002 }
14003
14004 idxFinalize(&rc, pExplain);
14005 }
14006
14007 find_indexes_out:
14008 idxHashClear(&hIdx);
14009 return rc;
14010}
14011
14013 void *pCtx,
14014 int eOp,
14015 const char *z3,
14016 const char *z4,
14017 const char *zDb,
14018 const char *zTrigger
14019){
14020 int rc = SQLITE_OK;
14021 (void)z4;
14022 (void)zTrigger;
14023 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
14024 if( sqlite3_stricmp(zDb, "main")==0 ){
14025 sqlite3expert *p = (sqlite3expert*)pCtx;
14026 IdxTable *pTab;
14027 for(pTab=p->pTable; pTab; pTab=pTab->pNext){
14028 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
14029 }
14030 if( pTab ){
14031 IdxWrite *pWrite;
14032 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
14033 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
14034 }
14035 if( pWrite==0 ){
14036 pWrite = idxMalloc(&rc, sizeof(IdxWrite));
14037 if( rc==SQLITE_OK ){
14038 pWrite->pTab = pTab;
14039 pWrite->eOp = eOp;
14040 pWrite->pNext = p->pWrite;
14041 p->pWrite = pWrite;
14042 }
14043 }
14044 }
14045 }
14046 }
14047 return rc;
14048}
14049
14051 sqlite3expert *p,
14052 IdxWrite *pWrite,
14053 char **pzErr
14054){
14055 static const char *zInt = UNIQUE_TABLE_NAME;
14056 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
14057 IdxTable *pTab = pWrite->pTab;
14058 const char *zTab = pTab->zName;
14059 const char *zSql =
14060 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
14061 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
14062 "ORDER BY type;";
14063 sqlite3_stmt *pSelect = 0;
14064 int rc = SQLITE_OK;
14065 char *zWrite = 0;
14066
14067 /* Create the table and its triggers in the temp schema */
14068 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
14069 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
14070 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
14071 if( zCreate==0 ) continue;
14072 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
14073 }
14074 idxFinalize(&rc, pSelect);
14075
14076 /* Rename the table in the temp schema to zInt */
14077 if( rc==SQLITE_OK ){
14078 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
14079 if( z==0 ){
14080 rc = SQLITE_NOMEM;
14081 }else{
14082 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
14084 }
14085 }
14086
14087 switch( pWrite->eOp ){
14088 case SQLITE_INSERT: {
14089 int i;
14090 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
14091 for(i=0; i<pTab->nCol; i++){
14092 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
14093 }
14094 zWrite = idxAppendText(&rc, zWrite, ")");
14095 break;
14096 }
14097 case SQLITE_UPDATE: {
14098 int i;
14099 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
14100 for(i=0; i<pTab->nCol; i++){
14101 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
14102 pTab->aCol[i].zName
14103 );
14104 }
14105 break;
14106 }
14107 default: {
14108 assert( pWrite->eOp==SQLITE_DELETE );
14109 if( rc==SQLITE_OK ){
14110 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
14111 if( zWrite==0 ) rc = SQLITE_NOMEM;
14112 }
14113 }
14114 }
14115
14116 if( rc==SQLITE_OK ){
14117 sqlite3_stmt *pX = 0;
14118 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
14119 idxFinalize(&rc, pX);
14120 if( rc!=SQLITE_OK ){
14122 }
14123 }
14124 sqlite3_free(zWrite);
14125
14126 if( rc==SQLITE_OK ){
14127 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
14128 }
14129
14130 return rc;
14131}
14132
14133static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
14134 int rc = SQLITE_OK;
14135 IdxWrite *pEnd = 0;
14136 IdxWrite *pFirst = p->pWrite;
14137
14138 while( rc==SQLITE_OK && pFirst!=pEnd ){
14139 IdxWrite *pIter;
14140 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
14141 rc = idxProcessOneTrigger(p, pIter, pzErr);
14142 }
14143 pEnd = pFirst;
14144 pFirst = p->pWrite;
14145 }
14146
14147 return rc;
14148}
14149
14150/*
14151** This function tests if the schema of the main database of database handle
14152** db contains an object named zTab. Assuming no error occurs, output parameter
14153** (*pbContains) is set to true if zTab exists, or false if it does not.
14154**
14155** Or, if an error occurs, an SQLite error code is returned. The final value
14156** of (*pbContains) is undefined in this case.
14157*/
14159 sqlite3 *db,
14160 const char *zTab,
14161 int *pbContains /* OUT: True if object exists */
14162){
14163 const char *zSql = "SELECT 1 FROM sqlite_schema WHERE name = ?";
14164 sqlite3_stmt *pSql = 0;
14165 int rc = SQLITE_OK;
14166 int ret = 0;
14167
14168 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
14169 if( rc==SQLITE_OK ){
14171 if( SQLITE_ROW==sqlite3_step(pSql) ){
14172 ret = 1;
14173 }
14174 rc = sqlite3_finalize(pSql);
14175 }
14176
14177 *pbContains = ret;
14178 return rc;
14179}
14180
14181/*
14182** Execute SQL command zSql using database handle db. If no error occurs,
14183** set (*pzErr) to NULL and return SQLITE_OK.
14184**
14185** If an error does occur, return an SQLite error code and set (*pzErr) to
14186** point to a buffer containing an English language error message. Except,
14187** if the error message begins with "no such module:", then ignore the
14188** error and return as if the SQL statement had succeeded.
14189**
14190** This is used to copy as much of the database schema as possible while
14191** ignoring any errors related to missing virtual table modules.
14192*/
14193static int expertSchemaSql(sqlite3 *db, const char *zSql, char **pzErr){
14194 int rc = SQLITE_OK;
14195 char *zErr = 0;
14196
14197 rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
14198 if( rc!=SQLITE_OK && zErr ){
14199 int nErr = STRLEN(zErr);
14200 if( nErr>=15 && memcmp(zErr, "no such module:", 15)==0 ){
14201 sqlite3_free(zErr);
14202 rc = SQLITE_OK;
14203 zErr = 0;
14204 }
14205 }
14206
14207 *pzErr = zErr;
14208 return rc;
14209}
14210
14211static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
14212 int rc = idxRegisterVtab(p);
14213 sqlite3_stmt *pSchema = 0;
14214
14215 /* For each table in the main db schema:
14216 **
14217 ** 1) Add an entry to the p->pTable list, and
14218 ** 2) Create the equivalent virtual table in dbv.
14219 */
14220 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
14221 "SELECT type, name, sql, 1, "
14222 " substr(sql,1,14)=='create virtual' COLLATE nocase "
14223 "FROM sqlite_schema "
14224 "WHERE type IN ('table','view') AND "
14225 " substr(name,1,7)!='sqlite_' COLLATE nocase "
14226 " UNION ALL "
14227 "SELECT type, name, sql, 2, 0 FROM sqlite_schema "
14228 "WHERE type = 'trigger'"
14229 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
14230 "ORDER BY 4, 5 DESC, 1"
14231 );
14232 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
14233 const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
14234 const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
14235 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
14236 int bVirtual = sqlite3_column_int(pSchema, 4);
14237 int bExists = 0;
14238
14239 if( zType==0 || zName==0 ) continue;
14240 rc = expertDbContainsObject(p->dbv, zName, &bExists);
14241 if( rc || bExists ) continue;
14242
14243 if( zType[0]=='v' || zType[1]=='r' || bVirtual ){
14244 /* A view. Or a trigger on a view. */
14245 if( zSql ) rc = expertSchemaSql(p->dbv, zSql, pzErrmsg);
14246 }else{
14247 IdxTable *pTab;
14248 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
14249 if( rc==SQLITE_OK && ALWAYS(pTab!=0) ){
14250 int i;
14251 char *zInner = 0;
14252 char *zOuter = 0;
14253 pTab->pNext = p->pTable;
14254 p->pTable = pTab;
14255
14256 /* The statement the vtab will pass to sqlite3_declare_vtab() */
14257 zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
14258 for(i=0; i<pTab->nCol; i++){
14259 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
14260 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
14261 );
14262 }
14263 zInner = idxAppendText(&rc, zInner, ")");
14264
14265 /* The CVT statement to create the vtab */
14266 zOuter = idxAppendText(&rc, 0,
14267 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
14268 );
14269 if( rc==SQLITE_OK ){
14270 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
14271 }
14272 sqlite3_free(zInner);
14273 sqlite3_free(zOuter);
14274 }
14275 }
14276 }
14277 idxFinalize(&rc, pSchema);
14278 return rc;
14279}
14280
14283 double target; /* Target nRet/nRow value */
14284 double nRow; /* Number of rows seen */
14285 double nRet; /* Number of rows returned */
14286};
14287
14288static void idxSampleFunc(
14289 sqlite3_context *pCtx,
14290 int argc,
14291 sqlite3_value **argv
14292){
14293 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
14294 int bRet;
14295
14296 (void)argv;
14297 assert( argc==0 );
14298 if( p->nRow==0.0 ){
14299 bRet = 1;
14300 }else{
14301 bRet = (p->nRet / p->nRow) <= p->target;
14302 if( bRet==0 ){
14303 unsigned short rnd;
14304 sqlite3_randomness(2, (void*)&rnd);
14305 bRet = ((int)rnd % 100) <= p->iTarget;
14306 }
14307 }
14308
14309 sqlite3_result_int(pCtx, bRet);
14310 p->nRow += 1.0;
14311 p->nRet += (double)bRet;
14312}
14313
14316 struct IdxRemSlot {
14317 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
14318 i64 iVal; /* SQLITE_INTEGER value */
14319 double rVal; /* SQLITE_FLOAT value */
14320 int nByte; /* Bytes of space allocated at z */
14321 int n; /* Size of buffer z */
14322 char *z; /* SQLITE_TEXT/BLOB value */
14323 } aSlot[1];
14324};
14325
14326/*
14327** Implementation of scalar function sqlite_expert_rem().
14328*/
14329static void idxRemFunc(
14330 sqlite3_context *pCtx,
14331 int argc,
14332 sqlite3_value **argv
14333){
14334 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
14335 struct IdxRemSlot *pSlot;
14336 int iSlot;
14337 assert( argc==2 );
14338
14339 iSlot = sqlite3_value_int(argv[0]);
14340 assert( iSlot<p->nSlot );
14341 pSlot = &p->aSlot[iSlot];
14342
14343 switch( pSlot->eType ){
14344 case SQLITE_NULL:
14345 /* no-op */
14346 break;
14347
14348 case SQLITE_INTEGER:
14349 sqlite3_result_int64(pCtx, pSlot->iVal);
14350 break;
14351
14352 case SQLITE_FLOAT:
14353 sqlite3_result_double(pCtx, pSlot->rVal);
14354 break;
14355
14356 case SQLITE_BLOB:
14357 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
14358 break;
14359
14360 case SQLITE_TEXT:
14361 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
14362 break;
14363 }
14364
14365 pSlot->eType = sqlite3_value_type(argv[1]);
14366 switch( pSlot->eType ){
14367 case SQLITE_NULL:
14368 /* no-op */
14369 break;
14370
14371 case SQLITE_INTEGER:
14372 pSlot->iVal = sqlite3_value_int64(argv[1]);
14373 break;
14374
14375 case SQLITE_FLOAT:
14376 pSlot->rVal = sqlite3_value_double(argv[1]);
14377 break;
14378
14379 case SQLITE_BLOB:
14380 case SQLITE_TEXT: {
14381 int nByte = sqlite3_value_bytes(argv[1]);
14382 const void *pData = 0;
14383 if( nByte>pSlot->nByte ){
14384 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
14385 if( zNew==0 ){
14387 return;
14388 }
14389 pSlot->nByte = nByte*2;
14390 pSlot->z = zNew;
14391 }
14392 pSlot->n = nByte;
14393 if( pSlot->eType==SQLITE_BLOB ){
14394 pData = sqlite3_value_blob(argv[1]);
14395 if( pData ) memcpy(pSlot->z, pData, nByte);
14396 }else{
14397 pData = sqlite3_value_text(argv[1]);
14398 memcpy(pSlot->z, pData, nByte);
14399 }
14400 break;
14401 }
14402 }
14403}
14404
14405static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
14406 int rc = SQLITE_OK;
14407 const char *zMax =
14408 "SELECT max(i.seqno) FROM "
14409 " sqlite_schema AS s, "
14410 " pragma_index_list(s.name) AS l, "
14411 " pragma_index_info(l.name) AS i "
14412 "WHERE s.type = 'table'";
14413 sqlite3_stmt *pMax = 0;
14414
14415 *pnMax = 0;
14416 rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
14417 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
14418 *pnMax = sqlite3_column_int(pMax, 0) + 1;
14419 }
14420 idxFinalize(&rc, pMax);
14421
14422 return rc;
14423}
14424
14426 sqlite3expert *p,
14427 sqlite3_stmt *pIndexXInfo,
14428 sqlite3_stmt *pWriteStat,
14429 const char *zTab,
14430 const char *zIdx,
14431 char **pzErr
14432){
14433 char *zCols = 0;
14434 char *zOrder = 0;
14435 char *zQuery = 0;
14436 int nCol = 0;
14437 int i;
14438 sqlite3_stmt *pQuery = 0;
14439 int *aStat = 0;
14440 int rc = SQLITE_OK;
14441
14442 assert( p->iSample>0 );
14443
14444 /* Formulate the query text */
14445 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
14446 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
14447 const char *zComma = zCols==0 ? "" : ", ";
14448 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
14449 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
14450 if( zName==0 ){
14451 /* This index contains an expression. Ignore it. */
14452 sqlite3_free(zCols);
14453 sqlite3_free(zOrder);
14454 return sqlite3_reset(pIndexXInfo);
14455 }
14456 zCols = idxAppendText(&rc, zCols,
14457 "%sx.%Q IS sqlite_expert_rem(%d, x.%Q) COLLATE %s",
14458 zComma, zName, nCol, zName, zColl
14459 );
14460 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
14461 }
14462 sqlite3_reset(pIndexXInfo);
14463 if( rc==SQLITE_OK ){
14464 if( p->iSample==100 ){
14465 zQuery = sqlite3_mprintf(
14466 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
14467 );
14468 }else{
14469 zQuery = sqlite3_mprintf(
14470 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
14471 );
14472 }
14473 }
14474 sqlite3_free(zCols);
14475 sqlite3_free(zOrder);
14476
14477 /* Formulate the query text */
14478 if( rc==SQLITE_OK ){
14479 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
14480 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
14481 }
14482 sqlite3_free(zQuery);
14483
14484 if( rc==SQLITE_OK ){
14485 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
14486 }
14487 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
14488 IdxHashEntry *pEntry;
14489 char *zStat = 0;
14490 for(i=0; i<=nCol; i++) aStat[i] = 1;
14491 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
14492 aStat[0]++;
14493 for(i=0; i<nCol; i++){
14494 if( sqlite3_column_int(pQuery, i)==0 ) break;
14495 }
14496 for(/*no-op*/; i<nCol; i++){
14497 aStat[i+1]++;
14498 }
14499 }
14500
14501 if( rc==SQLITE_OK ){
14502 int s0 = aStat[0];
14503 zStat = sqlite3_mprintf("%d", s0);
14504 if( zStat==0 ) rc = SQLITE_NOMEM;
14505 for(i=1; rc==SQLITE_OK && i<=nCol; i++){
14506 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
14507 }
14508 }
14509
14510 if( rc==SQLITE_OK ){
14511 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
14512 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
14513 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
14514 sqlite3_step(pWriteStat);
14515 rc = sqlite3_reset(pWriteStat);
14516 }
14517
14518 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
14519 if( pEntry ){
14520 assert( pEntry->zVal2==0 );
14521 pEntry->zVal2 = zStat;
14522 }else{
14523 sqlite3_free(zStat);
14524 }
14525 }
14526 sqlite3_free(aStat);
14527 idxFinalize(&rc, pQuery);
14528
14529 return rc;
14530}
14531
14532static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
14533 int rc;
14534 char *zSql;
14535
14536 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
14537 if( rc!=SQLITE_OK ) return rc;
14538
14539 zSql = sqlite3_mprintf(
14540 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
14541 );
14542 if( zSql==0 ) return SQLITE_NOMEM;
14543 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
14544 sqlite3_free(zSql);
14545
14546 return rc;
14547}
14548
14549/*
14550** This function is called as part of sqlite3_expert_analyze(). Candidate
14551** indexes have already been created in database sqlite3expert.dbm, this
14552** function populates sqlite_stat1 table in the same database.
14553**
14554** The stat1 data is generated by querying the
14555*/
14556static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
14557 int rc = SQLITE_OK;
14558 int nMax =0;
14559 struct IdxRemCtx *pCtx = 0;
14560 struct IdxSampleCtx samplectx;
14561 int i;
14562 i64 iPrev = -100000;
14563 sqlite3_stmt *pAllIndex = 0;
14564 sqlite3_stmt *pIndexXInfo = 0;
14565 sqlite3_stmt *pWrite = 0;
14566
14567 const char *zAllIndex =
14568 "SELECT s.rowid, s.name, l.name FROM "
14569 " sqlite_schema AS s, "
14570 " pragma_index_list(s.name) AS l "
14571 "WHERE s.type = 'table'";
14572 const char *zIndexXInfo =
14573 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
14574 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
14575
14576 /* If iSample==0, no sqlite_stat1 data is required. */
14577 if( p->iSample==0 ) return SQLITE_OK;
14578
14579 rc = idxLargestIndex(p->dbm, &nMax, pzErr);
14580 if( nMax<=0 || rc!=SQLITE_OK ) return rc;
14581
14582 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
14583
14584 if( rc==SQLITE_OK ){
14585 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
14586 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
14587 }
14588
14589 if( rc==SQLITE_OK ){
14590 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
14591 rc = sqlite3_create_function(dbrem, "sqlite_expert_rem",
14592 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
14593 );
14594 }
14595 if( rc==SQLITE_OK ){
14596 rc = sqlite3_create_function(p->db, "sqlite_expert_sample",
14597 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
14598 );
14599 }
14600
14601 if( rc==SQLITE_OK ){
14602 pCtx->nSlot = nMax+1;
14603 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
14604 }
14605 if( rc==SQLITE_OK ){
14606 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
14607 }
14608 if( rc==SQLITE_OK ){
14609 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
14610 }
14611
14612 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
14613 i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
14614 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
14615 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
14616 if( zTab==0 || zIdx==0 ) continue;
14617 if( p->iSample<100 && iPrev!=iRowid ){
14618 samplectx.target = (double)p->iSample / 100.0;
14619 samplectx.iTarget = p->iSample;
14620 samplectx.nRow = 0.0;
14621 samplectx.nRet = 0.0;
14622 rc = idxBuildSampleTable(p, zTab);
14623 if( rc!=SQLITE_OK ) break;
14624 }
14625 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
14626 iPrev = iRowid;
14627 }
14628 if( rc==SQLITE_OK && p->iSample<100 ){
14630 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
14631 );
14632 }
14633
14634 idxFinalize(&rc, pAllIndex);
14635 idxFinalize(&rc, pIndexXInfo);
14636 idxFinalize(&rc, pWrite);
14637
14638 if( pCtx ){
14639 for(i=0; i<pCtx->nSlot; i++){
14640 sqlite3_free(pCtx->aSlot[i].z);
14641 }
14642 sqlite3_free(pCtx);
14643 }
14644
14645 if( rc==SQLITE_OK ){
14646 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
14647 }
14648
14649 sqlite3_create_function(p->db, "sqlite_expert_rem", 2, SQLITE_UTF8, 0,0,0,0);
14650 sqlite3_create_function(p->db, "sqlite_expert_sample", 0,SQLITE_UTF8,0,0,0,0);
14651
14652 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
14653 return rc;
14654}
14655
14656/*
14657** Define and possibly pretend to use a useless collation sequence.
14658** This pretense allows expert to accept SQL using custom collations.
14659*/
14660int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
14661 (void)up1;
14662 (void)up2;
14663 (void)up3;
14664 (void)up4;
14665 (void)up5;
14666 assert(0); /* VDBE should never be run. */
14667 return 0;
14668}
14669/* And a callback to register above upon actual need */
14670void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
14671 (void)up1;
14673}
14674
14675#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
14676 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
14677/*
14678** dummy functions for no-op implementation of UDFs during expert's work
14679*/
14680void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
14681 (void)up1;
14682 (void)up2;
14683 (void)up3;
14684 assert(0); /* VDBE should never be run. */
14685}
14686void dummyUDFvalue(sqlite3_context *up1){
14687 (void)up1;
14688 assert(0); /* VDBE should never be run. */
14689}
14690
14691/*
14692** Register UDFs from user database with another.
14693*/
14694int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
14695 sqlite3_stmt *pStmt;
14696 int rc = sqlite3_prepare_v2(dbSrc,
14697 "SELECT name,type,enc,narg,flags "
14698 "FROM pragma_function_list() "
14699 "WHERE builtin==0", -1, &pStmt, 0);
14700 if( rc==SQLITE_OK ){
14701 while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
14702 int nargs = sqlite3_column_int(pStmt,3);
14703 int flags = sqlite3_column_int(pStmt,4);
14704 const char *name = (char*)sqlite3_column_text(pStmt,0);
14705 const char *type = (char*)sqlite3_column_text(pStmt,1);
14706 const char *enc = (char*)sqlite3_column_text(pStmt,2);
14707 if( name==0 || type==0 || enc==0 ){
14708 /* no-op. Only happens on OOM */
14709 }else{
14710 int ienc = SQLITE_UTF8;
14711 int rcf = SQLITE_ERROR;
14712 if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
14713 else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
14714 ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
14715 if( strcmp(type,"w")==0 ){
14716 rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
14718 }else if( strcmp(type,"a")==0 ){
14719 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
14721 }else if( strcmp(type,"s")==0 ){
14722 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
14723 dummyUDF,0,0);
14724 }
14725 if( rcf!=SQLITE_OK ){
14726 rc = rcf;
14727 break;
14728 }
14729 }
14730 }
14731 sqlite3_finalize(pStmt);
14732 if( rc==SQLITE_DONE ) rc = SQLITE_OK;
14733 }
14734 return rc;
14735}
14736#endif
14737
14738/*
14739** Allocate a new sqlite3expert object.
14740*/
14741sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
14742 int rc = SQLITE_OK;
14743 sqlite3expert *pNew;
14744
14745 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
14746
14747 /* Open two in-memory databases to work with. The "vtab database" (dbv)
14748 ** will contain a virtual table corresponding to each real table in
14749 ** the user database schema, and a copy of each view. It is used to
14750 ** collect information regarding the WHERE, ORDER BY and other clauses
14751 ** of the user's query.
14752 */
14753 if( rc==SQLITE_OK ){
14754 pNew->db = db;
14755 pNew->iSample = 100;
14756 rc = sqlite3_open(":memory:", &pNew->dbv);
14757 }
14758 if( rc==SQLITE_OK ){
14759 rc = sqlite3_open(":memory:", &pNew->dbm);
14760 if( rc==SQLITE_OK ){
14762 }
14763 }
14764
14765 /* Allow custom collations to be dealt with through prepare. */
14768
14769#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
14770 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
14771 /* Register UDFs from database [db] with [dbm] and [dbv]. */
14772 if( rc==SQLITE_OK ){
14773 rc = registerUDFs(pNew->db, pNew->dbm);
14774 }
14775 if( rc==SQLITE_OK ){
14776 rc = registerUDFs(pNew->db, pNew->dbv);
14777 }
14778#endif
14779
14780 /* Copy the entire schema of database [db] into [dbm]. */
14781 if( rc==SQLITE_OK ){
14782 sqlite3_stmt *pSql = 0;
14783 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
14784 "SELECT sql, name, substr(sql,1,14)=='create virtual' COLLATE nocase"
14785 " FROM sqlite_schema WHERE substr(name,1,7)!='sqlite_' COLLATE nocase"
14786 " ORDER BY 3 DESC, rowid"
14787 );
14788 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
14789 const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
14790 const char *zName = (const char*)sqlite3_column_text(pSql, 1);
14791 int bExists = 0;
14792 rc = expertDbContainsObject(pNew->dbm, zName, &bExists);
14793 if( rc==SQLITE_OK && zSql && bExists==0 ){
14794 rc = expertSchemaSql(pNew->dbm, zSql, pzErrmsg);
14795 }
14796 }
14797 idxFinalize(&rc, pSql);
14798 }
14799
14800 /* Create the vtab schema */
14801 if( rc==SQLITE_OK ){
14802 rc = idxCreateVtabSchema(pNew, pzErrmsg);
14803 }
14804
14805 /* Register the auth callback with dbv */
14806 if( rc==SQLITE_OK ){
14808 }
14809
14810 /* If an error has occurred, free the new object and return NULL. Otherwise,
14811 ** return the new sqlite3expert handle. */
14812 if( rc!=SQLITE_OK ){
14814 pNew = 0;
14815 }
14816 return pNew;
14817}
14818
14819/*
14820** Configure an sqlite3expert object.
14821*/
14822int sqlite3_expert_config(sqlite3expert *p, int op, ...){
14823 int rc = SQLITE_OK;
14824 va_list ap;
14825 va_start(ap, op);
14826 switch( op ){
14827 case EXPERT_CONFIG_SAMPLE: {
14828 int iVal = va_arg(ap, int);
14829 if( iVal<0 ) iVal = 0;
14830 if( iVal>100 ) iVal = 100;
14831 p->iSample = iVal;
14832 break;
14833 }
14834 default:
14835 rc = SQLITE_NOTFOUND;
14836 break;
14837 }
14838
14839 va_end(ap);
14840 return rc;
14841}
14842
14843/*
14844** Add an SQL statement to the analysis.
14845*/
14847 sqlite3expert *p, /* From sqlite3_expert_new() */
14848 const char *zSql, /* SQL statement to add */
14849 char **pzErr /* OUT: Error message (if any) */
14850){
14851 IdxScan *pScanOrig = p->pScan;
14852 IdxStatement *pStmtOrig = p->pStatement;
14853 int rc = SQLITE_OK;
14854 const char *zStmt = zSql;
14855
14856 if( p->bRun ) return SQLITE_MISUSE;
14857
14858 while( rc==SQLITE_OK && zStmt && zStmt[0] ){
14859 sqlite3_stmt *pStmt = 0;
14860 /* Ensure that the provided statement compiles against user's DB. */
14861 rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
14862 if( rc!=SQLITE_OK ) break;
14863 sqlite3_finalize(pStmt);
14864 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
14865 if( rc==SQLITE_OK ){
14866 if( pStmt ){
14867 IdxStatement *pNew;
14868 const char *z = sqlite3_sql(pStmt);
14869 int n = STRLEN(z);
14870 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
14871 if( rc==SQLITE_OK ){
14872 pNew->zSql = (char*)&pNew[1];
14873 memcpy(pNew->zSql, z, n+1);
14874 pNew->pNext = p->pStatement;
14875 if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
14876 p->pStatement = pNew;
14877 }
14878 sqlite3_finalize(pStmt);
14879 }
14880 }else{
14882 }
14883 }
14884
14885 if( rc!=SQLITE_OK ){
14886 idxScanFree(p->pScan, pScanOrig);
14888 p->pScan = pScanOrig;
14889 p->pStatement = pStmtOrig;
14890 }
14891
14892 return rc;
14893}
14894
14895int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
14896 int rc;
14897 IdxHashEntry *pEntry;
14898
14899 /* Do trigger processing to collect any extra IdxScan structures */
14900 rc = idxProcessTriggers(p, pzErr);
14901
14902 /* Create candidate indexes within the in-memory database file */
14903 if( rc==SQLITE_OK ){
14905 }else if ( rc==SQLITE_BUSY_TIMEOUT ){
14906 if( pzErr )
14907 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
14908 return rc;
14909 }
14910
14911 /* Generate the stat1 data */
14912 if( rc==SQLITE_OK ){
14913 rc = idxPopulateStat1(p, pzErr);
14914 }
14915
14916 /* Formulate the EXPERT_REPORT_CANDIDATES text */
14917 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
14919 "%s;%s%s\n", pEntry->zVal,
14920 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
14921 );
14922 }
14923
14924 /* Figure out which of the candidate indexes are preferred by the query
14925 ** planner and report the results to the user. */
14926 if( rc==SQLITE_OK ){
14927 rc = idxFindIndexes(p, pzErr);
14928 }
14929
14930 if( rc==SQLITE_OK ){
14931 p->bRun = 1;
14932 }
14933 return rc;
14934}
14935
14936/*
14937** Return the total number of statements that have been added to this
14938** sqlite3expert using sqlite3_expert_sql().
14939*/
14940int sqlite3_expert_count(sqlite3expert *p){
14941 int nRet = 0;
14942 if( p->pStatement ) nRet = p->pStatement->iId+1;
14943 return nRet;
14944}
14945
14946/*
14947** Return a component of the report.
14948*/
14949const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
14950 const char *zRet = 0;
14951 IdxStatement *pStmt;
14952
14953 if( p->bRun==0 ) return 0;
14954 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
14955 switch( eReport ){
14956 case EXPERT_REPORT_SQL:
14957 if( pStmt ) zRet = pStmt->zSql;
14958 break;
14960 if( pStmt ) zRet = pStmt->zIdx;
14961 break;
14962 case EXPERT_REPORT_PLAN:
14963 if( pStmt ) zRet = pStmt->zEQP;
14964 break;
14966 zRet = p->zCandidates;
14967 break;
14968 }
14969 return zRet;
14970}
14971
14972/*
14973** Free an sqlite3expert object.
14974*/
14988
14989#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
14990
14991/************************* End ../ext/expert/sqlite3expert.c ********************/
14992/************************* Begin ../ext/intck/sqlite3intck.h ******************/
14993/*
14994** 2024-02-08
14995**
14996** The author disclaims copyright to this source code. In place of
14997** a legal notice, here is a blessing:
14998**
14999** May you do good and not evil.
15000** May you find forgiveness for yourself and forgive others.
15001** May you share freely, never taking more than you give.
15002**
15003*************************************************************************
15004*/
15005
15006/*
15007** Incremental Integrity-Check Extension
15008** -------------------------------------
15009**
15010** This module contains code to check whether or not an SQLite database
15011** is well-formed or corrupt. This is the same task as performed by SQLite's
15012** built-in "PRAGMA integrity_check" command. This module differs from
15013** "PRAGMA integrity_check" in that:
15014**
15015** + It is less thorough - this module does not detect certain types
15016** of corruption that are detected by the PRAGMA command. However,
15017** it does detect all kinds of corruption that are likely to cause
15018** errors in SQLite applications.
15019**
15020** + It is slower. Sometimes up to three times slower.
15021**
15022** + It allows integrity-check operations to be split into multiple
15023** transactions, so that the database does not need to be read-locked
15024** for the duration of the integrity-check.
15025**
15026** One way to use the API to run integrity-check on the "main" database
15027** of handle db is:
15028**
15029** int rc = SQLITE_OK;
15030** sqlite3_intck *p = 0;
15031**
15032** sqlite3_intck_open(db, "main", &p);
15033** while( SQLITE_OK==sqlite3_intck_step(p) ){
15034** const char *zMsg = sqlite3_intck_message(p);
15035** if( zMsg ) printf("corruption: %s\n", zMsg);
15036** }
15037** rc = sqlite3_intck_error(p, &zErr);
15038** if( rc!=SQLITE_OK ){
15039** printf("error occured (rc=%d), (errmsg=%s)\n", rc, zErr);
15040** }
15041** sqlite3_intck_close(p);
15042**
15043** Usually, the sqlite3_intck object opens a read transaction within the
15044** first call to sqlite3_intck_step() and holds it open until the
15045** integrity-check is complete. However, if sqlite3_intck_unlock() is
15046** called, the read transaction is ended and a new read transaction opened
15047** by the subsequent call to sqlite3_intck_step().
15048*/
15049
15050#ifndef _SQLITE_INTCK_H
15051#define _SQLITE_INTCK_H
15052
15053/* #include "sqlite3.h" */
15054
15055#ifdef __cplusplus
15056extern "C" {
15057#endif
15058
15059/*
15060** An ongoing incremental integrity-check operation is represented by an
15061** opaque pointer of the following type.
15062*/
15063typedef struct sqlite3_intck sqlite3_intck;
15064
15065/*
15066** Open a new incremental integrity-check object. If successful, populate
15067** output variable (*ppOut) with the new object handle and return SQLITE_OK.
15068** Or, if an error occurs, set (*ppOut) to NULL and return an SQLite error
15069** code (e.g. SQLITE_NOMEM).
15070**
15071** The integrity-check will be conducted on database zDb (which must be "main",
15072** "temp", or the name of an attached database) of database handle db. Once
15073** this function has been called successfully, the caller should not use
15074** database handle db until the integrity-check object has been destroyed
15075** using sqlite3_intck_close().
15076*/
15078 sqlite3 *db, /* Database handle */
15079 const char *zDb, /* Database name ("main", "temp" etc.) */
15080 sqlite3_intck **ppOut /* OUT: New sqlite3_intck handle */
15081);
15082
15083/*
15084** Close and release all resources associated with a handle opened by an
15085** earlier call to sqlite3_intck_open(). The results of using an
15086** integrity-check handle after it has been passed to this function are
15087** undefined.
15088*/
15089void sqlite3_intck_close(sqlite3_intck *pCk);
15090
15091/*
15092** Do the next step of the integrity-check operation specified by the handle
15093** passed as the only argument. This function returns SQLITE_DONE if the
15094** integrity-check operation is finished, or an SQLite error code if
15095** an error occurs, or SQLITE_OK if no error occurs but the integrity-check
15096** is not finished. It is not considered an error if database corruption
15097** is encountered.
15098**
15099** Following a successful call to sqlite3_intck_step() (one that returns
15100** SQLITE_OK), sqlite3_intck_message() returns a non-NULL value if
15101** corruption was detected in the db.
15102**
15103** If an error occurs and a value other than SQLITE_OK or SQLITE_DONE is
15104** returned, then the integrity-check handle is placed in an error state.
15105** In this state all subsequent calls to sqlite3_intck_step() or
15106** sqlite3_intck_unlock() will immediately return the same error. The
15107** sqlite3_intck_error() method may be used to obtain an English language
15108** error message in this case.
15109*/
15110int sqlite3_intck_step(sqlite3_intck *pCk);
15111
15112/*
15113** If the previous call to sqlite3_intck_step() encountered corruption
15114** within the database, then this function returns a pointer to a buffer
15115** containing a nul-terminated string describing the corruption in
15116** English. If the previous call to sqlite3_intck_step() did not encounter
15117** corruption, or if there was no previous call, this function returns
15118** NULL.
15119*/
15120const char *sqlite3_intck_message(sqlite3_intck *pCk);
15121
15122/*
15123** Close any read-transaction opened by an earlier call to
15124** sqlite3_intck_step(). Any subsequent call to sqlite3_intck_step() will
15125** open a new transaction. Return SQLITE_OK if successful, or an SQLite error
15126** code otherwise.
15127**
15128** If an error occurs, then the integrity-check handle is placed in an error
15129** state. In this state all subsequent calls to sqlite3_intck_step() or
15130** sqlite3_intck_unlock() will immediately return the same error. The
15131** sqlite3_intck_error() method may be used to obtain an English language
15132** error message in this case.
15133*/
15134int sqlite3_intck_unlock(sqlite3_intck *pCk);
15135
15136/*
15137** If an error has occurred in an earlier call to sqlite3_intck_step()
15138** or sqlite3_intck_unlock(), then this method returns the associated
15139** SQLite error code. Additionally, if pzErr is not NULL, then (*pzErr)
15140** may be set to point to a nul-terminated string containing an English
15141** language error message. Or, if no error message is available, to
15142** NULL.
15143**
15144** If no error has occurred within sqlite3_intck_step() or
15145** sqlite_intck_unlock() calls on the handle passed as the first argument,
15146** then SQLITE_OK is returned and (*pzErr) set to NULL.
15147*/
15148int sqlite3_intck_error(sqlite3_intck *pCk, const char **pzErr);
15149
15150/*
15151** This API is used for testing only. It returns the full-text of an SQL
15152** statement used to test object zObj, which may be a table or index.
15153** The returned buffer is valid until the next call to either this function
15154** or sqlite3_intck_close() on the same sqlite3_intck handle.
15155*/
15156const char *sqlite3_intck_test_sql(sqlite3_intck *pCk, const char *zObj);
15157
15158
15159#ifdef __cplusplus
15160} /* end of the 'extern "C"' block */
15161#endif
15162
15163#endif /* ifndef _SQLITE_INTCK_H */
15164
15165/************************* End ../ext/intck/sqlite3intck.h ********************/
15166/************************* Begin ../ext/intck/sqlite3intck.c ******************/
15167/*
15168** 2024-02-08
15169**
15170** The author disclaims copyright to this source code. In place of
15171** a legal notice, here is a blessing:
15172**
15173** May you do good and not evil.
15174** May you find forgiveness for yourself and forgive others.
15175** May you share freely, never taking more than you give.
15176**
15177*************************************************************************
15178*/
15179
15180/* #include "sqlite3intck.h" */
15181#include <string.h>
15182#include <assert.h>
15183
15184#include <stdio.h>
15185#include <stdlib.h>
15186
15187/*
15188** nKeyVal:
15189** The number of values that make up the 'key' for the current pCheck
15190** statement.
15191**
15192** rc:
15193** Error code returned by most recent sqlite3_intck_step() or
15194** sqlite3_intck_unlock() call. This is set to SQLITE_DONE when
15195** the integrity-check operation is finished.
15196**
15197** zErr:
15198** If the object has entered the error state, this is the error message.
15199** Is freed using sqlite3_free() when the object is deleted.
15200**
15201** zTestSql:
15202** The value returned by the most recent call to sqlite3_intck_testsql().
15203** Each call to testsql() frees the previous zTestSql value (using
15204** sqlite3_free()) and replaces it with the new value it will return.
15205*/
15207 sqlite3 *db;
15208 const char *zDb; /* Copy of zDb parameter to _open() */
15209 char *zObj; /* Current object. Or NULL. */
15210
15211 sqlite3_stmt *pCheck; /* Current check statement */
15212 char *zKey;
15214
15217
15218 int rc; /* Error code */
15219 char *zErr; /* Error message */
15220 char *zTestSql; /* Returned by sqlite3_intck_test_sql() */
15221};
15222
15223
15224/*
15225** Some error has occurred while using database p->db. Save the error message
15226** and error code currently held by the database handle in p->rc and p->zErr.
15227*/
15228static void intckSaveErrmsg(sqlite3_intck *p){
15232}
15233
15234/*
15235** If the handle passed as the first argument is already in the error state,
15236** then this function is a no-op (returns NULL immediately). Otherwise, if an
15237** error occurs within this function, it leaves an error in said handle.
15238**
15239** Otherwise, this function attempts to prepare SQL statement zSql and
15240** return the resulting statement handle to the user.
15241*/
15242static sqlite3_stmt *intckPrepare(sqlite3_intck *p, const char *zSql){
15243 sqlite3_stmt *pRet = 0;
15244 if( p->rc==SQLITE_OK ){
15245 p->rc = sqlite3_prepare_v2(p->db, zSql, -1, &pRet, 0);
15246 if( p->rc!=SQLITE_OK ){
15248 assert( pRet==0 );
15249 }
15250 }
15251 return pRet;
15252}
15253
15254/*
15255** If the handle passed as the first argument is already in the error state,
15256** then this function is a no-op (returns NULL immediately). Otherwise, if an
15257** error occurs within this function, it leaves an error in said handle.
15258**
15259** Otherwise, this function treats argument zFmt as a printf() style format
15260** string. It formats it according to the trailing arguments and then
15261** attempts to prepare the results and return the resulting prepared
15262** statement.
15263*/
15264static sqlite3_stmt *intckPrepareFmt(sqlite3_intck *p, const char *zFmt, ...){
15265 sqlite3_stmt *pRet = 0;
15266 va_list ap;
15267 char *zSql = 0;
15268 va_start(ap, zFmt);
15269 zSql = sqlite3_vmprintf(zFmt, ap);
15270 if( p->rc==SQLITE_OK && zSql==0 ){
15271 p->rc = SQLITE_NOMEM;
15272 }
15273 pRet = intckPrepare(p, zSql);
15274 sqlite3_free(zSql);
15275 va_end(ap);
15276 return pRet;
15277}
15278
15279/*
15280** Finalize SQL statement pStmt. If an error occurs and the handle passed
15281** as the first argument does not already contain an error, store the
15282** error in the handle.
15283*/
15284static void intckFinalize(sqlite3_intck *p, sqlite3_stmt *pStmt){
15285 int rc = sqlite3_finalize(pStmt);
15286 if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){
15288 }
15289}
15290
15291/*
15292** If there is already an error in handle p, return it. Otherwise, call
15293** sqlite3_step() on the statement handle and return that value.
15294*/
15295static int intckStep(sqlite3_intck *p, sqlite3_stmt *pStmt){
15296 if( p->rc ) return p->rc;
15297 return sqlite3_step(pStmt);
15298}
15299
15300/*
15301** Execute SQL statement zSql. There is no way to obtain any results
15302** returned by the statement. This function uses the sqlite3_intck error
15303** code convention.
15304*/
15305static void intckExec(sqlite3_intck *p, const char *zSql){
15306 sqlite3_stmt *pStmt = 0;
15307 pStmt = intckPrepare(p, zSql);
15308 intckStep(p, pStmt);
15309 intckFinalize(p, pStmt);
15310}
15311
15312/*
15313** A wrapper around sqlite3_mprintf() that uses the sqlite3_intck error
15314** code convention.
15315*/
15316static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){
15317 va_list ap;
15318 char *zRet = 0;
15319 va_start(ap, zFmt);
15320 zRet = sqlite3_vmprintf(zFmt, ap);
15321 if( p->rc==SQLITE_OK ){
15322 if( zRet==0 ){
15323 p->rc = SQLITE_NOMEM;
15324 }
15325 }else{
15326 sqlite3_free(zRet);
15327 zRet = 0;
15328 }
15329 return zRet;
15330}
15331
15332/*
15333** This is used by sqlite3_intck_unlock() to save the vector key value
15334** required to restart the current pCheck query as a nul-terminated string
15335** in p->zKey.
15336*/
15337static void intckSaveKey(sqlite3_intck *p){
15338 int ii;
15339 char *zSql = 0;
15340 sqlite3_stmt *pStmt = 0;
15341 sqlite3_stmt *pXinfo = 0;
15342 const char *zDir = 0;
15343
15344 assert( p->pCheck );
15345 assert( p->zKey==0 );
15346
15347 pXinfo = intckPrepareFmt(p,
15348 "SELECT group_concat(desc, '') FROM %Q.sqlite_schema s, "
15349 "pragma_index_xinfo(%Q, %Q) "
15350 "WHERE s.type='index' AND s.name=%Q",
15352 );
15353 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXinfo) ){
15354 zDir = (const char*)sqlite3_column_text(pXinfo, 0);
15355 }
15356
15357 if( zDir==0 ){
15358 /* Object is a table, not an index. This is the easy case,as there are
15359 ** no DESC columns or NULL values in a primary key. */
15360 const char *zSep = "SELECT '(' || ";
15361 for(ii=0; ii<p->nKeyVal; ii++){
15362 zSql = intckMprintf(p, "%z%squote(?)", zSql, zSep);
15363 zSep = " || ', ' || ";
15364 }
15365 zSql = intckMprintf(p, "%z || ')'", zSql);
15366 }else{
15367
15368 /* Object is an index. */
15369 assert( p->nKeyVal>1 );
15370 for(ii=p->nKeyVal; ii>0; ii--){
15371 int bLastIsDesc = zDir[ii-1]=='1';
15372 int bLastIsNull = sqlite3_column_type(p->pCheck, ii)==SQLITE_NULL;
15373 const char *zLast = sqlite3_column_name(p->pCheck, ii);
15374 char *zLhs = 0;
15375 char *zRhs = 0;
15376 char *zWhere = 0;
15377
15378 if( bLastIsNull ){
15379 if( bLastIsDesc ) continue;
15380 zWhere = intckMprintf(p, "'%s IS NOT NULL'", zLast);
15381 }else{
15382 const char *zOp = bLastIsDesc ? "<" : ">";
15383 zWhere = intckMprintf(p, "'%s %s ' || quote(?%d)", zLast, zOp, ii);
15384 }
15385
15386 if( ii>1 ){
15387 const char *zLhsSep = "";
15388 const char *zRhsSep = "";
15389 int jj;
15390 for(jj=0; jj<ii-1; jj++){
15391 const char *zAlias = (const char*)sqlite3_column_name(p->pCheck,jj+1);
15392 zLhs = intckMprintf(p, "%z%s%s", zLhs, zLhsSep, zAlias);
15393 zRhs = intckMprintf(p, "%z%squote(?%d)", zRhs, zRhsSep, jj+1);
15394 zLhsSep = ",";
15395 zRhsSep = " || ',' || ";
15396 }
15397
15398 zWhere = intckMprintf(p,
15399 "'(%z) IS (' || %z || ') AND ' || %z",
15400 zLhs, zRhs, zWhere);
15401 }
15402 zWhere = intckMprintf(p, "'WHERE ' || %z", zWhere);
15403
15404 zSql = intckMprintf(p, "%z%s(quote( %z ) )",
15405 zSql,
15406 (zSql==0 ? "VALUES" : ",\n "),
15407 zWhere
15408 );
15409 }
15410 zSql = intckMprintf(p,
15411 "WITH wc(q) AS (\n%z\n)"
15412 "SELECT 'VALUES' || group_concat('(' || q || ')', ',\n ') FROM wc"
15413 , zSql
15414 );
15415 }
15416
15417 pStmt = intckPrepare(p, zSql);
15418 if( p->rc==SQLITE_OK ){
15419 for(ii=0; ii<p->nKeyVal; ii++){
15421 }
15422 if( SQLITE_ROW==sqlite3_step(pStmt) ){
15423 p->zKey = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
15424 }
15425 intckFinalize(p, pStmt);
15426 }
15427
15428 sqlite3_free(zSql);
15429 intckFinalize(p, pXinfo);
15430}
15431
15432/*
15433** Find the next database object (table or index) to check. If successful,
15434** set sqlite3_intck.zObj to point to a nul-terminated buffer containing
15435** the object's name before returning.
15436*/
15437static void intckFindObject(sqlite3_intck *p){
15438 sqlite3_stmt *pStmt = 0;
15439 char *zPrev = p->zObj;
15440 p->zObj = 0;
15441
15442 assert( p->rc==SQLITE_OK );
15443 assert( p->pCheck==0 );
15444
15445 pStmt = intckPrepareFmt(p,
15446 "WITH tables(table_name) AS ("
15447 " SELECT name"
15448 " FROM %Q.sqlite_schema WHERE (type='table' OR type='index') AND rootpage"
15449 " UNION ALL "
15450 " SELECT 'sqlite_schema'"
15451 ")"
15452 "SELECT table_name FROM tables "
15453 "WHERE ?1 IS NULL OR table_name%s?1 "
15454 "ORDER BY 1"
15455 , p->zDb, (p->zKey ? ">=" : ">")
15456 );
15457
15458 if( p->rc==SQLITE_OK ){
15460 if( sqlite3_step(pStmt)==SQLITE_ROW ){
15461 p->zObj = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
15462 }
15463 }
15464 intckFinalize(p, pStmt);
15465
15466 /* If this is a new object, ensure the previous key value is cleared. */
15467 if( sqlite3_stricmp(p->zObj, zPrev) ){
15469 p->zKey = 0;
15470 }
15471
15472 sqlite3_free(zPrev);
15473}
15474
15475/*
15476** Return the size in bytes of the first token in nul-terminated buffer z.
15477** For the purposes of this call, a token is either:
15478**
15479** * a quoted SQL string,
15480* * a contiguous series of ascii alphabet characters, or
15481* * any other single byte.
15482*/
15483static int intckGetToken(const char *z){
15484 char c = z[0];
15485 int iRet = 1;
15486 if( c=='\'' || c=='"' || c=='`' ){
15487 while( 1 ){
15488 if( z[iRet]==c ){
15489 iRet++;
15490 if( z[iRet]!=c ) break;
15491 }
15492 iRet++;
15493 }
15494 }
15495 else if( c=='[' ){
15496 while( z[iRet++]!=']' && z[iRet] );
15497 }
15498 else if( (c>='A' && c<='Z') || (c>='a' && c<='z') ){
15499 while( (z[iRet]>='A' && z[iRet]<='Z') || (z[iRet]>='a' && z[iRet]<='z') ){
15500 iRet++;
15501 }
15502 }
15503
15504 return iRet;
15505}
15506
15507/*
15508** Return true if argument c is an ascii whitespace character.
15509*/
15510static int intckIsSpace(char c){
15511 return (c==' ' || c=='\t' || c=='\n' || c=='\r');
15512}
15513
15514/*
15515** Argument z points to the text of a CREATE INDEX statement. This function
15516** identifies the part of the text that contains either the index WHERE
15517** clause (if iCol<0) or the iCol'th column of the index.
15518**
15519** If (iCol<0), the identified fragment does not include the "WHERE" keyword,
15520** only the expression that follows it. If (iCol>=0) then the identified
15521** fragment does not include any trailing sort-order keywords - "ASC" or
15522** "DESC".
15523**
15524** If the CREATE INDEX statement does not contain the requested field or
15525** clause, NULL is returned and (*pnByte) is set to 0. Otherwise, a pointer to
15526** the identified fragment is returned and output parameter (*pnByte) set
15527** to its size in bytes.
15528*/
15529static const char *intckParseCreateIndex(const char *z, int iCol, int *pnByte){
15530 int iOff = 0;
15531 int iThisCol = 0;
15532 int iStart = 0;
15533 int nOpen = 0;
15534
15535 const char *zRet = 0;
15536 int nRet = 0;
15537
15538 int iEndOfCol = 0;
15539
15540 /* Skip forward until the first "(" token */
15541 while( z[iOff]!='(' ){
15542 iOff += intckGetToken(&z[iOff]);
15543 if( z[iOff]=='\0' ) return 0;
15544 }
15545 assert( z[iOff]=='(' );
15546
15547 nOpen = 1;
15548 iOff++;
15549 iStart = iOff;
15550 while( z[iOff] ){
15551 const char *zToken = &z[iOff];
15552 int nToken = 0;
15553
15554 /* Check if this is the end of the current column - either a "," or ")"
15555 ** when nOpen==1. */
15556 if( nOpen==1 ){
15557 if( z[iOff]==',' || z[iOff]==')' ){
15558 if( iCol==iThisCol ){
15559 int iEnd = iEndOfCol ? iEndOfCol : iOff;
15560 nRet = (iEnd - iStart);
15561 zRet = &z[iStart];
15562 break;
15563 }
15564 iStart = iOff+1;
15565 while( intckIsSpace(z[iStart]) ) iStart++;
15566 iThisCol++;
15567 }
15568 if( z[iOff]==')' ) break;
15569 }
15570 if( z[iOff]=='(' ) nOpen++;
15571 if( z[iOff]==')' ) nOpen--;
15572 nToken = intckGetToken(zToken);
15573
15574 if( (nToken==3 && 0==sqlite3_strnicmp(zToken, "ASC", nToken))
15575 || (nToken==4 && 0==sqlite3_strnicmp(zToken, "DESC", nToken))
15576 ){
15577 iEndOfCol = iOff;
15578 }else if( 0==intckIsSpace(zToken[0]) ){
15579 iEndOfCol = 0;
15580 }
15581
15582 iOff += nToken;
15583 }
15584
15585 /* iStart is now the byte offset of 1 byte passed the final ')' in the
15586 ** CREATE INDEX statement. Try to find a WHERE clause to return. */
15587 while( zRet==0 && z[iOff] ){
15588 int n = intckGetToken(&z[iOff]);
15589 if( n==5 && 0==sqlite3_strnicmp(&z[iOff], "where", 5) ){
15590 zRet = &z[iOff+5];
15591 nRet = (int)strlen(zRet);
15592 }
15593 iOff += n;
15594 }
15595
15596 /* Trim any whitespace from the start and end of the returned string. */
15597 if( zRet ){
15598 while( intckIsSpace(zRet[0]) ){
15599 nRet--;
15600 zRet++;
15601 }
15602 while( nRet>0 && intckIsSpace(zRet[nRet-1]) ) nRet--;
15603 }
15604
15605 *pnByte = nRet;
15606 return zRet;
15607}
15608
15609/*
15610** User-defined SQL function wrapper for intckParseCreateIndex():
15611**
15612** SELECT parse_create_index(<sql>, <icol>);
15613*/
15615 sqlite3_context *pCtx,
15616 int nVal,
15617 sqlite3_value **apVal
15618){
15619 const char *zSql = (const char*)sqlite3_value_text(apVal[0]);
15620 int idx = sqlite3_value_int(apVal[1]);
15621 const char *zRes = 0;
15622 int nRes = 0;
15623
15624 assert( nVal==2 );
15625 if( zSql ){
15626 zRes = intckParseCreateIndex(zSql, idx, &nRes);
15627 }
15629}
15630
15631/*
15632** Return true if sqlite3_intck.db has automatic indexes enabled, false
15633** otherwise.
15634*/
15635static int intckGetAutoIndex(sqlite3_intck *p){
15636 int bRet = 0;
15637 sqlite3_stmt *pStmt = 0;
15638 pStmt = intckPrepare(p, "PRAGMA automatic_index");
15639 if( SQLITE_ROW==intckStep(p, pStmt) ){
15640 bRet = sqlite3_column_int(pStmt, 0);
15641 }
15642 intckFinalize(p, pStmt);
15643 return bRet;
15644}
15645
15646/*
15647** Return true if zObj is an index, or false otherwise.
15648*/
15649static int intckIsIndex(sqlite3_intck *p, const char *zObj){
15650 int bRet = 0;
15651 sqlite3_stmt *pStmt = 0;
15652 pStmt = intckPrepareFmt(p,
15653 "SELECT 1 FROM %Q.sqlite_schema WHERE name=%Q AND type='index'",
15654 p->zDb, zObj
15655 );
15656 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15657 bRet = 1;
15658 }
15659 intckFinalize(p, pStmt);
15660 return bRet;
15661}
15662
15663/*
15664** Return a pointer to a nul-terminated buffer containing the SQL statement
15665** used to check database object zObj (a table or index) for corruption.
15666** If parameter zPrev is not NULL, then it must be a string containing the
15667** vector key required to restart the check where it left off last time.
15668** If pnKeyVal is not NULL, then (*pnKeyVal) is set to the number of
15669** columns in the vector key value for the specified object.
15670**
15671** This function uses the sqlite3_intck error code convention.
15672*/
15674 sqlite3_intck *p, /* Integrity check object */
15675 const char *zObj, /* Object (table or index) to scan */
15676 const char *zPrev, /* Restart key vector, if any */
15677 int *pnKeyVal /* OUT: Number of key-values for this scan */
15678){
15679 char *zRet = 0;
15680 sqlite3_stmt *pStmt = 0;
15681 int bAutoIndex = 0;
15682 int bIsIndex = 0;
15683
15684 const char *zCommon =
15685 /* Relation without_rowid also contains just one row. Column "b" is
15686 ** set to true if the table being examined is a WITHOUT ROWID table,
15687 ** or false otherwise. */
15688 ", without_rowid(b) AS ("
15689 " SELECT EXISTS ("
15690 " SELECT 1 FROM tabname, pragma_index_list(tab, db) AS l"
15691 " WHERE origin='pk' "
15692 " AND NOT EXISTS (SELECT 1 FROM sqlite_schema WHERE name=l.name)"
15693 " )"
15694 ")"
15695 ""
15696 /* Table idx_cols contains 1 row for each column in each index on the
15697 ** table being checked. Columns are:
15698 **
15699 ** idx_name: Name of the index.
15700 ** idx_ispk: True if this index is the PK of a WITHOUT ROWID table.
15701 ** col_name: Name of indexed column, or NULL for index on expression.
15702 ** col_expr: Indexed expression, including COLLATE clause.
15703 ** col_alias: Alias used for column in 'intck_wrapper' table.
15704 */
15705 ", idx_cols(idx_name, idx_ispk, col_name, col_expr, col_alias) AS ("
15706 " SELECT l.name, (l.origin=='pk' AND w.b), i.name, COALESCE(("
15707 " SELECT parse_create_index(sql, i.seqno) FROM "
15708 " sqlite_schema WHERE name = l.name"
15709 " ), format('\"%w\"', i.name) || ' COLLATE ' || quote(i.coll)),"
15710 " 'c' || row_number() OVER ()"
15711 " FROM "
15712 " tabname t,"
15713 " without_rowid w,"
15714 " pragma_index_list(t.tab, t.db) l,"
15715 " pragma_index_xinfo(l.name) i"
15716 " WHERE i.key"
15717 " UNION ALL"
15718 " SELECT '', 1, '_rowid_', '_rowid_', 'r1' FROM without_rowid WHERE b=0"
15719 ")"
15720 ""
15721 ""
15722 /*
15723 ** For a PK declared as "PRIMARY KEY(a, b) ... WITHOUT ROWID", where
15724 ** the intck_wrapper aliases of "a" and "b" are "c1" and "c2":
15725 **
15726 ** o_pk: "o.c1, o.c2"
15727 ** i_pk: "i.'a', i.'b'"
15728 ** ...
15729 ** n_pk: 2
15730 */
15731 ", tabpk(db, tab, idx, o_pk, i_pk, q_pk, eq_pk, ps_pk, pk_pk, n_pk) AS ("
15732 " WITH pkfields(f, a) AS ("
15733 " SELECT i.col_name, i.col_alias FROM idx_cols i WHERE i.idx_ispk"
15734 " )"
15735 " SELECT t.db, t.tab, t.idx, "
15736 " group_concat(a, ', '), "
15737 " group_concat('i.'||quote(f), ', '), "
15738 " group_concat('quote(o.'||a||')', ' || '','' || '), "
15739 " format('(%s)==(%s)',"
15740 " group_concat('o.'||a, ', '), "
15741 " group_concat(format('\"%w\"', f), ', ')"
15742 " ),"
15743 " group_concat('%s', ','),"
15744 " group_concat('quote('||a||')', ', '), "
15745 " count(*)"
15746 " FROM tabname t, pkfields"
15747 ")"
15748 ""
15749 ", idx(name, match_expr, partial, partial_alias, idx_ps, idx_idx) AS ("
15750 " SELECT idx_name,"
15751 " format('(%s,%s) IS (%s,%s)', "
15752 " group_concat(i.col_expr, ', '), i_pk,"
15753 " group_concat('o.'||i.col_alias, ', '), o_pk"
15754 " ), "
15755 " parse_create_index("
15756 " (SELECT sql FROM sqlite_schema WHERE name=idx_name), -1"
15757 " ),"
15758 " 'cond' || row_number() OVER ()"
15759 " , group_concat('%s', ',')"
15760 " , group_concat('quote('||i.col_alias||')', ', ')"
15761 " FROM tabpk t, "
15762 " without_rowid w,"
15763 " idx_cols i"
15764 " WHERE i.idx_ispk==0 "
15765 " GROUP BY idx_name"
15766 ")"
15767 ""
15768 ", wrapper_with(s) AS ("
15769 " SELECT 'intck_wrapper AS (\n SELECT\n ' || ("
15770 " WITH f(a, b) AS ("
15771 " SELECT col_expr, col_alias FROM idx_cols"
15772 " UNION ALL "
15773 " SELECT partial, partial_alias FROM idx WHERE partial IS NOT NULL"
15774 " )"
15775 " SELECT group_concat(format('%s AS %s', a, b), ',\n ') FROM f"
15776 " )"
15777 " || format('\n FROM %Q.%Q ', t.db, t.tab)"
15778 /* If the object being checked is a table, append "NOT INDEXED".
15779 ** Otherwise, append "INDEXED BY <index>", and then, if the index
15780 ** is a partial index " WHERE <condition>". */
15781 " || CASE WHEN t.idx IS NULL THEN "
15782 " 'NOT INDEXED'"
15783 " ELSE"
15784 " format('INDEXED BY %Q%s', t.idx, ' WHERE '||i.partial)"
15785 " END"
15786 " || '\n)'"
15787 " FROM tabname t LEFT JOIN idx i ON (i.name=t.idx)"
15788 ")"
15789 ""
15790 ;
15791
15792 bAutoIndex = intckGetAutoIndex(p);
15793 if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 0");
15794
15795 bIsIndex = intckIsIndex(p, zObj);
15796 if( bIsIndex ){
15797 pStmt = intckPrepareFmt(p,
15798 /* Table idxname contains a single row. The first column, "db", contains
15799 ** the name of the db containing the table (e.g. "main") and the second,
15800 ** "tab", the name of the table itself. */
15801 "WITH tabname(db, tab, idx) AS ("
15802 " SELECT %Q, (SELECT tbl_name FROM %Q.sqlite_schema WHERE name=%Q), %Q "
15803 ")"
15804 ""
15805 ", whereclause(w_c) AS (%s)"
15806 ""
15807 "%s" /* zCommon */
15808 ""
15809 ", case_statement(c) AS ("
15810 " SELECT "
15811 " 'CASE WHEN (' || group_concat(col_alias, ', ') || ', 1) IS (\n' "
15812 " || ' SELECT ' || group_concat(col_expr, ', ') || ', 1 FROM '"
15813 " || format('%%Q.%%Q NOT INDEXED WHERE %%s\n', t.db, t.tab, p.eq_pk)"
15814 " || ' )\n THEN NULL\n '"
15815 " || 'ELSE format(''surplus entry ('"
15816 " || group_concat('%%s', ',') || ',' || p.ps_pk"
15817 " || ') in index ' || t.idx || ''', ' "
15818 " || group_concat('quote('||i.col_alias||')', ', ') || ', ' || p.pk_pk"
15819 " || ')'"
15820 " || '\n END AS error_message'"
15821 " FROM tabname t, tabpk p, idx_cols i WHERE i.idx_name=t.idx"
15822 ")"
15823 ""
15824 ", thiskey(k, n) AS ("
15825 " SELECT group_concat(i.col_alias, ', ') || ', ' || p.o_pk, "
15826 " count(*) + p.n_pk "
15827 " FROM tabpk p, idx_cols i WHERE i.idx_name=p.idx"
15828 ")"
15829 ""
15830 ", main_select(m, n) AS ("
15831 " SELECT format("
15832 " 'WITH %%s\n' ||"
15833 " ', idx_checker AS (\n' ||"
15834 " ' SELECT %%s,\n' ||"
15835 " ' %%s\n' || "
15836 " ' FROM intck_wrapper AS o\n' ||"
15837 " ')\n',"
15838 " ww.s, c, t.k"
15839 " ), t.n"
15840 " FROM case_statement, wrapper_with ww, thiskey t"
15841 ")"
15842
15843 "SELECT m || "
15844 " group_concat('SELECT * FROM idx_checker ' || w_c, ' UNION ALL '), n"
15845 " FROM "
15846 "main_select, whereclause "
15847 , p->zDb, p->zDb, zObj, zObj
15848 , zPrev ? zPrev : "VALUES('')", zCommon
15849 );
15850 }else{
15851 pStmt = intckPrepareFmt(p,
15852 /* Table tabname contains a single row. The first column, "db", contains
15853 ** the name of the db containing the table (e.g. "main") and the second,
15854 ** "tab", the name of the table itself. */
15855 "WITH tabname(db, tab, idx, prev) AS (SELECT %Q, %Q, NULL, %Q)"
15856 ""
15857 "%s" /* zCommon */
15858
15859 /* expr(e) contains one row for each index on table zObj. Value e
15860 ** is set to an expression that evaluates to NULL if the required
15861 ** entry is present in the index, or an error message otherwise. */
15862 ", expr(e, p) AS ("
15863 " SELECT format('CASE WHEN EXISTS \n"
15864 " (SELECT 1 FROM %%Q.%%Q AS i INDEXED BY %%Q WHERE %%s%%s)\n"
15865 " THEN NULL\n"
15866 " ELSE format(''entry (%%s,%%s) missing from index %%s'', %%s, %%s)\n"
15867 " END\n'"
15868 " , t.db, t.tab, i.name, i.match_expr, ' AND (' || partial || ')',"
15869 " i.idx_ps, t.ps_pk, i.name, i.idx_idx, t.pk_pk),"
15870 " CASE WHEN partial IS NULL THEN NULL ELSE i.partial_alias END"
15871 " FROM tabpk t, idx i"
15872 ")"
15873
15874 ", numbered(ii, cond, e) AS ("
15875 " SELECT 0, 'n.ii=0', 'NULL'"
15876 " UNION ALL "
15877 " SELECT row_number() OVER (),"
15878 " '(n.ii='||row_number() OVER ()||COALESCE(' AND '||p||')', ')'), e"
15879 " FROM expr"
15880 ")"
15881
15882 ", counter_with(w) AS ("
15883 " SELECT 'WITH intck_counter(ii) AS (\n ' || "
15884 " group_concat('SELECT '||ii, ' UNION ALL\n ') "
15885 " || '\n)' FROM numbered"
15886 ")"
15887 ""
15888 ", case_statement(c) AS ("
15889 " SELECT 'CASE ' || "
15890 " group_concat(format('\n WHEN %%s THEN (%%s)', cond, e), '') ||"
15891 " '\nEND AS error_message'"
15892 " FROM numbered"
15893 ")"
15894 ""
15895
15896 /* This table contains a single row consisting of a single value -
15897 ** the text of an SQL expression that may be used by the main SQL
15898 ** statement to output an SQL literal that can be used to resume
15899 ** the scan if it is suspended. e.g. for a rowid table, an expression
15900 ** like:
15901 **
15902 ** format('(%d,%d)', _rowid_, n.ii)
15903 */
15904 ", thiskey(k, n) AS ("
15905 " SELECT o_pk || ', ii', n_pk+1 FROM tabpk"
15906 ")"
15907 ""
15908 ", whereclause(w_c) AS ("
15909 " SELECT CASE WHEN prev!='' THEN "
15910 " '\nWHERE (' || o_pk ||', n.ii) > ' || prev"
15911 " ELSE ''"
15912 " END"
15913 " FROM tabpk, tabname"
15914 ")"
15915 ""
15916 ", main_select(m, n) AS ("
15917 " SELECT format("
15918 " '%%s, %%s\nSELECT %%s,\n%%s\nFROM intck_wrapper AS o"
15919 ", intck_counter AS n%%s\nORDER BY %%s', "
15920 " w, ww.s, c, thiskey.k, whereclause.w_c, t.o_pk"
15921 " ), thiskey.n"
15922 " FROM case_statement, tabpk t, counter_with, "
15923 " wrapper_with ww, thiskey, whereclause"
15924 ")"
15925
15926 "SELECT m, n FROM main_select",
15927 p->zDb, zObj, zPrev, zCommon
15928 );
15929 }
15930
15931 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15932 zRet = intckMprintf(p, "%s", (const char*)sqlite3_column_text(pStmt, 0));
15933 if( pnKeyVal ){
15934 *pnKeyVal = sqlite3_column_int(pStmt, 1);
15935 }
15936 }
15937 intckFinalize(p, pStmt);
15938
15939 if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 1");
15940 return zRet;
15941}
15942
15943/*
15944** Open a new integrity-check object.
15945*/
15947 sqlite3 *db, /* Database handle to operate on */
15948 const char *zDbArg, /* "main", "temp" etc. */
15949 sqlite3_intck **ppOut /* OUT: New integrity-check handle */
15950){
15951 sqlite3_intck *pNew = 0;
15952 int rc = SQLITE_OK;
15953 const char *zDb = zDbArg ? zDbArg : "main";
15954 int nDb = (int)strlen(zDb);
15955
15956 pNew = (sqlite3_intck*)sqlite3_malloc(sizeof(*pNew) + nDb + 1);
15957 if( pNew==0 ){
15958 rc = SQLITE_NOMEM;
15959 }else{
15960 memset(pNew, 0, sizeof(*pNew));
15961 pNew->db = db;
15962 pNew->zDb = (const char*)&pNew[1];
15963 memcpy(&pNew[1], zDb, nDb+1);
15964 rc = sqlite3_create_function(db, "parse_create_index",
15966 );
15967 if( rc!=SQLITE_OK ){
15969 pNew = 0;
15970 }
15971 }
15972
15973 *ppOut = pNew;
15974 return rc;
15975}
15976
15977/*
15978** Free the integrity-check object.
15979*/
15980void sqlite3_intck_close(sqlite3_intck *p){
15981 if( p ){
15984 p->db, "parse_create_index", 1, SQLITE_UTF8, 0, 0, 0, 0
15985 );
15992 }
15993}
15994
15995/*
15996** Step the integrity-check object.
15997*/
15998int sqlite3_intck_step(sqlite3_intck *p){
15999 if( p->rc==SQLITE_OK ){
16000
16001 if( p->zMessage ){
16003 p->zMessage = 0;
16004 }
16005
16006 if( p->bCorruptSchema ){
16007 p->rc = SQLITE_DONE;
16008 }else
16009 if( p->pCheck==0 ){
16011 if( p->rc==SQLITE_OK ){
16012 if( p->zObj ){
16013 char *zSql = 0;
16015 p->pCheck = intckPrepare(p, zSql);
16016 sqlite3_free(zSql);
16018 p->zKey = 0;
16019 }else{
16020 p->rc = SQLITE_DONE;
16021 }
16022 }else if( p->rc==SQLITE_CORRUPT ){
16023 p->rc = SQLITE_OK;
16025 "corruption found while reading database schema"
16026 );
16027 p->bCorruptSchema = 1;
16028 }
16029 }
16030
16031 if( p->pCheck ){
16032 assert( p->rc==SQLITE_OK );
16034 /* Normal case, do nothing. */
16035 }else{
16037 p->pCheck = 0;
16038 p->nKeyVal = 0;
16039 if( p->rc==SQLITE_CORRUPT ){
16040 p->rc = SQLITE_OK;
16042 "corruption found while scanning database object %s", p->zObj
16043 );
16044 }
16045 }
16046 }
16047 }
16048
16049 return p->rc;
16050}
16051
16052/*
16053** Return a message describing the corruption encountered by the most recent
16054** call to sqlite3_intck_step(), or NULL if no corruption was encountered.
16055*/
16056const char *sqlite3_intck_message(sqlite3_intck *p){
16057 assert( p->pCheck==0 || p->zMessage==0 );
16058 if( p->zMessage ){
16059 return p->zMessage;
16060 }
16061 if( p->pCheck ){
16062 return (const char*)sqlite3_column_text(p->pCheck, 0);
16063 }
16064 return 0;
16065}
16066
16067/*
16068** Return the error code and message.
16069*/
16070int sqlite3_intck_error(sqlite3_intck *p, const char **pzErr){
16071 if( pzErr ) *pzErr = p->zErr;
16072 return (p->rc==SQLITE_DONE ? SQLITE_OK : p->rc);
16073}
16074
16075/*
16076** Close any read transaction the integrity-check object is holding open
16077** on the database.
16078*/
16079int sqlite3_intck_unlock(sqlite3_intck *p){
16080 if( p->rc==SQLITE_OK && p->pCheck ){
16081 assert( p->zKey==0 && p->nKeyVal>0 );
16084 p->pCheck = 0;
16085 }
16086 return p->rc;
16087}
16088
16089/*
16090** Return the SQL statement used to check object zObj. Or, if zObj is
16091** NULL, the current SQL statement.
16092*/
16093const char *sqlite3_intck_test_sql(sqlite3_intck *p, const char *zObj){
16095 if( zObj ){
16097 }else{
16098 if( p->zObj ){
16100 }else{
16102 p->zTestSql = 0;
16103 }
16104 }
16105 return p->zTestSql;
16106}
16107
16108/************************* End ../ext/intck/sqlite3intck.c ********************/
16109/************************* Begin ../ext/misc/stmtrand.c ******************/
16110/*
16111** 2024-05-24
16112**
16113** The author disclaims copyright to this source code. In place of
16114** a legal notice, here is a blessing:
16115**
16116** May you do good and not evil.
16117** May you find forgiveness for yourself and forgive others.
16118** May you share freely, never taking more than you give.
16119**
16120******************************************************************************
16121**
16122** An SQL function that return pseudo-random non-negative integers.
16123**
16124** SELECT stmtrand(123);
16125**
16126** A special feature of this function is that the same sequence of random
16127** integers is returned for each invocation of the statement. This makes
16128** the results repeatable, and hence useful for testing. The argument is
16129** an integer which is the seed for the random number sequence. The seed
16130** is used by the first invocation of this function only and is ignored
16131** for all subsequent calls within the same statement.
16132**
16133** Resetting a statement (sqlite3_reset()) also resets the random number
16134** sequence.
16135*/
16136/* #include "sqlite3ext.h" */
16138#include <assert.h>
16139#include <string.h>
16140
16141/* State of the pseudo-random number generator */
16142typedef struct Stmtrand {
16143 unsigned int x, y;
16144} Stmtrand;
16145
16146/* auxdata key */
16147#define STMTRAND_KEY (-4418371)
16148
16149/*
16150** Function: stmtrand(SEED)
16151**
16152** Return a pseudo-random number.
16153*/
16154static void stmtrandFunc(
16155 sqlite3_context *context,
16156 int argc,
16157 sqlite3_value **argv
16158){
16159 Stmtrand *p;
16160
16161 p = (Stmtrand*)sqlite3_get_auxdata(context, STMTRAND_KEY);
16162 if( p==0 ){
16163 unsigned int seed;
16164 p = sqlite3_malloc( sizeof(*p) );
16165 if( p==0 ){
16167 return;
16168 }
16169 if( argc>=1 ){
16170 seed = (unsigned int)sqlite3_value_int(argv[0]);
16171 }else{
16172 seed = 0;
16173 }
16174 p->x = seed | 1;
16175 p->y = seed;
16177 p = (Stmtrand*)sqlite3_get_auxdata(context, STMTRAND_KEY);
16178 if( p==0 ){
16180 return;
16181 }
16182 }
16183 p->x = (p->x>>1) ^ ((1+~(p->x&1)) & 0xd0000001);
16184 p->y = p->y*1103515245 + 12345;
16185 sqlite3_result_int(context, (int)((p->x ^ p->y)&0x7fffffff));
16186}
16187
16188#ifdef _WIN32
16189
16190#endif
16192 sqlite3 *db,
16193 char **pzErrMsg,
16194 const sqlite3_api_routines *pApi
16195){
16196 int rc = SQLITE_OK;
16198 (void)pzErrMsg; /* Unused parameter */
16199 rc = sqlite3_create_function(db, "stmtrand", 1, SQLITE_UTF8, 0,
16200 stmtrandFunc, 0, 0);
16201 if( rc==SQLITE_OK ){
16202 rc = sqlite3_create_function(db, "stmtrand", 0, SQLITE_UTF8, 0,
16203 stmtrandFunc, 0, 0);
16204 }
16205 return rc;
16206}
16207
16208/************************* End ../ext/misc/stmtrand.c ********************/
16209/************************* Begin ../ext/misc/vfstrace.c ******************/
16210/*
16211** 2011 March 16
16212**
16213** The author disclaims copyright to this source code. In place of
16214** a legal notice, here is a blessing:
16215**
16216** May you do good and not evil.
16217** May you find forgiveness for yourself and forgive others.
16218** May you share freely, never taking more than you give.
16219**
16220******************************************************************************
16221**
16222** This file contains code implements a VFS shim that writes diagnostic
16223** output for each VFS call, similar to "strace".
16224**
16225** USAGE:
16226**
16227** This source file exports a single symbol which is the name of a
16228** function:
16229**
16230** int vfstrace_register(
16231** const char *zTraceName, // Name of the newly constructed VFS
16232** const char *zOldVfsName, // Name of the underlying VFS
16233** int (*xOut)(const char*,void*), // Output routine. ex: fputs
16234** void *pOutArg, // 2nd argument to xOut. ex: stderr
16235** int makeDefault // Make the new VFS the default
16236** );
16237**
16238** Applications that want to trace their VFS usage must provide a callback
16239** function with this prototype:
16240**
16241** int traceOutput(const char *zMessage, void *pAppData);
16242**
16243** This function will "output" the trace messages, where "output" can
16244** mean different things to different applications. The traceOutput function
16245** for the command-line shell (see shell.c) is "fputs" from the standard
16246** library, which means that all trace output is written on the stream
16247** specified by the second argument. In the case of the command-line shell
16248** the second argument is stderr. Other applications might choose to output
16249** trace information to a file, over a socket, or write it into a buffer.
16250**
16251** The vfstrace_register() function creates a new "shim" VFS named by
16252** the zTraceName parameter. A "shim" VFS is an SQLite backend that does
16253** not really perform the duties of a true backend, but simply filters or
16254** interprets VFS calls before passing them off to another VFS which does
16255** the actual work. In this case the other VFS - the one that does the
16256** real work - is identified by the second parameter, zOldVfsName. If
16257** the 2nd parameter is NULL then the default VFS is used. The common
16258** case is for the 2nd parameter to be NULL.
16259**
16260** The third and fourth parameters are the pointer to the output function
16261** and the second argument to the output function. For the SQLite
16262** command-line shell, when the -vfstrace option is used, these parameters
16263** are fputs and stderr, respectively.
16264**
16265** The fifth argument is true (non-zero) to cause the newly created VFS
16266** to become the default VFS. The common case is for the fifth parameter
16267** to be true.
16268**
16269** The call to vfstrace_register() simply creates the shim VFS that does
16270** tracing. The application must also arrange to use the new VFS for
16271** all database connections that are created and for which tracing is
16272** desired. This can be done by specifying the trace VFS using URI filename
16273** notation, or by specifying the trace VFS as the 4th parameter to
16274** sqlite3_open_v2() or by making the trace VFS be the default (by setting
16275** the 5th parameter of vfstrace_register() to 1).
16276**
16277**
16278** ENABLING VFSTRACE IN A COMMAND-LINE SHELL
16279**
16280** The SQLite command line shell implemented by the shell.c source file
16281** can be used with this module. To compile in -vfstrace support, first
16282** gather this file (test_vfstrace.c), the shell source file (shell.c),
16283** and the SQLite amalgamation source files (sqlite3.c, sqlite3.h) into
16284** the working directory. Then compile using a command like the following:
16285**
16286** gcc -o sqlite3 -Os -I. -DSQLITE_ENABLE_VFSTRACE \
16287** -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE \
16288** -DHAVE_READLINE -DHAVE_USLEEP=1 \
16289** shell.c test_vfstrace.c sqlite3.c -ldl -lreadline -lncurses
16290**
16291** The gcc command above works on Linux and provides (in addition to the
16292** -vfstrace option) support for FTS3 and FTS4, RTREE, and command-line
16293** editing using the readline library. The command-line shell does not
16294** use threads so we added -DSQLITE_THREADSAFE=0 just to make the code
16295** run a little faster. For compiling on a Mac, you'll probably need
16296** to omit the -DHAVE_READLINE, the -lreadline, and the -lncurses options.
16297** The compilation could be simplified to just this:
16298**
16299** gcc -DSQLITE_ENABLE_VFSTRACE \
16300** shell.c test_vfstrace.c sqlite3.c -ldl -lpthread
16301**
16302** In this second example, all unnecessary options have been removed
16303** Note that since the code is now threadsafe, we had to add the -lpthread
16304** option to pull in the pthreads library.
16305**
16306** To cross-compile for windows using MinGW, a command like this might
16307** work:
16308**
16309** /opt/mingw/bin/i386-mingw32msvc-gcc -o sqlite3.exe -Os -I \
16310** -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_VFSTRACE \
16311** shell.c test_vfstrace.c sqlite3.c
16312**
16313** Similar compiler commands will work on different systems. The key
16314** invariants are (1) you must have -DSQLITE_ENABLE_VFSTRACE so that
16315** the shell.c source file will know to include the -vfstrace command-line
16316** option and (2) you must compile and link the three source files
16317** shell,c, test_vfstrace.c, and sqlite3.c.
16318**
16319** RUNTIME CONTROL OF VFSTRACE OUTPUT
16320**
16321** The application can use the "vfstrace" pragma to control which VFS
16322** APIs are traced. To disable all output:
16323**
16324** PRAGMA vfstrace('-all');
16325**
16326** To enable all output (which is the default setting):
16327**
16328** PRAGMA vfstrace('+all');
16329**
16330** Individual APIs can be enabled or disabled by name, with or without
16331** the initial "x" character. For example, to set up for tracing lock
16332** primitives only:
16333**
16334** PRAGMA vfstrace('-all, +Lock,Unlock,ShmLock');
16335**
16336** The argument to the vfstrace pragma ignores capitalization and any
16337** characters other than alphabetics, '+', and '-'.
16338*/
16339#include <stdlib.h>
16340#include <string.h>
16341/* #include "sqlite3.h" */
16342
16343/*
16344** An instance of this structure is attached to the each trace VFS to
16345** provide auxiliary information.
16346*/
16347typedef struct vfstrace_info vfstrace_info;
16349 sqlite3_vfs *pRootVfs; /* The underlying real VFS */
16350 int (*xOut)(const char*, void*); /* Send output here */
16351 unsigned int mTrace; /* Mask of interfaces to trace */
16352 u8 bOn; /* Tracing on/off */
16353 void *pOutArg; /* First argument to xOut */
16354 const char *zVfsName; /* Name of this trace-VFS */
16355 sqlite3_vfs *pTraceVfs; /* Pointer back to the trace VFS */
16356};
16357
16358/*
16359** The sqlite3_file object for the trace VFS
16360*/
16361typedef struct vfstrace_file vfstrace_file;
16363 sqlite3_file base; /* Base class. Must be first */
16364 vfstrace_info *pInfo; /* The trace-VFS to which this file belongs */
16365 const char *zFName; /* Base name of the file */
16366 sqlite3_file *pReal; /* The real underlying file */
16367};
16368
16369/*
16370** Bit values for vfstrace_info.mTrace.
16371*/
16372#define VTR_CLOSE 0x00000001
16373#define VTR_READ 0x00000002
16374#define VTR_WRITE 0x00000004
16375#define VTR_TRUNC 0x00000008
16376#define VTR_SYNC 0x00000010
16377#define VTR_FSIZE 0x00000020
16378#define VTR_LOCK 0x00000040
16379#define VTR_UNLOCK 0x00000080
16380#define VTR_CRL 0x00000100
16381#define VTR_FCTRL 0x00000200
16382#define VTR_SECSZ 0x00000400
16383#define VTR_DEVCHAR 0x00000800
16384#define VTR_SHMLOCK 0x00001000
16385#define VTR_SHMMAP 0x00002000
16386#define VTR_SHMBAR 0x00004000
16387#define VTR_SHMUNMAP 0x00008000
16388#define VTR_OPEN 0x00010000
16389#define VTR_DELETE 0x00020000
16390#define VTR_ACCESS 0x00040000
16391#define VTR_FULLPATH 0x00080000
16392#define VTR_DLOPEN 0x00100000
16393#define VTR_DLERR 0x00200000
16394#define VTR_DLSYM 0x00400000
16395#define VTR_DLCLOSE 0x00800000
16396#define VTR_RAND 0x01000000
16397#define VTR_SLEEP 0x02000000
16398#define VTR_CURTIME 0x04000000
16399#define VTR_LASTERR 0x08000000
16400#define VTR_FETCH 0x10000000 /* Also coverse xUnfetch */
16401
16402/*
16403** Method declarations for vfstrace_file.
16404*/
16405static int vfstraceClose(sqlite3_file*);
16406static int vfstraceRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
16407static int vfstraceWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64);
16408static int vfstraceTruncate(sqlite3_file*, sqlite3_int64 size);
16409static int vfstraceSync(sqlite3_file*, int flags);
16410static int vfstraceFileSize(sqlite3_file*, sqlite3_int64 *pSize);
16411static int vfstraceLock(sqlite3_file*, int);
16412static int vfstraceUnlock(sqlite3_file*, int);
16413static int vfstraceCheckReservedLock(sqlite3_file*, int *);
16414static int vfstraceFileControl(sqlite3_file*, int op, void *pArg);
16415static int vfstraceSectorSize(sqlite3_file*);
16416static int vfstraceDeviceCharacteristics(sqlite3_file*);
16417static int vfstraceShmLock(sqlite3_file*,int,int,int);
16418static int vfstraceShmMap(sqlite3_file*,int,int,int, void volatile **);
16419static void vfstraceShmBarrier(sqlite3_file*);
16420static int vfstraceShmUnmap(sqlite3_file*,int);
16421
16422/*
16423** Method declarations for vfstrace_vfs.
16424*/
16425static int vfstraceOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
16426static int vfstraceDelete(sqlite3_vfs*, const char *zName, int syncDir);
16427static int vfstraceAccess(sqlite3_vfs*, const char *zName, int flags, int *);
16428static int vfstraceFullPathname(sqlite3_vfs*, const char *zName, int, char *);
16429static void *vfstraceDlOpen(sqlite3_vfs*, const char *zFilename);
16430static void vfstraceDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
16431static void (*vfstraceDlSym(sqlite3_vfs*,void*, const char *zSymbol))(void);
16432static void vfstraceDlClose(sqlite3_vfs*, void*);
16433static int vfstraceRandomness(sqlite3_vfs*, int nByte, char *zOut);
16434static int vfstraceSleep(sqlite3_vfs*, int microseconds);
16435static int vfstraceCurrentTime(sqlite3_vfs*, double*);
16436static int vfstraceGetLastError(sqlite3_vfs*, int, char*);
16437static int vfstraceCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
16438static int vfstraceSetSystemCall(sqlite3_vfs*,const char*, sqlite3_syscall_ptr);
16439static sqlite3_syscall_ptr vfstraceGetSystemCall(sqlite3_vfs*, const char *);
16440static const char *vfstraceNextSystemCall(sqlite3_vfs*, const char *zName);
16441
16442/*
16443** Return a pointer to the tail of the pathname. Examples:
16444**
16445** /home/drh/xyzzy.txt -> xyzzy.txt
16446** xyzzy.txt -> xyzzy.txt
16447*/
16448static const char *fileTail(const char *z){
16449 size_t i;
16450 if( z==0 ) return 0;
16451 i = strlen(z)-1;
16452 while( i>0 && z[i-1]!='/' ){ i--; }
16453 return &z[i];
16454}
16455
16456/*
16457** Send trace output defined by zFormat and subsequent arguments.
16458*/
16460 vfstrace_info *pInfo,
16461 const char *zFormat,
16462 ...
16463){
16464 va_list ap;
16465 char *zMsg;
16466 if( pInfo->bOn ){
16467 va_start(ap, zFormat);
16468 zMsg = sqlite3_vmprintf(zFormat, ap);
16469 va_end(ap);
16470 pInfo->xOut(zMsg, pInfo->pOutArg);
16471 sqlite3_free(zMsg);
16472 }
16473}
16474
16475/*
16476** Try to convert an error code into a symbolic name for that error code.
16477*/
16478static const char *vfstrace_errcode_name(int rc ){
16479 const char *zVal = 0;
16480 switch( rc ){
16481 case SQLITE_OK: zVal = "SQLITE_OK"; break;
16482 case SQLITE_INTERNAL: zVal = "SQLITE_INTERNAL"; break;
16483 case SQLITE_ERROR: zVal = "SQLITE_ERROR"; break;
16484 case SQLITE_PERM: zVal = "SQLITE_PERM"; break;
16485 case SQLITE_ABORT: zVal = "SQLITE_ABORT"; break;
16486 case SQLITE_BUSY: zVal = "SQLITE_BUSY"; break;
16487 case SQLITE_LOCKED: zVal = "SQLITE_LOCKED"; break;
16488 case SQLITE_NOMEM: zVal = "SQLITE_NOMEM"; break;
16489 case SQLITE_READONLY: zVal = "SQLITE_READONLY"; break;
16490 case SQLITE_INTERRUPT: zVal = "SQLITE_INTERRUPT"; break;
16491 case SQLITE_IOERR: zVal = "SQLITE_IOERR"; break;
16492 case SQLITE_CORRUPT: zVal = "SQLITE_CORRUPT"; break;
16493 case SQLITE_NOTFOUND: zVal = "SQLITE_NOTFOUND"; break;
16494 case SQLITE_FULL: zVal = "SQLITE_FULL"; break;
16495 case SQLITE_CANTOPEN: zVal = "SQLITE_CANTOPEN"; break;
16496 case SQLITE_PROTOCOL: zVal = "SQLITE_PROTOCOL"; break;
16497 case SQLITE_EMPTY: zVal = "SQLITE_EMPTY"; break;
16498 case SQLITE_SCHEMA: zVal = "SQLITE_SCHEMA"; break;
16499 case SQLITE_TOOBIG: zVal = "SQLITE_TOOBIG"; break;
16500 case SQLITE_CONSTRAINT: zVal = "SQLITE_CONSTRAINT"; break;
16501 case SQLITE_MISMATCH: zVal = "SQLITE_MISMATCH"; break;
16502 case SQLITE_MISUSE: zVal = "SQLITE_MISUSE"; break;
16503 case SQLITE_NOLFS: zVal = "SQLITE_NOLFS"; break;
16504 case SQLITE_IOERR_READ: zVal = "SQLITE_IOERR_READ"; break;
16505 case SQLITE_IOERR_SHORT_READ: zVal = "SQLITE_IOERR_SHORT_READ"; break;
16506 case SQLITE_IOERR_WRITE: zVal = "SQLITE_IOERR_WRITE"; break;
16507 case SQLITE_IOERR_FSYNC: zVal = "SQLITE_IOERR_FSYNC"; break;
16508 case SQLITE_IOERR_DIR_FSYNC: zVal = "SQLITE_IOERR_DIR_FSYNC"; break;
16509 case SQLITE_IOERR_TRUNCATE: zVal = "SQLITE_IOERR_TRUNCATE"; break;
16510 case SQLITE_IOERR_FSTAT: zVal = "SQLITE_IOERR_FSTAT"; break;
16511 case SQLITE_IOERR_UNLOCK: zVal = "SQLITE_IOERR_UNLOCK"; break;
16512 case SQLITE_IOERR_RDLOCK: zVal = "SQLITE_IOERR_RDLOCK"; break;
16513 case SQLITE_IOERR_DELETE: zVal = "SQLITE_IOERR_DELETE"; break;
16514 case SQLITE_IOERR_BLOCKED: zVal = "SQLITE_IOERR_BLOCKED"; break;
16515 case SQLITE_IOERR_NOMEM: zVal = "SQLITE_IOERR_NOMEM"; break;
16516 case SQLITE_IOERR_ACCESS: zVal = "SQLITE_IOERR_ACCESS"; break;
16518 zVal = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break;
16519 case SQLITE_IOERR_LOCK: zVal = "SQLITE_IOERR_LOCK"; break;
16520 case SQLITE_IOERR_CLOSE: zVal = "SQLITE_IOERR_CLOSE"; break;
16521 case SQLITE_IOERR_DIR_CLOSE: zVal = "SQLITE_IOERR_DIR_CLOSE"; break;
16522 case SQLITE_IOERR_SHMOPEN: zVal = "SQLITE_IOERR_SHMOPEN"; break;
16523 case SQLITE_IOERR_SHMSIZE: zVal = "SQLITE_IOERR_SHMSIZE"; break;
16524 case SQLITE_IOERR_SHMLOCK: zVal = "SQLITE_IOERR_SHMLOCK"; break;
16525 case SQLITE_IOERR_SHMMAP: zVal = "SQLITE_IOERR_SHMMAP"; break;
16526 case SQLITE_IOERR_SEEK: zVal = "SQLITE_IOERR_SEEK"; break;
16527 case SQLITE_IOERR_GETTEMPPATH: zVal = "SQLITE_IOERR_GETTEMPPATH"; break;
16528 case SQLITE_IOERR_CONVPATH: zVal = "SQLITE_IOERR_CONVPATH"; break;
16529 case SQLITE_READONLY_DBMOVED: zVal = "SQLITE_READONLY_DBMOVED"; break;
16530 case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break;
16531 case SQLITE_BUSY_RECOVERY: zVal = "SQLITE_BUSY_RECOVERY"; break;
16532 case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break;
16533 }
16534 return zVal;
16535}
16536
16537/*
16538** Convert value rc into a string and print it using zFormat. zFormat
16539** should have exactly one %s
16540*/
16542 vfstrace_info *pInfo,
16543 const char *zFormat,
16544 int rc
16545){
16546 const char *zVal;
16547 char zBuf[50];
16548 zVal = vfstrace_errcode_name(rc);
16549 if( zVal==0 ){
16550 zVal = vfstrace_errcode_name(rc&0xff);
16551 if( zVal ){
16552 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s | 0x%x", zVal, rc&0xffff00);
16553 }else{
16554 sqlite3_snprintf(sizeof(zBuf), zBuf, "%d (0x%x)", rc, rc);
16555 }
16556 zVal = zBuf;
16557 }
16558 vfstrace_printf(pInfo, zFormat, zVal);
16559}
16560
16561/*
16562** Append to a buffer.
16563*/
16564static void strappend(char *z, int *pI, const char *zAppend){
16565 int i = *pI;
16566 while( zAppend[0] ){ z[i++] = *(zAppend++); }
16567 z[i] = 0;
16568 *pI = i;
16569}
16570
16571/*
16572** Turn tracing output on or off according to mMask.
16573*/
16574static void vfstraceOnOff(vfstrace_info *pInfo, unsigned int mMask){
16575 pInfo->bOn = (pInfo->mTrace & mMask)!=0;
16576}
16577
16578/*
16579** Close an vfstrace-file.
16580*/
16581static int vfstraceClose(sqlite3_file *pFile){
16582 vfstrace_file *p = (vfstrace_file *)pFile;
16583 vfstrace_info *pInfo = p->pInfo;
16584 int rc;
16586 vfstrace_printf(pInfo, "%s.xClose(%s)", pInfo->zVfsName, p->zFName);
16588 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16589 if( rc==SQLITE_OK ){
16591 p->base.pMethods = 0;
16592 }
16593 return rc;
16594}
16595
16596/*
16597** Read data from an vfstrace-file.
16598*/
16599static int vfstraceRead(
16600 sqlite3_file *pFile,
16601 void *zBuf,
16602 int iAmt,
16603 sqlite_int64 iOfst
16604){
16605 vfstrace_file *p = (vfstrace_file *)pFile;
16606 vfstrace_info *pInfo = p->pInfo;
16607 int rc;
16609 vfstrace_printf(pInfo, "%s.xRead(%s,n=%d,ofst=%lld)",
16610 pInfo->zVfsName, p->zFName, iAmt, iOfst);
16611 rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst);
16612 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16613 return rc;
16614}
16615
16616/*
16617** Write data to an vfstrace-file.
16618*/
16619static int vfstraceWrite(
16620 sqlite3_file *pFile,
16621 const void *zBuf,
16622 int iAmt,
16623 sqlite_int64 iOfst
16624){
16625 vfstrace_file *p = (vfstrace_file *)pFile;
16626 vfstrace_info *pInfo = p->pInfo;
16627 int rc;
16629 vfstrace_printf(pInfo, "%s.xWrite(%s,n=%d,ofst=%lld)",
16630 pInfo->zVfsName, p->zFName, iAmt, iOfst);
16631 rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst);
16632 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16633 return rc;
16634}
16635
16636/*
16637** Truncate an vfstrace-file.
16638*/
16639static int vfstraceTruncate(sqlite3_file *pFile, sqlite_int64 size){
16640 vfstrace_file *p = (vfstrace_file *)pFile;
16641 vfstrace_info *pInfo = p->pInfo;
16642 int rc;
16644 vfstrace_printf(pInfo, "%s.xTruncate(%s,%lld)", pInfo->zVfsName, p->zFName,
16645 size);
16647 vfstrace_printf(pInfo, " -> %d\n", rc);
16648 return rc;
16649}
16650
16651/*
16652** Sync an vfstrace-file.
16653*/
16654static int vfstraceSync(sqlite3_file *pFile, int flags){
16655 vfstrace_file *p = (vfstrace_file *)pFile;
16656 vfstrace_info *pInfo = p->pInfo;
16657 int rc;
16658 int i;
16659 char zBuf[100];
16660 memcpy(zBuf, "|0", 3);
16661 i = 0;
16662 if( flags & SQLITE_SYNC_FULL ) strappend(zBuf, &i, "|FULL");
16663 else if( flags & SQLITE_SYNC_NORMAL ) strappend(zBuf, &i, "|NORMAL");
16664 if( flags & SQLITE_SYNC_DATAONLY ) strappend(zBuf, &i, "|DATAONLY");
16665 if( flags & ~(SQLITE_SYNC_FULL|SQLITE_SYNC_DATAONLY) ){
16666 sqlite3_snprintf(sizeof(zBuf)-i, &zBuf[i], "|0x%x", flags);
16667 }
16669 vfstrace_printf(pInfo, "%s.xSync(%s,%s)", pInfo->zVfsName, p->zFName,
16670 &zBuf[1]);
16672 vfstrace_printf(pInfo, " -> %d\n", rc);
16673 return rc;
16674}
16675
16676/*
16677** Return the current file-size of an vfstrace-file.
16678*/
16679static int vfstraceFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
16680 vfstrace_file *p = (vfstrace_file *)pFile;
16681 vfstrace_info *pInfo = p->pInfo;
16682 int rc;
16684 vfstrace_printf(pInfo, "%s.xFileSize(%s)", pInfo->zVfsName, p->zFName);
16686 vfstrace_print_errcode(pInfo, " -> %s,", rc);
16687 vfstrace_printf(pInfo, " size=%lld\n", *pSize);
16688 return rc;
16689}
16690
16691/*
16692** Return the name of a lock.
16693*/
16694static const char *lockName(int eLock){
16695 const char *azLockNames[] = {
16696 "NONE", "SHARED", "RESERVED", "PENDING", "EXCLUSIVE"
16697 };
16698 if( eLock<0 || eLock>=(int)(sizeof(azLockNames)/sizeof(azLockNames[0])) ){
16699 return "???";
16700 }else{
16701 return azLockNames[eLock];
16702 }
16703}
16704
16705/*
16706** Lock an vfstrace-file.
16707*/
16708static int vfstraceLock(sqlite3_file *pFile, int eLock){
16709 vfstrace_file *p = (vfstrace_file *)pFile;
16710 vfstrace_info *pInfo = p->pInfo;
16711 int rc;
16713 vfstrace_printf(pInfo, "%s.xLock(%s,%s)", pInfo->zVfsName, p->zFName,
16714 lockName(eLock));
16716 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16717 return rc;
16718}
16719
16720/*
16721** Unlock an vfstrace-file.
16722*/
16723static int vfstraceUnlock(sqlite3_file *pFile, int eLock){
16724 vfstrace_file *p = (vfstrace_file *)pFile;
16725 vfstrace_info *pInfo = p->pInfo;
16726 int rc;
16728 vfstrace_printf(pInfo, "%s.xUnlock(%s,%s)", pInfo->zVfsName, p->zFName,
16729 lockName(eLock));
16731 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16732 return rc;
16733}
16734
16735/*
16736** Check if another file-handle holds a RESERVED lock on an vfstrace-file.
16737*/
16738static int vfstraceCheckReservedLock(sqlite3_file *pFile, int *pResOut){
16739 vfstrace_file *p = (vfstrace_file *)pFile;
16740 vfstrace_info *pInfo = p->pInfo;
16741 int rc;
16743 vfstrace_printf(pInfo, "%s.xCheckReservedLock(%s,%d)",
16744 pInfo->zVfsName, p->zFName);
16746 vfstrace_print_errcode(pInfo, " -> %s", rc);
16747 vfstrace_printf(pInfo, ", out=%d\n", *pResOut);
16748 return rc;
16749}
16750
16751/*
16752** File control method. For custom operations on an vfstrace-file.
16753*/
16754static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){
16755 vfstrace_file *p = (vfstrace_file *)pFile;
16756 vfstrace_info *pInfo = p->pInfo;
16757 int rc;
16758 char zBuf[100];
16759 char zBuf2[100];
16760 char *zOp;
16761 char *zRVal = 0;
16763 switch( op ){
16764 case SQLITE_FCNTL_LOCKSTATE: zOp = "LOCKSTATE"; break;
16765 case SQLITE_GET_LOCKPROXYFILE: zOp = "GET_LOCKPROXYFILE"; break;
16766 case SQLITE_SET_LOCKPROXYFILE: zOp = "SET_LOCKPROXYFILE"; break;
16767 case SQLITE_LAST_ERRNO: zOp = "LAST_ERRNO"; break;
16769 sqlite3_snprintf(sizeof(zBuf), zBuf, "SIZE_HINT,%lld",
16770 *(sqlite3_int64*)pArg);
16771 zOp = zBuf;
16772 break;
16773 }
16775 sqlite3_snprintf(sizeof(zBuf), zBuf, "CHUNK_SIZE,%d", *(int*)pArg);
16776 zOp = zBuf;
16777 break;
16778 }
16779 case SQLITE_FCNTL_FILE_POINTER: zOp = "FILE_POINTER"; break;
16780 case SQLITE_FCNTL_WIN32_AV_RETRY: zOp = "WIN32_AV_RETRY"; break;
16782 sqlite3_snprintf(sizeof(zBuf), zBuf, "PERSIST_WAL,%d", *(int*)pArg);
16783 zOp = zBuf;
16784 break;
16785 }
16786 case SQLITE_FCNTL_OVERWRITE: zOp = "OVERWRITE"; break;
16787 case SQLITE_FCNTL_VFSNAME: zOp = "VFSNAME"; break;
16788 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: zOp = "POWERSAFE_OVERWRITE"; break;
16789 case SQLITE_FCNTL_PRAGMA: {
16790 const char *const* a = (const char*const*)pArg;
16791 if( a[1] && strcmp(a[1],"vfstrace")==0 && a[2] ){
16792 const u8 *zArg = (const u8*)a[2];
16793 if( zArg[0]>='0' && zArg[0]<='9' ){
16794 pInfo->mTrace = (sqlite3_uint64)strtoll(a[2], 0, 0);
16795 }else{
16796 static const struct {
16797 const char *z;
16798 unsigned int m;
16799 } aKw[] = {
16800 { "all", 0xffffffff },
16801 { "close", VTR_CLOSE },
16802 { "read", VTR_READ },
16803 { "write", VTR_WRITE },
16804 { "truncate", VTR_TRUNC },
16805 { "sync", VTR_SYNC },
16806 { "filesize", VTR_FSIZE },
16807 { "lock", VTR_LOCK },
16808 { "unlock", VTR_UNLOCK },
16809 { "checkreservedlock", VTR_CRL },
16810 { "filecontrol", VTR_FCTRL },
16811 { "sectorsize", VTR_SECSZ },
16812 { "devicecharacteristics", VTR_DEVCHAR },
16813 { "shmlock", VTR_SHMLOCK },
16814 { "shmmap", VTR_SHMMAP },
16815 { "shmummap", VTR_SHMUNMAP },
16816 { "shmbarrier", VTR_SHMBAR },
16817 { "open", VTR_OPEN },
16818 { "delete", VTR_DELETE },
16819 { "access", VTR_ACCESS },
16820 { "fullpathname", VTR_FULLPATH },
16821 { "dlopen", VTR_DLOPEN },
16822 { "dlerror", VTR_DLERR },
16823 { "dlsym", VTR_DLSYM },
16824 { "dlclose", VTR_DLCLOSE },
16825 { "randomness", VTR_RAND },
16826 { "sleep", VTR_SLEEP },
16827 { "currenttime", VTR_CURTIME },
16828 { "currenttimeint64", VTR_CURTIME },
16829 { "getlasterror", VTR_LASTERR },
16830 { "fetch", VTR_FETCH },
16831 };
16832 int onOff = 1;
16833 while( zArg[0] ){
16834 int jj, n;
16835 while( zArg[0]!=0 && zArg[0]!='-' && zArg[0]!='+'
16836 && !isalpha(zArg[0]) ) zArg++;
16837 if( zArg[0]==0 ) break;
16838 if( zArg[0]=='-' ){
16839 onOff = 0;
16840 zArg++;
16841 }else if( zArg[0]=='+' ){
16842 onOff = 1;
16843 zArg++;
16844 }
16845 while( !isalpha(zArg[0]) ){
16846 if( zArg[0]==0 ) break;
16847 zArg++;
16848 }
16849 if( zArg[0]=='x' && isalpha(zArg[1]) ) zArg++;
16850 for(n=0; isalpha(zArg[n]); n++){}
16851 for(jj=0; jj<(int)(sizeof(aKw)/sizeof(aKw[0])); jj++){
16852 if( sqlite3_strnicmp(aKw[jj].z,(const char*)zArg,n)==0 ){
16853 if( onOff ){
16854 pInfo->mTrace |= aKw[jj].m;
16855 }else{
16856 pInfo->mTrace &= ~aKw[jj].m;
16857 }
16858 break;
16859 }
16860 }
16861 zArg += n;
16862 }
16863 }
16864 }
16865 sqlite3_snprintf(sizeof(zBuf), zBuf, "PRAGMA,[%s,%s]",a[1],a[2]);
16866 zOp = zBuf;
16867 break;
16868 }
16869 case SQLITE_FCNTL_BUSYHANDLER: zOp = "BUSYHANDLER"; break;
16870 case SQLITE_FCNTL_TEMPFILENAME: zOp = "TEMPFILENAME"; break;
16872 sqlite3_int64 iMMap = *(sqlite3_int64*)pArg;
16873 sqlite3_snprintf(sizeof(zBuf), zBuf, "MMAP_SIZE,%lld",iMMap);
16874 zOp = zBuf;
16875 break;
16876 }
16877 case SQLITE_FCNTL_TRACE: zOp = "TRACE"; break;
16878 case SQLITE_FCNTL_HAS_MOVED: zOp = "HAS_MOVED"; break;
16879 case SQLITE_FCNTL_SYNC: zOp = "SYNC"; break;
16880 case SQLITE_FCNTL_COMMIT_PHASETWO: zOp = "COMMIT_PHASETWO"; break;
16881 case SQLITE_FCNTL_WIN32_SET_HANDLE: zOp = "WIN32_SET_HANDLE"; break;
16882 case SQLITE_FCNTL_WAL_BLOCK: zOp = "WAL_BLOCK"; break;
16883 case SQLITE_FCNTL_ZIPVFS: zOp = "ZIPVFS"; break;
16884 case SQLITE_FCNTL_RBU: zOp = "RBU"; break;
16885 case SQLITE_FCNTL_VFS_POINTER: zOp = "VFS_POINTER"; break;
16886 case SQLITE_FCNTL_JOURNAL_POINTER: zOp = "JOURNAL_POINTER"; break;
16887 case SQLITE_FCNTL_WIN32_GET_HANDLE: zOp = "WIN32_GET_HANDLE"; break;
16888 case SQLITE_FCNTL_PDB: zOp = "PDB"; break;
16889 case SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: zOp = "BEGIN_ATOMIC_WRITE"; break;
16890 case SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: zOp = "COMMIT_ATOMIC_WRITE"; break;
16892 zOp = "ROLLBACK_ATOMIC_WRITE";
16893 break;
16894 }
16896 sqlite3_snprintf(sizeof(zBuf), zBuf, "LOCK_TIMEOUT,%d", *(int*)pArg);
16897 zOp = zBuf;
16898 break;
16899 }
16900 case SQLITE_FCNTL_DATA_VERSION: zOp = "DATA_VERSION"; break;
16901 case SQLITE_FCNTL_SIZE_LIMIT: zOp = "SIZE_LIMIT"; break;
16902 case SQLITE_FCNTL_CKPT_DONE: zOp = "CKPT_DONE"; break;
16903 case SQLITE_FCNTL_RESERVE_BYTES: zOp = "RESERVED_BYTES"; break;
16904 case SQLITE_FCNTL_CKPT_START: zOp = "CKPT_START"; break;
16905 case SQLITE_FCNTL_EXTERNAL_READER: zOp = "EXTERNAL_READER"; break;
16906 case SQLITE_FCNTL_CKSM_FILE: zOp = "CKSM_FILE"; break;
16907 case SQLITE_FCNTL_RESET_CACHE: zOp = "RESET_CACHE"; break;
16908 case 0xca093fa0: zOp = "DB_UNCHANGED"; break;
16909 default: {
16910 sqlite3_snprintf(sizeof zBuf, zBuf, "%d", op);
16911 zOp = zBuf;
16912 break;
16913 }
16914 }
16915 vfstrace_printf(pInfo, "%s.xFileControl(%s,%s)",
16916 pInfo->zVfsName, p->zFName, zOp);
16918 if( rc==SQLITE_OK ){
16919 switch( op ){
16920 case SQLITE_FCNTL_VFSNAME: {
16921 *(char**)pArg = sqlite3_mprintf("vfstrace.%s/%z",
16922 pInfo->zVfsName, *(char**)pArg);
16923 zRVal = *(char**)pArg;
16924 break;
16925 }
16927 sqlite3_snprintf(sizeof(zBuf2), zBuf2, "%lld", *(sqlite3_int64*)pArg);
16928 zRVal = zBuf2;
16929 break;
16930 }
16933 sqlite3_snprintf(sizeof(zBuf2), zBuf2, "%d", *(int*)pArg);
16934 zRVal = zBuf2;
16935 break;
16936 }
16939 zRVal = *(char**)pArg;
16940 break;
16941 }
16942 }
16943 }
16944 if( zRVal ){
16945 vfstrace_print_errcode(pInfo, " -> %s", rc);
16946 vfstrace_printf(pInfo, ", %s\n", zRVal);
16947 }else{
16948 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
16949 }
16950 return rc;
16951}
16952
16953/*
16954** Return the sector-size in bytes for an vfstrace-file.
16955*/
16956static int vfstraceSectorSize(sqlite3_file *pFile){
16957 vfstrace_file *p = (vfstrace_file *)pFile;
16958 vfstrace_info *pInfo = p->pInfo;
16959 int rc;
16961 vfstrace_printf(pInfo, "%s.xSectorSize(%s)", pInfo->zVfsName, p->zFName);
16963 vfstrace_printf(pInfo, " -> %d\n", rc);
16964 return rc;
16965}
16966
16967/*
16968** Return the device characteristic flags supported by an vfstrace-file.
16969*/
16970static int vfstraceDeviceCharacteristics(sqlite3_file *pFile){
16971 vfstrace_file *p = (vfstrace_file *)pFile;
16972 vfstrace_info *pInfo = p->pInfo;
16973 int rc;
16975 vfstrace_printf(pInfo, "%s.xDeviceCharacteristics(%s)",
16976 pInfo->zVfsName, p->zFName);
16978 vfstrace_printf(pInfo, " -> 0x%08x\n", rc);
16979 return rc;
16980}
16981
16982/*
16983** Shared-memory operations.
16984*/
16985static int vfstraceShmLock(sqlite3_file *pFile, int ofst, int n, int flags){
16986 static const char *azLockName[] = {
16987 "WRITE",
16988 "CKPT",
16989 "RECOVER",
16990 "READ0",
16991 "READ1",
16992 "READ2",
16993 "READ3",
16994 "READ4",
16995 };
16996 vfstrace_file *p = (vfstrace_file *)pFile;
16997 vfstrace_info *pInfo = p->pInfo;
16998 int rc;
16999 char zLck[100];
17000 int i = 0;
17002 memcpy(zLck, "|0", 3);
17003 if( flags & SQLITE_SHM_UNLOCK ) strappend(zLck, &i, "|UNLOCK");
17004 if( flags & SQLITE_SHM_LOCK ) strappend(zLck, &i, "|LOCK");
17005 if( flags & SQLITE_SHM_SHARED ) strappend(zLck, &i, "|SHARED");
17006 if( flags & SQLITE_SHM_EXCLUSIVE ) strappend(zLck, &i, "|EXCLUSIVE");
17007 if( flags & ~(0xf) ){
17008 sqlite3_snprintf(sizeof(zLck)-i, &zLck[i], "|0x%x", flags);
17009 }
17010 if( ofst>=0 && ofst<(int)(sizeof(azLockName)/sizeof(azLockName[0])) ){
17011 vfstrace_printf(pInfo, "%s.xShmLock(%s,ofst=%d(%s),n=%d,%s)",
17012 pInfo->zVfsName, p->zFName, ofst, azLockName[ofst],
17013 n, &zLck[1]);
17014 }else{
17015 vfstrace_printf(pInfo, "%s.xShmLock(%s,ofst=5d,n=%d,%s)",
17016 pInfo->zVfsName, p->zFName, ofst,
17017 n, &zLck[1]);
17018 }
17019 rc = p->pReal->pMethods->xShmLock(p->pReal, ofst, n, flags);
17020 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17021 return rc;
17022}
17024 sqlite3_file *pFile,
17025 int iRegion,
17026 int szRegion,
17027 int isWrite,
17028 void volatile **pp
17029){
17030 vfstrace_file *p = (vfstrace_file *)pFile;
17031 vfstrace_info *pInfo = p->pInfo;
17032 int rc;
17034 vfstrace_printf(pInfo, "%s.xShmMap(%s,iRegion=%d,szRegion=%d,isWrite=%d,*)",
17035 pInfo->zVfsName, p->zFName, iRegion, szRegion, isWrite);
17036 rc = p->pReal->pMethods->xShmMap(p->pReal, iRegion, szRegion, isWrite, pp);
17037 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17038 return rc;
17039}
17040static void vfstraceShmBarrier(sqlite3_file *pFile){
17041 vfstrace_file *p = (vfstrace_file *)pFile;
17042 vfstrace_info *pInfo = p->pInfo;
17044 vfstrace_printf(pInfo, "%s.xShmBarrier(%s)\n", pInfo->zVfsName, p->zFName);
17046}
17047static int vfstraceShmUnmap(sqlite3_file *pFile, int delFlag){
17048 vfstrace_file *p = (vfstrace_file *)pFile;
17049 vfstrace_info *pInfo = p->pInfo;
17050 int rc;
17052 vfstrace_printf(pInfo, "%s.xShmUnmap(%s,delFlag=%d)",
17053 pInfo->zVfsName, p->zFName, delFlag);
17055 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17056 return rc;
17057}
17058static int vfstraceFetch(sqlite3_file *pFile, i64 iOff, int nAmt, void **pptr){
17059 vfstrace_file *p = (vfstrace_file *)pFile;
17060 vfstrace_info *pInfo = p->pInfo;
17061 int rc;
17063 vfstrace_printf(pInfo, "%s.xFetch(%s,iOff=%lld,nAmt=%d,p=%p)",
17064 pInfo->zVfsName, p->zFName, iOff, nAmt, *pptr);
17065 rc = p->pReal->pMethods->xFetch(p->pReal, iOff, nAmt, pptr);
17066 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17067 return rc;
17068}
17069static int vfstraceUnfetch(sqlite3_file *pFile, i64 iOff, void *ptr){
17070 vfstrace_file *p = (vfstrace_file *)pFile;
17071 vfstrace_info *pInfo = p->pInfo;
17072 int rc;
17074 vfstrace_printf(pInfo, "%s.xUnfetch(%s,iOff=%lld,p=%p)",
17075 pInfo->zVfsName, p->zFName, iOff, ptr);
17077 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17078 return rc;
17079}
17080
17081
17082/*
17083** Open an vfstrace file handle.
17084*/
17085static int vfstraceOpen(
17086 sqlite3_vfs *pVfs,
17087 const char *zName,
17088 sqlite3_file *pFile,
17089 int flags,
17090 int *pOutFlags
17091){
17092 int rc;
17093 vfstrace_file *p = (vfstrace_file *)pFile;
17094 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17095 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17096 p->pInfo = pInfo;
17097 p->zFName = zName ? fileTail(zName) : "<temp>";
17098 p->pReal = (sqlite3_file *)&p[1];
17099 rc = pRoot->xOpen(pRoot, zName, p->pReal, flags, pOutFlags);
17101 vfstrace_printf(pInfo, "%s.xOpen(%s,flags=0x%x)",
17102 pInfo->zVfsName, p->zFName, flags);
17103 if( p->pReal->pMethods ){
17104 sqlite3_io_methods *pNew = sqlite3_malloc( sizeof(*pNew) );
17105 const sqlite3_io_methods *pSub = p->pReal->pMethods;
17106 memset(pNew, 0, sizeof(*pNew));
17107 pNew->iVersion = pSub->iVersion;
17108 pNew->xClose = vfstraceClose;
17109 pNew->xRead = vfstraceRead;
17110 pNew->xWrite = vfstraceWrite;
17112 pNew->xSync = vfstraceSync;
17114 pNew->xLock = vfstraceLock;
17120 if( pNew->iVersion>=2 ){
17121 pNew->xShmMap = pSub->xShmMap ? vfstraceShmMap : 0;
17122 pNew->xShmLock = pSub->xShmLock ? vfstraceShmLock : 0;
17125 }
17126 if( pNew->iVersion>=3 ){
17127 pNew->xFetch = pSub->xFetch ? vfstraceFetch : 0;
17128 pNew->xUnfetch = pSub->xUnfetch ? vfstraceUnfetch : 0;
17129 }
17130 pFile->pMethods = pNew;
17131 }
17132 vfstrace_print_errcode(pInfo, " -> %s", rc);
17133 if( pOutFlags ){
17134 vfstrace_printf(pInfo, ", outFlags=0x%x\n", *pOutFlags);
17135 }else{
17136 vfstrace_printf(pInfo, "\n");
17137 }
17138 return rc;
17139}
17140
17141/*
17142** Delete the file located at zPath. If the dirSync argument is true,
17143** ensure the file-system modifications are synced to disk before
17144** returning.
17145*/
17146static int vfstraceDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
17147 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17148 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17149 int rc;
17151 vfstrace_printf(pInfo, "%s.xDelete(\"%s\",%d)",
17152 pInfo->zVfsName, zPath, dirSync);
17153 rc = pRoot->xDelete(pRoot, zPath, dirSync);
17154 vfstrace_print_errcode(pInfo, " -> %s\n", rc);
17155 return rc;
17156}
17157
17158/*
17159** Test for access permissions. Return true if the requested permission
17160** is available, or false otherwise.
17161*/
17163 sqlite3_vfs *pVfs,
17164 const char *zPath,
17165 int flags,
17166 int *pResOut
17167){
17168 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17169 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17170 int rc;
17172 vfstrace_printf(pInfo, "%s.xAccess(\"%s\",%d)",
17173 pInfo->zVfsName, zPath, flags);
17174 rc = pRoot->xAccess(pRoot, zPath, flags, pResOut);
17175 vfstrace_print_errcode(pInfo, " -> %s", rc);
17176 vfstrace_printf(pInfo, ", out=%d\n", *pResOut);
17177 return rc;
17178}
17179
17180/*
17181** Populate buffer zOut with the full canonical pathname corresponding
17182** to the pathname in zPath. zOut is guaranteed to point to a buffer
17183** of at least (DEVSYM_MAX_PATHNAME+1) bytes.
17184*/
17186 sqlite3_vfs *pVfs,
17187 const char *zPath,
17188 int nOut,
17189 char *zOut
17190){
17191 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17192 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17193 int rc;
17195 vfstrace_printf(pInfo, "%s.xFullPathname(\"%s\")",
17196 pInfo->zVfsName, zPath);
17197 rc = pRoot->xFullPathname(pRoot, zPath, nOut, zOut);
17198 vfstrace_print_errcode(pInfo, " -> %s", rc);
17199 vfstrace_printf(pInfo, ", out=\"%.*s\"\n", nOut, zOut);
17200 return rc;
17201}
17202
17203/*
17204** Open the dynamic library located at zPath and return a handle.
17205*/
17206static void *vfstraceDlOpen(sqlite3_vfs *pVfs, const char *zPath){
17207 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17208 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17210 vfstrace_printf(pInfo, "%s.xDlOpen(\"%s\")\n", pInfo->zVfsName, zPath);
17211 return pRoot->xDlOpen(pRoot, zPath);
17212}
17213
17214/*
17215** Populate the buffer zErrMsg (size nByte bytes) with a human readable
17216** utf-8 string describing the most recent error encountered associated
17217** with dynamic libraries.
17218*/
17219static void vfstraceDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
17220 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17221 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17223 vfstrace_printf(pInfo, "%s.xDlError(%d)", pInfo->zVfsName, nByte);
17224 pRoot->xDlError(pRoot, nByte, zErrMsg);
17225 vfstrace_printf(pInfo, " -> \"%s\"", zErrMsg);
17226}
17227
17228/*
17229** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
17230*/
17231static void (*vfstraceDlSym(sqlite3_vfs *pVfs,void *p,const char *zSym))(void){
17232 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17233 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17234 vfstrace_printf(pInfo, "%s.xDlSym(\"%s\")\n", pInfo->zVfsName, zSym);
17235 return pRoot->xDlSym(pRoot, p, zSym);
17236}
17237
17238/*
17239** Close the dynamic library handle pHandle.
17240*/
17241static void vfstraceDlClose(sqlite3_vfs *pVfs, void *pHandle){
17242 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17243 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17245 vfstrace_printf(pInfo, "%s.xDlClose()\n", pInfo->zVfsName);
17246 pRoot->xDlClose(pRoot, pHandle);
17247}
17248
17249/*
17250** Populate the buffer pointed to by zBufOut with nByte bytes of
17251** random data.
17252*/
17253static int vfstraceRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
17254 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17255 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17257 vfstrace_printf(pInfo, "%s.xRandomness(%d)\n", pInfo->zVfsName, nByte);
17258 return pRoot->xRandomness(pRoot, nByte, zBufOut);
17259}
17260
17261/*
17262** Sleep for nMicro microseconds. Return the number of microseconds
17263** actually slept.
17264*/
17265static int vfstraceSleep(sqlite3_vfs *pVfs, int nMicro){
17266 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17267 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17269 vfstrace_printf(pInfo, "%s.xSleep(%d)\n", pInfo->zVfsName, nMicro);
17270 return pRoot->xSleep(pRoot, nMicro);
17271}
17272
17273/*
17274** Return the current time as a Julian Day number in *pTimeOut.
17275*/
17276static int vfstraceCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
17277 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17278 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17279 int rc;
17281 vfstrace_printf(pInfo, "%s.xCurrentTime()", pInfo->zVfsName);
17282 rc = pRoot->xCurrentTime(pRoot, pTimeOut);
17283 vfstrace_printf(pInfo, " -> %.17g\n", *pTimeOut);
17284 return rc;
17285}
17286static int vfstraceCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
17287 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17288 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17289 int rc;
17291 vfstrace_printf(pInfo, "%s.xCurrentTimeInt64()", pInfo->zVfsName);
17292 rc = pRoot->xCurrentTimeInt64(pRoot, pTimeOut);
17293 vfstrace_printf(pInfo, " -> %lld\n", *pTimeOut);
17294 return rc;
17295}
17296
17297/*
17298** Return the most recent error code and message
17299*/
17300static int vfstraceGetLastError(sqlite3_vfs *pVfs, int nErr, char *zErr){
17301 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17302 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17303 int rc;
17305 vfstrace_printf(pInfo, "%s.xGetLastError(%d,zBuf)", pInfo->zVfsName, nErr);
17306 if( nErr ) zErr[0] = 0;
17307 rc = pRoot->xGetLastError(pRoot, nErr, zErr);
17308 vfstrace_printf(pInfo, " -> zBuf[] = \"%s\", rc = %d\n", nErr?zErr:"", rc);
17309 return rc;
17310}
17311
17312/*
17313** Override system calls.
17314*/
17316 sqlite3_vfs *pVfs,
17317 const char *zName,
17319){
17320 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17321 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17322 return pRoot->xSetSystemCall(pRoot, zName, pFunc);
17323}
17325 sqlite3_vfs *pVfs,
17326 const char *zName
17327){
17328 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17329 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17330 return pRoot->xGetSystemCall(pRoot, zName);
17331}
17332static const char *vfstraceNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
17333 vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
17334 sqlite3_vfs *pRoot = pInfo->pRootVfs;
17335 return pRoot->xNextSystemCall(pRoot, zName);
17336}
17337
17338
17339/*
17340** Clients invoke this routine to construct a new trace-vfs shim.
17341**
17342** Return SQLITE_OK on success.
17343**
17344** SQLITE_NOMEM is returned in the case of a memory allocation error.
17345** SQLITE_NOTFOUND is returned if zOldVfsName does not exist.
17346*/
17348 const char *zTraceName, /* Name of the newly constructed VFS */
17349 const char *zOldVfsName, /* Name of the underlying VFS */
17350 int (*xOut)(const char*,void*), /* Output routine. ex: fputs */
17351 void *pOutArg, /* 2nd argument to xOut. ex: stderr */
17352 int makeDefault /* True to make the new VFS the default */
17353){
17354 sqlite3_vfs *pNew;
17355 sqlite3_vfs *pRoot;
17356 vfstrace_info *pInfo;
17357 size_t nName;
17358 size_t nByte;
17359
17360 pRoot = sqlite3_vfs_find(zOldVfsName);
17361 if( pRoot==0 ) return SQLITE_NOTFOUND;
17362 nName = strlen(zTraceName);
17363 nByte = sizeof(*pNew) + sizeof(*pInfo) + nName + 1;
17364 pNew = sqlite3_malloc64( nByte );
17365 if( pNew==0 ) return SQLITE_NOMEM;
17366 memset(pNew, 0, nByte);
17367 pInfo = (vfstrace_info*)&pNew[1];
17368 pNew->iVersion = pRoot->iVersion;
17369 pNew->szOsFile = pRoot->szOsFile + sizeof(vfstrace_file);
17370 pNew->mxPathname = pRoot->mxPathname;
17371 pNew->zName = (char*)&pInfo[1];
17372 memcpy((char*)&pInfo[1], zTraceName, nName+1);
17373 pNew->pAppData = pInfo;
17374 pNew->xOpen = vfstraceOpen;
17378 pNew->xDlOpen = pRoot->xDlOpen==0 ? 0 : vfstraceDlOpen;
17379 pNew->xDlError = pRoot->xDlError==0 ? 0 : vfstraceDlError;
17380 pNew->xDlSym = pRoot->xDlSym==0 ? 0 : vfstraceDlSym;
17381 pNew->xDlClose = pRoot->xDlClose==0 ? 0 : vfstraceDlClose;
17383 pNew->xSleep = vfstraceSleep;
17386 if( pNew->iVersion>=2 ){
17387 pNew->xCurrentTimeInt64 = pRoot->xCurrentTimeInt64==0 ? 0 :
17389 if( pNew->iVersion>=3 ){
17390 pNew->xSetSystemCall = pRoot->xSetSystemCall==0 ? 0 :
17392 pNew->xGetSystemCall = pRoot->xGetSystemCall==0 ? 0 :
17394 pNew->xNextSystemCall = pRoot->xNextSystemCall==0 ? 0 :
17396 }
17397 }
17398 pInfo->pRootVfs = pRoot;
17399 pInfo->xOut = xOut;
17400 pInfo->pOutArg = pOutArg;
17401 pInfo->zVfsName = pNew->zName;
17402 pInfo->pTraceVfs = pNew;
17403 pInfo->mTrace = 0xffffffff;
17404 pInfo->bOn = 1;
17405 vfstrace_printf(pInfo, "%s.enabled_for(\"%s\")\n",
17406 pInfo->zVfsName, pRoot->zName);
17407 return sqlite3_vfs_register(pNew, makeDefault);
17408}
17409
17410/*
17411** Look for the named VFS. If it is a TRACEVFS, then unregister it
17412** and delete it.
17413*/
17414void vfstrace_unregister(const char *zTraceName){
17415 sqlite3_vfs *pVfs = sqlite3_vfs_find(zTraceName);
17416 if( pVfs==0 ) return;
17417 if( pVfs->xOpen!=vfstraceOpen ) return;
17419 sqlite3_free(pVfs);
17420}
17421
17422/************************* End ../ext/misc/vfstrace.c ********************/
17423
17424#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
17425#define SQLITE_SHELL_HAVE_RECOVER 1
17426#else
17427#define SQLITE_SHELL_HAVE_RECOVER 0
17428#endif
17430/************************* Begin ../ext/recover/sqlite3recover.h ******************/
17431/*
17432** 2022-08-27
17433**
17434** The author disclaims copyright to this source code. In place of
17435** a legal notice, here is a blessing:
17436**
17437** May you do good and not evil.
17438** May you find forgiveness for yourself and forgive others.
17439** May you share freely, never taking more than you give.
17440**
17441*************************************************************************
17442**
17443** This file contains the public interface to the "recover" extension -
17444** an SQLite extension designed to recover data from corrupted database
17445** files.
17446*/
17447
17448/*
17449** OVERVIEW:
17450**
17451** To use the API to recover data from a corrupted database, an
17452** application:
17453**
17454** 1) Creates an sqlite3_recover handle by calling either
17455** sqlite3_recover_init() or sqlite3_recover_init_sql().
17456**
17457** 2) Configures the new handle using one or more calls to
17458** sqlite3_recover_config().
17459**
17460** 3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
17461** the handle until it returns something other than SQLITE_OK. If it
17462** returns SQLITE_DONE, then the recovery operation completed without
17463** error. If it returns some other non-SQLITE_OK value, then an error
17464** has occurred.
17465**
17466** 4) Retrieves any error code and English language error message using the
17467** sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
17468** respectively.
17469**
17470** 5) Destroys the sqlite3_recover handle and frees all resources
17471** using sqlite3_recover_finish().
17472**
17473** The application may abandon the recovery operation at any point
17474** before it is finished by passing the sqlite3_recover handle to
17475** sqlite3_recover_finish(). This is not an error, but the final state
17476** of the output database, or the results of running the partial script
17477** delivered to the SQL callback, are undefined.
17478*/
17479
17480#ifndef _SQLITE_RECOVER_H
17481#define _SQLITE_RECOVER_H
17482
17483/* #include "sqlite3.h" */
17484
17485#ifdef __cplusplus
17486extern "C" {
17487#endif
17488
17489/*
17490** An instance of the sqlite3_recover object represents a recovery
17491** operation in progress.
17492**
17493** Constructors:
17494**
17495** sqlite3_recover_init()
17496** sqlite3_recover_init_sql()
17497**
17498** Destructor:
17499**
17500** sqlite3_recover_finish()
17501**
17502** Methods:
17503**
17504** sqlite3_recover_config()
17505** sqlite3_recover_errcode()
17506** sqlite3_recover_errmsg()
17507** sqlite3_recover_run()
17508** sqlite3_recover_step()
17509*/
17510typedef struct sqlite3_recover sqlite3_recover;
17511
17512/*
17513** These two APIs attempt to create and return a new sqlite3_recover object.
17514** In both cases the first two arguments identify the (possibly
17515** corrupt) database to recover data from. The first argument is an open
17516** database handle and the second the name of a database attached to that
17517** handle (i.e. "main", "temp" or the name of an attached database).
17518**
17519** If sqlite3_recover_init() is used to create the new sqlite3_recover
17520** handle, then data is recovered into a new database, identified by
17521** string parameter zUri. zUri may be an absolute or relative file path,
17522** or may be an SQLite URI. If the identified database file already exists,
17523** it is overwritten.
17524**
17525** If sqlite3_recover_init_sql() is invoked, then any recovered data will
17526** be returned to the user as a series of SQL statements. Executing these
17527** SQL statements results in the same database as would have been created
17528** had sqlite3_recover_init() been used. For each SQL statement in the
17529** output, the callback function passed as the third argument (xSql) is
17530** invoked once. The first parameter is a passed a copy of the fourth argument
17531** to this function (pCtx) as its first parameter, and a pointer to a
17532** nul-terminated buffer containing the SQL statement formated as UTF-8 as
17533** the second. If the xSql callback returns any value other than SQLITE_OK,
17534** then processing is immediately abandoned and the value returned used as
17535** the recover handle error code (see below).
17536**
17537** If an out-of-memory error occurs, NULL may be returned instead of
17538** a valid handle. In all other cases, it is the responsibility of the
17539** application to avoid resource leaks by ensuring that
17540** sqlite3_recover_finish() is called on all allocated handles.
17541*/
17542sqlite3_recover *sqlite3_recover_init(
17543 sqlite3* db,
17544 const char *zDb,
17545 const char *zUri
17546);
17547sqlite3_recover *sqlite3_recover_init_sql(
17548 sqlite3* db,
17549 const char *zDb,
17550 int (*xSql)(void*, const char*),
17551 void *pCtx
17552);
17553
17554/*
17555** Configure an sqlite3_recover object that has just been created using
17556** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
17557** may only be called before the first call to sqlite3_recover_step()
17558** or sqlite3_recover_run() on the object.
17559**
17560** The second argument passed to this function must be one of the
17561** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
17562** depend on the specific SQLITE_RECOVER_* symbol in use.
17563**
17564** SQLITE_OK is returned if the configuration operation was successful,
17565** or an SQLite error code otherwise.
17566*/
17567int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
17568
17569/*
17570** SQLITE_RECOVER_LOST_AND_FOUND:
17571** The pArg argument points to a string buffer containing the name
17572** of a "lost-and-found" table in the output database, or NULL. If
17573** the argument is non-NULL and the database contains seemingly
17574** valid pages that cannot be associated with any table in the
17575** recovered part of the schema, data is extracted from these
17576** pages to add to the lost-and-found table.
17577**
17578** SQLITE_RECOVER_FREELIST_CORRUPT:
17579** The pArg value must actually be a pointer to a value of type
17580** int containing value 0 or 1 cast as a (void*). If this option is set
17581** (argument is 1) and a lost-and-found table has been configured using
17582** SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is
17583** corrupt and an attempt is made to recover records from pages that
17584** appear to be linked into the freelist. Otherwise, pages on the freelist
17585** are ignored. Setting this option can recover more data from the
17586** database, but often ends up "recovering" deleted records. The default
17587** value is 0 (clear).
17588**
17589** SQLITE_RECOVER_ROWIDS:
17590** The pArg value must actually be a pointer to a value of type
17591** int containing value 0 or 1 cast as a (void*). If this option is set
17592** (argument is 1), then an attempt is made to recover rowid values
17593** that are not also INTEGER PRIMARY KEY values. If this option is
17594** clear, then new rowids are assigned to all recovered rows. The
17595** default value is 1 (set).
17596**
17597** SQLITE_RECOVER_SLOWINDEXES:
17598** The pArg value must actually be a pointer to a value of type
17599** int containing value 0 or 1 cast as a (void*). If this option is clear
17600** (argument is 0), then when creating an output database, the recover
17601** module creates and populates non-UNIQUE indexes right at the end of the
17602** recovery operation - after all recoverable data has been inserted
17603** into the new database. This is faster overall, but means that the
17604** final call to sqlite3_recover_step() for a recovery operation may
17605** be need to create a large number of indexes, which may be very slow.
17606**
17607** Or, if this option is set (argument is 1), then non-UNIQUE indexes
17608** are created in the output database before it is populated with
17609** recovered data. This is slower overall, but avoids the slow call
17610** to sqlite3_recover_step() at the end of the recovery operation.
17611**
17612** The default option value is 0.
17613*/
17614#define SQLITE_RECOVER_LOST_AND_FOUND 1
17615#define SQLITE_RECOVER_FREELIST_CORRUPT 2
17616#define SQLITE_RECOVER_ROWIDS 3
17617#define SQLITE_RECOVER_SLOWINDEXES 4
17618
17619/*
17620** Perform a unit of work towards the recovery operation. This function
17621** must normally be called multiple times to complete database recovery.
17622**
17623** If no error occurs but the recovery operation is not completed, this
17624** function returns SQLITE_OK. If recovery has been completed successfully
17625** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
17626** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
17627** considered an error if some or all of the data cannot be recovered
17628** due to database corruption.
17629**
17630** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
17631** all further such calls on the same recover handle are no-ops that return
17632** the same non-SQLITE_OK value.
17633*/
17634int sqlite3_recover_step(sqlite3_recover*);
17635
17636/*
17637** Run the recovery operation to completion. Return SQLITE_OK if successful,
17638** or an SQLite error code otherwise. Calling this function is the same
17639** as executing:
17640**
17641** while( SQLITE_OK==sqlite3_recover_step(p) );
17642** return sqlite3_recover_errcode(p);
17643*/
17644int sqlite3_recover_run(sqlite3_recover*);
17645
17646/*
17647** If an error has been encountered during a prior call to
17648** sqlite3_recover_step(), then this function attempts to return a
17649** pointer to a buffer containing an English language explanation of
17650** the error. If no error message is available, or if an out-of memory
17651** error occurs while attempting to allocate a buffer in which to format
17652** the error message, NULL is returned.
17653**
17654** The returned buffer remains valid until the sqlite3_recover handle is
17655** destroyed using sqlite3_recover_finish().
17656*/
17657const char *sqlite3_recover_errmsg(sqlite3_recover*);
17658
17659/*
17660** If this function is called on an sqlite3_recover handle after
17661** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
17662*/
17663int sqlite3_recover_errcode(sqlite3_recover*);
17664
17665/*
17666** Clean up a recovery object created by a call to sqlite3_recover_init().
17667** The results of using a recovery object with any API after it has been
17668** passed to this function are undefined.
17669**
17670** This function returns the same value as sqlite3_recover_errcode().
17671*/
17672int sqlite3_recover_finish(sqlite3_recover*);
17673
17674
17675#ifdef __cplusplus
17676} /* end of the 'extern "C"' block */
17677#endif
17678
17679#endif /* ifndef _SQLITE_RECOVER_H */
17680
17681/************************* End ../ext/recover/sqlite3recover.h ********************/
17682# ifndef SQLITE_HAVE_SQLITE3R
17683/************************* Begin ../ext/recover/dbdata.c ******************/
17684/*
17685** 2019-04-17
17686**
17687** The author disclaims copyright to this source code. In place of
17688** a legal notice, here is a blessing:
17689**
17690** May you do good and not evil.
17691** May you find forgiveness for yourself and forgive others.
17692** May you share freely, never taking more than you give.
17693**
17694******************************************************************************
17695**
17696** This file contains an implementation of two eponymous virtual tables,
17697** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
17698** "sqlite_dbpage" eponymous virtual table be available.
17699**
17700** SQLITE_DBDATA:
17701** sqlite_dbdata is used to extract data directly from a database b-tree
17702** page and its associated overflow pages, bypassing the b-tree layer.
17703** The table schema is equivalent to:
17704**
17705** CREATE TABLE sqlite_dbdata(
17706** pgno INTEGER,
17707** cell INTEGER,
17708** field INTEGER,
17709** value ANY,
17710** schema TEXT HIDDEN
17711** );
17712**
17713** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
17714** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
17715** "schema".
17716**
17717** Each page of the database is inspected. If it cannot be interpreted as
17718** a b-tree page, or if it is a b-tree page containing 0 entries, the
17719** sqlite_dbdata table contains no rows for that page. Otherwise, the
17720** table contains one row for each field in the record associated with
17721** each cell on the page. For intkey b-trees, the key value is stored in
17722** field -1.
17723**
17724** For example, for the database:
17725**
17726** CREATE TABLE t1(a, b); -- root page is page 2
17727** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
17728** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
17729**
17730** the sqlite_dbdata table contains, as well as from entries related to
17731** page 1, content equivalent to:
17732**
17733** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
17734** (2, 0, -1, 5 ),
17735** (2, 0, 0, 'v' ),
17736** (2, 0, 1, 'five'),
17737** (2, 1, -1, 10 ),
17738** (2, 1, 0, 'x' ),
17739** (2, 1, 1, 'ten' );
17740**
17741** If database corruption is encountered, this module does not report an
17742** error. Instead, it attempts to extract as much data as possible and
17743** ignores the corruption.
17744**
17745** SQLITE_DBPTR:
17746** The sqlite_dbptr table has the following schema:
17747**
17748** CREATE TABLE sqlite_dbptr(
17749** pgno INTEGER,
17750** child INTEGER,
17751** schema TEXT HIDDEN
17752** );
17753**
17754** It contains one entry for each b-tree pointer between a parent and
17755** child page in the database.
17756*/
17757
17758#if !defined(SQLITEINT_H)
17759/* #include "sqlite3.h" */
17760
17761/* typedef unsigned char u8; */
17762/* typedef unsigned int u32; */
17763
17764#endif
17765#include <string.h>
17766#include <assert.h>
17767
17768#ifndef SQLITE_OMIT_VIRTUALTABLE
17769
17770#define DBDATA_PADDING_BYTES 100
17771
17772typedef struct DbdataTable DbdataTable;
17773typedef struct DbdataCursor DbdataCursor;
17774typedef struct DbdataBuffer DbdataBuffer;
17775
17776/*
17777** Buffer type.
17778*/
17779struct DbdataBuffer {
17780 u8 *aBuf;
17781 sqlite3_int64 nBuf;
17782};
17783
17784/* Cursor object */
17785struct DbdataCursor {
17786 sqlite3_vtab_cursor base; /* Base class. Must be first */
17787 sqlite3_stmt *pStmt; /* For fetching database pages */
17788
17789 int iPgno; /* Current page number */
17790 u8 *aPage; /* Buffer containing page */
17791 int nPage; /* Size of aPage[] in bytes */
17792 int nCell; /* Number of cells on aPage[] */
17793 int iCell; /* Current cell number */
17794 int bOnePage; /* True to stop after one page */
17795 int szDb;
17796 sqlite3_int64 iRowid;
17797
17798 /* Only for the sqlite_dbdata table */
17799 DbdataBuffer rec;
17800 sqlite3_int64 nRec; /* Size of pRec[] in bytes */
17801 sqlite3_int64 nHdr; /* Size of header in bytes */
17802 int iField; /* Current field number */
17803 u8 *pHdrPtr;
17804 u8 *pPtr;
17805 u32 enc; /* Text encoding */
17806
17807 sqlite3_int64 iIntkey; /* Integer key value */
17808};
17809
17810/* Table object */
17811struct DbdataTable {
17812 sqlite3_vtab base; /* Base class. Must be first */
17813 sqlite3 *db; /* The database connection */
17814 sqlite3_stmt *pStmt; /* For fetching database pages */
17815 int bPtr; /* True for sqlite3_dbptr table */
17816};
17817
17818/* Column and schema definitions for sqlite_dbdata */
17819#define DBDATA_COLUMN_PGNO 0
17820#define DBDATA_COLUMN_CELL 1
17821#define DBDATA_COLUMN_FIELD 2
17822#define DBDATA_COLUMN_VALUE 3
17823#define DBDATA_COLUMN_SCHEMA 4
17824#define DBDATA_SCHEMA
17825 "CREATE TABLE x("
17826 " pgno INTEGER,"
17827 " cell INTEGER,"
17828 " field INTEGER,"
17829 " value ANY,"
17830 " schema TEXT HIDDEN"
17831 ")"
17832
17833/* Column and schema definitions for sqlite_dbptr */
17834#define DBPTR_COLUMN_PGNO 0
17835#define DBPTR_COLUMN_CHILD 1
17836#define DBPTR_COLUMN_SCHEMA 2
17837#define DBPTR_SCHEMA
17838 "CREATE TABLE x("
17839 " pgno INTEGER,"
17840 " child INTEGER,"
17841 " schema TEXT HIDDEN"
17842 ")"
17843
17844/*
17845** Ensure the buffer passed as the first argument is at least nMin bytes
17846** in size. If an error occurs while attempting to resize the buffer,
17847** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
17848*/
17849static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){
17850 if( nMin>pBuf->nBuf ){
17851 sqlite3_int64 nNew = nMin+16384;
17852 u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew);
17853
17854 if( aNew==0 ) return SQLITE_NOMEM;
17855 pBuf->aBuf = aNew;
17856 pBuf->nBuf = nNew;
17857 }
17858 return SQLITE_OK;
17859}
17860
17861/*
17862** Release the allocation managed by buffer pBuf.
17863*/
17864static void dbdataBufferFree(DbdataBuffer *pBuf){
17865 sqlite3_free(pBuf->aBuf);
17866 memset(pBuf, 0, sizeof(*pBuf));
17867}
17868
17869/*
17870** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
17871** table.
17872*/
17873static int dbdataConnect(
17874 sqlite3 *db,
17875 void *pAux,
17876 int argc, const char *const*argv,
17877 sqlite3_vtab **ppVtab,
17878 char **pzErr
17879){
17880 DbdataTable *pTab = 0;
17881 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
17882
17883 (void)argc;
17884 (void)argv;
17885 (void)pzErr;
17886 sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
17887 if( rc==SQLITE_OK ){
17888 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
17889 if( pTab==0 ){
17890 rc = SQLITE_NOMEM;
17891 }else{
17892 memset(pTab, 0, sizeof(DbdataTable));
17893 pTab->db = db;
17894 pTab->bPtr = (pAux!=0);
17895 }
17896 }
17897
17898 *ppVtab = (sqlite3_vtab*)pTab;
17899 return rc;
17900}
17901
17902/*
17903** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
17904*/
17905static int dbdataDisconnect(sqlite3_vtab *pVtab){
17906 DbdataTable *pTab = (DbdataTable*)pVtab;
17907 if( pTab ){
17908 sqlite3_finalize(pTab->pStmt);
17909 sqlite3_free(pVtab);
17910 }
17911 return SQLITE_OK;
17912}
17913
17914/*
17915** This function interprets two types of constraints:
17916**
17917** schema=?
17918** pgno=?
17919**
17920** If neither are present, idxNum is set to 0. If schema=? is present,
17921** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
17922** in idxNum is set.
17923**
17924** If both parameters are present, schema is in position 0 and pgno in
17925** position 1.
17926*/
17927static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
17928 DbdataTable *pTab = (DbdataTable*)tab;
17929 int i;
17930 int iSchema = -1;
17931 int iPgno = -1;
17932 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
17933
17934 for(i=0; i<pIdx->nConstraint; i++){
17935 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
17936 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
17937 if( p->iColumn==colSchema ){
17938 if( p->usable==0 ) return SQLITE_CONSTRAINT;
17939 iSchema = i;
17940 }
17941 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
17942 iPgno = i;
17943 }
17944 }
17945 }
17946
17947 if( iSchema>=0 ){
17948 pIdx->aConstraintUsage[iSchema].argvIndex = 1;
17949 pIdx->aConstraintUsage[iSchema].omit = 1;
17950 }
17951 if( iPgno>=0 ){
17952 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
17953 pIdx->aConstraintUsage[iPgno].omit = 1;
17954 pIdx->estimatedCost = 100;
17955 pIdx->estimatedRows = 50;
17956
17957 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
17958 int iCol = pIdx->aOrderBy[0].iColumn;
17959 if( pIdx->nOrderBy==1 ){
17960 pIdx->orderByConsumed = (iCol==0 || iCol==1);
17961 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
17962 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
17963 }
17964 }
17965
17966 }else{
17967 pIdx->estimatedCost = 100000000;
17968 pIdx->estimatedRows = 1000000000;
17969 }
17970 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
17971 return SQLITE_OK;
17972}
17973
17974/*
17975** Open a new sqlite_dbdata or sqlite_dbptr cursor.
17976*/
17977static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
17978 DbdataCursor *pCsr;
17979
17980 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
17981 if( pCsr==0 ){
17982 return SQLITE_NOMEM;
17983 }else{
17984 memset(pCsr, 0, sizeof(DbdataCursor));
17985 pCsr->base.pVtab = pVTab;
17986 }
17987
17988 *ppCursor = (sqlite3_vtab_cursor *)pCsr;
17989 return SQLITE_OK;
17990}
17991
17992/*
17993** Restore a cursor object to the state it was in when first allocated
17994** by dbdataOpen().
17995*/
17996static void dbdataResetCursor(DbdataCursor *pCsr){
17997 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
17998 if( pTab->pStmt==0 ){
17999 pTab->pStmt = pCsr->pStmt;
18000 }else{
18001 sqlite3_finalize(pCsr->pStmt);
18002 }
18003 pCsr->pStmt = 0;
18004 pCsr->iPgno = 1;
18005 pCsr->iCell = 0;
18006 pCsr->iField = 0;
18007 pCsr->bOnePage = 0;
18008 sqlite3_free(pCsr->aPage);
18009 dbdataBufferFree(&pCsr->rec);
18010 pCsr->aPage = 0;
18011 pCsr->nRec = 0;
18012}
18013
18014/*
18015** Close an sqlite_dbdata or sqlite_dbptr cursor.
18016*/
18017static int dbdataClose(sqlite3_vtab_cursor *pCursor){
18018 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18019 dbdataResetCursor(pCsr);
18020 sqlite3_free(pCsr);
18021 return SQLITE_OK;
18022}
18023
18024/*
18025** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
18026*/
18027static u32 get_uint16(unsigned char *a){
18028 return (a[0]<<8)|a[1];
18029}
18030static u32 get_uint32(unsigned char *a){
18031 return ((u32)a[0]<<24)
18032 | ((u32)a[1]<<16)
18033 | ((u32)a[2]<<8)
18034 | ((u32)a[3]);
18035}
18036
18037/*
18038** Load page pgno from the database via the sqlite_dbpage virtual table.
18039** If successful, set (*ppPage) to point to a buffer containing the page
18040** data, (*pnPage) to the size of that buffer in bytes and return
18041** SQLITE_OK. In this case it is the responsibility of the caller to
18042** eventually free the buffer using sqlite3_free().
18043**
18044** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
18045** return an SQLite error code.
18046*/
18047static int dbdataLoadPage(
18048 DbdataCursor *pCsr, /* Cursor object */
18049 u32 pgno, /* Page number of page to load */
18050 u8 **ppPage, /* OUT: pointer to page buffer */
18051 int *pnPage /* OUT: Size of (*ppPage) in bytes */
18052){
18053 int rc2;
18054 int rc = SQLITE_OK;
18055 sqlite3_stmt *pStmt = pCsr->pStmt;
18056
18057 *ppPage = 0;
18058 *pnPage = 0;
18059 if( pgno>0 ){
18060 sqlite3_bind_int64(pStmt, 2, pgno);
18061 if( SQLITE_ROW==sqlite3_step(pStmt) ){
18062 int nCopy = sqlite3_column_bytes(pStmt, 0);
18063 if( nCopy>0 ){
18064 u8 *pPage;
18065 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
18066 if( pPage==0 ){
18067 rc = SQLITE_NOMEM;
18068 }else{
18069 const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
18070 memcpy(pPage, pCopy, nCopy);
18071 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
18072 }
18073 *ppPage = pPage;
18074 *pnPage = nCopy;
18075 }
18076 }
18077 rc2 = sqlite3_reset(pStmt);
18078 if( rc==SQLITE_OK ) rc = rc2;
18079 }
18080
18081 return rc;
18082}
18083
18084/*
18085** Read a varint. Put the value in *pVal and return the number of bytes.
18086*/
18087static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
18088 sqlite3_uint64 u = 0;
18089 int i;
18090 for(i=0; i<8; i++){
18091 u = (u<<7) + (z[i]&0x7f);
18092 if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
18093 }
18094 u = (u<<8) + (z[i]&0xff);
18095 *pVal = (sqlite3_int64)u;
18096 return 9;
18097}
18098
18099/*
18100** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
18101** or greater than 0xFFFFFFFF. This can be used for all varints in an
18102** SQLite database except for key values in intkey tables.
18103*/
18104static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
18105 sqlite3_int64 val;
18106 int nRet = dbdataGetVarint(z, &val);
18107 if( val<0 || val>0xFFFFFFFF ) val = 0;
18108 *pVal = val;
18109 return nRet;
18110}
18111
18112/*
18113** Return the number of bytes of space used by an SQLite value of type
18114** eType.
18115*/
18116static int dbdataValueBytes(int eType){
18117 switch( eType ){
18118 case 0: case 8: case 9:
18119 case 10: case 11:
18120 return 0;
18121 case 1:
18122 return 1;
18123 case 2:
18124 return 2;
18125 case 3:
18126 return 3;
18127 case 4:
18128 return 4;
18129 case 5:
18130 return 6;
18131 case 6:
18132 case 7:
18133 return 8;
18134 default:
18135 if( eType>0 ){
18136 return ((eType-12) / 2);
18137 }
18138 return 0;
18139 }
18140}
18141
18142/*
18143** Load a value of type eType from buffer pData and use it to set the
18144** result of context object pCtx.
18145*/
18146static void dbdataValue(
18147 sqlite3_context *pCtx,
18148 u32 enc,
18149 int eType,
18150 u8 *pData,
18151 sqlite3_int64 nData
18152){
18153 if( eType>=0 ){
18154 if( dbdataValueBytes(eType)<=nData ){
18155 switch( eType ){
18156 case 0:
18157 case 10:
18158 case 11:
18159 sqlite3_result_null(pCtx);
18160 break;
18161
18162 case 8:
18163 sqlite3_result_int(pCtx, 0);
18164 break;
18165 case 9:
18166 sqlite3_result_int(pCtx, 1);
18167 break;
18168
18169 case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
18170 sqlite3_uint64 v = (signed char)pData[0];
18171 pData++;
18172 switch( eType ){
18173 case 7:
18174 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
18175 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
18176 case 4: v = (v<<8) + pData[0]; pData++;
18177 case 3: v = (v<<8) + pData[0]; pData++;
18178 case 2: v = (v<<8) + pData[0]; pData++;
18179 }
18180
18181 if( eType==7 ){
18182 double r;
18183 memcpy(&r, &v, sizeof(r));
18184 sqlite3_result_double(pCtx, r);
18185 }else{
18186 sqlite3_result_int64(pCtx, (sqlite3_int64)v);
18187 }
18188 break;
18189 }
18190
18191 default: {
18192 int n = ((eType-12) / 2);
18193 if( eType % 2 ){
18194 switch( enc ){
18195 #ifndef SQLITE_OMIT_UTF16
18196 case SQLITE_UTF16BE:
18197 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
18198 break;
18199 case SQLITE_UTF16LE:
18200 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
18201 break;
18202 #endif
18203 default:
18204 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
18205 break;
18206 }
18207 }else{
18208 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
18209 }
18210 }
18211 }
18212 }else{
18213 if( eType==7 ){
18214 sqlite3_result_double(pCtx, 0.0);
18215 }else if( eType<7 ){
18216 sqlite3_result_int(pCtx, 0);
18217 }else if( eType%2 ){
18218 sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
18219 }else{
18220 sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC);
18221 }
18222 }
18223 }
18224}
18225
18226/* This macro is a copy of the MX_CELL() macro in the SQLite core. Given
18227** a page-size, it returns the maximum number of cells that may be present
18228** on the page. */
18229#define DBDATA_MX_CELL(pgsz) ((pgsz-8)/6)
18230
18231/* Maximum number of fields that may appear in a single record. This is
18232** the "hard-limit", according to comments in sqliteLimit.h. */
18233#define DBDATA_MX_FIELD 32676
18234
18235/*
18236** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
18237*/
18238static int dbdataNext(sqlite3_vtab_cursor *pCursor){
18239 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18240 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
18241
18242 pCsr->iRowid++;
18243 while( 1 ){
18244 int rc;
18245 int iOff = (pCsr->iPgno==1 ? 100 : 0);
18246 int bNextPage = 0;
18247
18248 if( pCsr->aPage==0 ){
18249 while( 1 ){
18250 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
18251 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
18252 if( rc!=SQLITE_OK ) return rc;
18253 if( pCsr->aPage && pCsr->nPage>=256 ) break;
18254 sqlite3_free(pCsr->aPage);
18255 pCsr->aPage = 0;
18256 if( pCsr->bOnePage ) return SQLITE_OK;
18257 pCsr->iPgno++;
18258 }
18259
18260 assert( iOff+3+2<=pCsr->nPage );
18261 pCsr->iCell = pTab->bPtr ? -2 : 0;
18262 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
18263 if( pCsr->nCell>DBDATA_MX_CELL(pCsr->nPage) ){
18264 pCsr->nCell = DBDATA_MX_CELL(pCsr->nPage);
18265 }
18266 }
18267
18268 if( pTab->bPtr ){
18269 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
18270 pCsr->iCell = pCsr->nCell;
18271 }
18272 pCsr->iCell++;
18273 if( pCsr->iCell>=pCsr->nCell ){
18274 sqlite3_free(pCsr->aPage);
18275 pCsr->aPage = 0;
18276 if( pCsr->bOnePage ) return SQLITE_OK;
18277 pCsr->iPgno++;
18278 }else{
18279 return SQLITE_OK;
18280 }
18281 }else{
18282 /* If there is no record loaded, load it now. */
18283 assert( pCsr->rec.aBuf!=0 || pCsr->nRec==0 );
18284 if( pCsr->nRec==0 ){
18285 int bHasRowid = 0;
18286 int nPointer = 0;
18287 sqlite3_int64 nPayload = 0;
18288 sqlite3_int64 nHdr = 0;
18289 int iHdr;
18290 int U, X;
18291 int nLocal;
18292
18293 switch( pCsr->aPage[iOff] ){
18294 case 0x02:
18295 nPointer = 4;
18296 break;
18297 case 0x0a:
18298 break;
18299 case 0x0d:
18300 bHasRowid = 1;
18301 break;
18302 default:
18303 /* This is not a b-tree page with records on it. Continue. */
18304 pCsr->iCell = pCsr->nCell;
18305 break;
18306 }
18307
18308 if( pCsr->iCell>=pCsr->nCell ){
18309 bNextPage = 1;
18310 }else{
18311 int iCellPtr = iOff + 8 + nPointer + pCsr->iCell*2;
18312
18313 if( iCellPtr>pCsr->nPage ){
18314 bNextPage = 1;
18315 }else{
18316 iOff = get_uint16(&pCsr->aPage[iCellPtr]);
18317 }
18318
18319 /* For an interior node cell, skip past the child-page number */
18320 iOff += nPointer;
18321
18322 /* Load the "byte of payload including overflow" field */
18323 if( bNextPage || iOff>pCsr->nPage || iOff<=iCellPtr ){
18324 bNextPage = 1;
18325 }else{
18326 iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
18327 if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
18328 if( nPayload==0 ) nPayload = 1;
18329 }
18330
18331 /* If this is a leaf intkey cell, load the rowid */
18332 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
18333 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
18334 }
18335
18336 /* Figure out how much data to read from the local page */
18337 U = pCsr->nPage;
18338 if( bHasRowid ){
18339 X = U-35;
18340 }else{
18341 X = ((U-12)*64/255)-23;
18342 }
18343 if( nPayload<=X ){
18344 nLocal = nPayload;
18345 }else{
18346 int M, K;
18347 M = ((U-12)*32/255)-23;
18348 K = M+((nPayload-M)%(U-4));
18349 if( K<=X ){
18350 nLocal = K;
18351 }else{
18352 nLocal = M;
18353 }
18354 }
18355
18356 if( bNextPage || nLocal+iOff>pCsr->nPage ){
18357 bNextPage = 1;
18358 }else{
18359
18360 /* Allocate space for payload. And a bit more to catch small buffer
18361 ** overruns caused by attempting to read a varint or similar from
18362 ** near the end of a corrupt record. */
18363 rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES);
18364 if( rc!=SQLITE_OK ) return rc;
18365 assert( pCsr->rec.aBuf!=0 );
18366 assert( nPayload!=0 );
18367
18368 /* Load the nLocal bytes of payload */
18369 memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal);
18370 iOff += nLocal;
18371
18372 /* Load content from overflow pages */
18373 if( nPayload>nLocal ){
18374 sqlite3_int64 nRem = nPayload - nLocal;
18375 u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
18376 while( nRem>0 ){
18377 u8 *aOvfl = 0;
18378 int nOvfl = 0;
18379 int nCopy;
18380 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
18381 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
18382 if( rc!=SQLITE_OK ) return rc;
18383 if( aOvfl==0 ) break;
18384
18385 nCopy = U-4;
18386 if( nCopy>nRem ) nCopy = nRem;
18387 memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy);
18388 nRem -= nCopy;
18389
18390 pgnoOvfl = get_uint32(aOvfl);
18391 sqlite3_free(aOvfl);
18392 }
18393 nPayload -= nRem;
18394 }
18395 memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES);
18396 pCsr->nRec = nPayload;
18397
18398 iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr);
18399 if( nHdr>nPayload ) nHdr = 0;
18400 pCsr->nHdr = nHdr;
18401 pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr];
18402 pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr];
18403 pCsr->iField = (bHasRowid ? -1 : 0);
18404 }
18405 }
18406 }else{
18407 pCsr->iField++;
18408 if( pCsr->iField>0 ){
18409 sqlite3_int64 iType;
18410 if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec]
18411 || pCsr->iField>=DBDATA_MX_FIELD
18412 ){
18413 bNextPage = 1;
18414 }else{
18415 int szField = 0;
18416 pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
18417 szField = dbdataValueBytes(iType);
18418 if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))<szField ){
18419 pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nRec];
18420 }else{
18421 pCsr->pPtr += szField;
18422 }
18423 }
18424 }
18425 }
18426
18427 if( bNextPage ){
18428 sqlite3_free(pCsr->aPage);
18429 pCsr->aPage = 0;
18430 pCsr->nRec = 0;
18431 if( pCsr->bOnePage ) return SQLITE_OK;
18432 pCsr->iPgno++;
18433 }else{
18434 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){
18435 return SQLITE_OK;
18436 }
18437
18438 /* Advance to the next cell. The next iteration of the loop will load
18439 ** the record and so on. */
18440 pCsr->nRec = 0;
18441 pCsr->iCell++;
18442 }
18443 }
18444 }
18445
18446 assert( !"can't get here" );
18447 return SQLITE_OK;
18448}
18449
18450/*
18451** Return true if the cursor is at EOF.
18452*/
18453static int dbdataEof(sqlite3_vtab_cursor *pCursor){
18454 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18455 return pCsr->aPage==0;
18456}
18457
18458/*
18459** Return true if nul-terminated string zSchema ends in "()". Or false
18460** otherwise.
18461*/
18462static int dbdataIsFunction(const char *zSchema){
18463 size_t n = strlen(zSchema);
18464 if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
18465 return (int)n-2;
18466 }
18467 return 0;
18468}
18469
18470/*
18471** Determine the size in pages of database zSchema (where zSchema is
18472** "main", "temp" or the name of an attached database) and set
18473** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
18474** an SQLite error code.
18475*/
18476static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
18477 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
18478 char *zSql = 0;
18479 int rc, rc2;
18480 int nFunc = 0;
18481 sqlite3_stmt *pStmt = 0;
18482
18483 if( (nFunc = dbdataIsFunction(zSchema))>0 ){
18484 zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
18485 }else{
18486 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
18487 }
18488 if( zSql==0 ) return SQLITE_NOMEM;
18489
18490 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
18491 sqlite3_free(zSql);
18492 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
18493 pCsr->szDb = sqlite3_column_int(pStmt, 0);
18494 }
18495 rc2 = sqlite3_finalize(pStmt);
18496 if( rc==SQLITE_OK ) rc = rc2;
18497 return rc;
18498}
18499
18500/*
18501** Attempt to figure out the encoding of the database by retrieving page 1
18502** and inspecting the header field. If successful, set the pCsr->enc variable
18503** and return SQLITE_OK. Otherwise, return an SQLite error code.
18504*/
18505static int dbdataGetEncoding(DbdataCursor *pCsr){
18506 int rc = SQLITE_OK;
18507 int nPg1 = 0;
18508 u8 *aPg1 = 0;
18509 rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
18510 if( rc==SQLITE_OK && nPg1>=(56+4) ){
18511 pCsr->enc = get_uint32(&aPg1[56]);
18512 }
18513 sqlite3_free(aPg1);
18514 return rc;
18515}
18516
18517
18518/*
18519** xFilter method for sqlite_dbdata and sqlite_dbptr.
18520*/
18521static int dbdataFilter(
18522 sqlite3_vtab_cursor *pCursor,
18523 int idxNum, const char *idxStr,
18524 int argc, sqlite3_value **argv
18525){
18526 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18527 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
18528 int rc = SQLITE_OK;
18529 const char *zSchema = "main";
18530 (void)idxStr;
18531 (void)argc;
18532
18533 dbdataResetCursor(pCsr);
18534 assert( pCsr->iPgno==1 );
18535 if( idxNum & 0x01 ){
18536 zSchema = (const char*)sqlite3_value_text(argv[0]);
18537 if( zSchema==0 ) zSchema = "";
18538 }
18539 if( idxNum & 0x02 ){
18540 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
18541 pCsr->bOnePage = 1;
18542 }else{
18543 rc = dbdataDbsize(pCsr, zSchema);
18544 }
18545
18546 if( rc==SQLITE_OK ){
18547 int nFunc = 0;
18548 if( pTab->pStmt ){
18549 pCsr->pStmt = pTab->pStmt;
18550 pTab->pStmt = 0;
18551 }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
18552 char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
18553 if( zSql==0 ){
18554 rc = SQLITE_NOMEM;
18555 }else{
18556 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
18557 sqlite3_free(zSql);
18558 }
18559 }else{
18560 rc = sqlite3_prepare_v2(pTab->db,
18561 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
18562 &pCsr->pStmt, 0
18563 );
18564 }
18565 }
18566 if( rc==SQLITE_OK ){
18567 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
18568 }
18569
18570 /* Try to determine the encoding of the db by inspecting the header
18571 ** field on page 1. */
18572 if( rc==SQLITE_OK ){
18573 rc = dbdataGetEncoding(pCsr);
18574 }
18575
18576 if( rc!=SQLITE_OK ){
18577 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
18578 }
18579
18580 if( rc==SQLITE_OK ){
18581 rc = dbdataNext(pCursor);
18582 }
18583 return rc;
18584}
18585
18586/*
18587** Return a column for the sqlite_dbdata or sqlite_dbptr table.
18588*/
18589static int dbdataColumn(
18590 sqlite3_vtab_cursor *pCursor,
18591 sqlite3_context *ctx,
18592 int i
18593){
18594 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18595 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
18596 if( pTab->bPtr ){
18597 switch( i ){
18598 case DBPTR_COLUMN_PGNO:
18599 sqlite3_result_int64(ctx, pCsr->iPgno);
18600 break;
18601 case DBPTR_COLUMN_CHILD: {
18602 int iOff = pCsr->iPgno==1 ? 100 : 0;
18603 if( pCsr->iCell<0 ){
18604 iOff += 8;
18605 }else{
18606 iOff += 12 + pCsr->iCell*2;
18607 if( iOff>pCsr->nPage ) return SQLITE_OK;
18608 iOff = get_uint16(&pCsr->aPage[iOff]);
18609 }
18610 if( iOff<=pCsr->nPage ){
18611 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
18612 }
18613 break;
18614 }
18615 }
18616 }else{
18617 switch( i ){
18618 case DBDATA_COLUMN_PGNO:
18619 sqlite3_result_int64(ctx, pCsr->iPgno);
18620 break;
18621 case DBDATA_COLUMN_CELL:
18622 sqlite3_result_int(ctx, pCsr->iCell);
18623 break;
18624 case DBDATA_COLUMN_FIELD:
18625 sqlite3_result_int(ctx, pCsr->iField);
18626 break;
18627 case DBDATA_COLUMN_VALUE: {
18628 if( pCsr->iField<0 ){
18629 sqlite3_result_int64(ctx, pCsr->iIntkey);
18630 }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){
18631 sqlite3_int64 iType;
18632 dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
18633 dbdataValue(
18634 ctx, pCsr->enc, iType, pCsr->pPtr,
18635 &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr
18636 );
18637 }
18638 break;
18639 }
18640 }
18641 }
18642 return SQLITE_OK;
18643}
18644
18645/*
18646** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
18647*/
18648static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
18649 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
18650 *pRowid = pCsr->iRowid;
18651 return SQLITE_OK;
18652}
18653
18654
18655/*
18656** Invoke this routine to register the "sqlite_dbdata" virtual table module
18657*/
18658static int sqlite3DbdataRegister(sqlite3 *db){
18659 static sqlite3_module dbdata_module = {
18660 0, /* iVersion */
18661 0, /* xCreate */
18662 dbdataConnect, /* xConnect */
18663 dbdataBestIndex, /* xBestIndex */
18664 dbdataDisconnect, /* xDisconnect */
18665 0, /* xDestroy */
18666 dbdataOpen, /* xOpen - open a cursor */
18667 dbdataClose, /* xClose - close a cursor */
18668 dbdataFilter, /* xFilter - configure scan constraints */
18669 dbdataNext, /* xNext - advance a cursor */
18670 dbdataEof, /* xEof - check for end of scan */
18671 dbdataColumn, /* xColumn - read data */
18672 dbdataRowid, /* xRowid - read data */
18673 0, /* xUpdate */
18674 0, /* xBegin */
18675 0, /* xSync */
18676 0, /* xCommit */
18677 0, /* xRollback */
18678 0, /* xFindMethod */
18679 0, /* xRename */
18680 0, /* xSavepoint */
18681 0, /* xRelease */
18682 0, /* xRollbackTo */
18683 0, /* xShadowName */
18684 0 /* xIntegrity */
18685 };
18686
18687 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
18688 if( rc==SQLITE_OK ){
18689 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
18690 }
18691 return rc;
18692}
18693
18694#ifdef _WIN32
18695
18696#endif
18697int sqlite3_dbdata_init(
18698 sqlite3 *db,
18699 char **pzErrMsg,
18700 const sqlite3_api_routines *pApi
18701){
18702 (void)pzErrMsg;
18703 return sqlite3DbdataRegister(db);
18704}
18705
18706#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
18707
18708/************************* End ../ext/recover/dbdata.c ********************/
18709/************************* Begin ../ext/recover/sqlite3recover.c ******************/
18710/*
18711** 2022-08-27
18712**
18713** The author disclaims copyright to this source code. In place of
18714** a legal notice, here is a blessing:
18715**
18716** May you do good and not evil.
18717** May you find forgiveness for yourself and forgive others.
18718** May you share freely, never taking more than you give.
18719**
18720*************************************************************************
18721**
18722*/
18723
18724
18725/* #include "sqlite3recover.h" */
18726#include <assert.h>
18727#include <string.h>
18728
18729#ifndef SQLITE_OMIT_VIRTUALTABLE
18730
18731/*
18732** Declaration for public API function in file dbdata.c. This may be called
18733** with NULL as the final two arguments to register the sqlite_dbptr and
18734** sqlite_dbdata virtual tables with a database handle.
18735*/
18736#ifdef _WIN32
18737
18738#endif
18739int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
18740
18741/* typedef unsigned int u32; */
18742/* typedef unsigned char u8; */
18743/* typedef sqlite3_int64 i64; */
18744
18745/*
18746** Work around C99 "flex-array" syntax for pre-C99 compilers, so as
18747** to avoid complaints from -fsanitize=strict-bounds.
18748*/
18749#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
18750# define FLEXARRAY
18751#else
18752# define FLEXARRAY 1
18753#endif
18754
18755typedef struct RecoverTable RecoverTable;
18756typedef struct RecoverColumn RecoverColumn;
18757
18758/*
18759** When recovering rows of data that can be associated with table
18760** definitions recovered from the sqlite_schema table, each table is
18761** represented by an instance of the following object.
18762**
18763** iRoot:
18764** The root page in the original database. Not necessarily (and usually
18765** not) the same in the recovered database.
18766**
18767** zTab:
18768** Name of the table.
18769**
18770** nCol/aCol[]:
18771** aCol[] is an array of nCol columns. In the order in which they appear
18772** in the table.
18773**
18774** bIntkey:
18775** Set to true for intkey tables, false for WITHOUT ROWID.
18776**
18777** iRowidBind:
18778** Each column in the aCol[] array has associated with it the index of
18779** the bind parameter its values will be bound to in the INSERT statement
18780** used to construct the output database. If the table does has a rowid
18781** but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
18782** index of the bind paramater to which the rowid value should be bound.
18783** Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY
18784** KEY column, then the rowid value should be bound to the index associated
18785** with the column.
18786**
18787** pNext:
18788** All RecoverTable objects used by the recovery operation are allocated
18789** and populated as part of creating the recovered database schema in
18790** the output database, before any non-schema data are recovered. They
18791** are then stored in a singly-linked list linked by this variable beginning
18792** at sqlite3_recover.pTblList.
18793*/
18794struct RecoverTable {
18795 u32 iRoot; /* Root page in original database */
18796 char *zTab; /* Name of table */
18797 int nCol; /* Number of columns in table */
18798 RecoverColumn *aCol; /* Array of columns */
18799 int bIntkey; /* True for intkey, false for without rowid */
18800 int iRowidBind; /* If >0, bind rowid to INSERT here */
18801 RecoverTable *pNext;
18802};
18803
18804/*
18805** Each database column is represented by an instance of the following object
18806** stored in the RecoverTable.aCol[] array of the associated table.
18807**
18808** iField:
18809** The index of the associated field within database records. Or -1 if
18810** there is no associated field (e.g. for virtual generated columns).
18811**
18812** iBind:
18813** The bind index of the INSERT statement to bind this columns values
18814** to. Or 0 if there is no such index (iff (iField<0)).
18815**
18816** bIPK:
18817** True if this is the INTEGER PRIMARY KEY column.
18818**
18819** zCol:
18820** Name of column.
18821**
18822** eHidden:
18823** A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
18824*/
18825struct RecoverColumn {
18826 int iField; /* Field in record on disk */
18827 int iBind; /* Binding to use in INSERT */
18828 int bIPK; /* True for IPK column */
18829 char *zCol;
18830 int eHidden;
18831};
18832
18833#define RECOVER_EHIDDEN_NONE 0 /* Normal database column */
18834#define RECOVER_EHIDDEN_HIDDEN 1 /* Column is __HIDDEN__ */
18835#define RECOVER_EHIDDEN_VIRTUAL 2 /* Virtual generated column */
18836#define RECOVER_EHIDDEN_STORED 3 /* Stored generated column */
18837
18838/*
18839** Bitmap object used to track pages in the input database. Allocated
18840** and manipulated only by the following functions:
18841**
18842** recoverBitmapAlloc()
18843** recoverBitmapFree()
18844** recoverBitmapSet()
18845** recoverBitmapQuery()
18846**
18847** nPg:
18848** Largest page number that may be stored in the bitmap. The range
18849** of valid keys is 1 to nPg, inclusive.
18850**
18851** aElem[]:
18852** Array large enough to contain a bit for each key. For key value
18853** iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
18854** In other words, the following is true if bit iKey is set, or
18855** false if it is clear:
18856**
18857** (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
18858*/
18859typedef struct RecoverBitmap RecoverBitmap;
18860struct RecoverBitmap {
18861 i64 nPg; /* Size of bitmap */
18862 u32 aElem[FLEXARRAY]; /* Array of 32-bit bitmasks */
18863};
18864
18865/* Size in bytes of a RecoverBitmap object sufficient to cover 32 pages */
18866#define SZ_RECOVERBITMAP_32 (16)
18867
18868/*
18869** State variables (part of the sqlite3_recover structure) used while
18870** recovering data for tables identified in the recovered schema (state
18871** RECOVER_STATE_WRITING).
18872*/
18873typedef struct RecoverStateW1 RecoverStateW1;
18874struct RecoverStateW1 {
18875 sqlite3_stmt *pTbls;
18876 sqlite3_stmt *pSel;
18877 sqlite3_stmt *pInsert;
18878 int nInsert;
18879
18880 RecoverTable *pTab; /* Table currently being written */
18881 int nMax; /* Max column count in any schema table */
18882 sqlite3_value **apVal; /* Array of nMax values */
18883 int nVal; /* Number of valid entries in apVal[] */
18884 int bHaveRowid;
18885 i64 iRowid;
18886 i64 iPrevPage;
18887 int iPrevCell;
18888};
18889
18890/*
18891** State variables (part of the sqlite3_recover structure) used while
18892** recovering data destined for the lost and found table (states
18893** RECOVER_STATE_LOSTANDFOUND[123]).
18894*/
18895typedef struct RecoverStateLAF RecoverStateLAF;
18896struct RecoverStateLAF {
18897 RecoverBitmap *pUsed;
18898 i64 nPg; /* Size of db in pages */
18899 sqlite3_stmt *pAllAndParent;
18900 sqlite3_stmt *pMapInsert;
18901 sqlite3_stmt *pMaxField;
18902 sqlite3_stmt *pUsedPages;
18903 sqlite3_stmt *pFindRoot;
18904 sqlite3_stmt *pInsert; /* INSERT INTO lost_and_found ... */
18905 sqlite3_stmt *pAllPage;
18906 sqlite3_stmt *pPageData;
18907 sqlite3_value **apVal;
18908 int nMaxField;
18909};
18910
18911/*
18912** Main recover handle structure.
18913*/
18914struct sqlite3_recover {
18915 /* Copies of sqlite3_recover_init[_sql]() parameters */
18916 sqlite3 *dbIn; /* Input database */
18917 char *zDb; /* Name of input db ("main" etc.) */
18918 char *zUri; /* URI for output database */
18919 void *pSqlCtx; /* SQL callback context */
18920 int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
18921
18922 /* Values configured by sqlite3_recover_config() */
18923 char *zStateDb; /* State database to use (or NULL) */
18924 char *zLostAndFound; /* Name of lost-and-found table (or NULL) */
18925 int bFreelistCorrupt; /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
18926 int bRecoverRowid; /* SQLITE_RECOVER_ROWIDS setting */
18927 int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */
18928
18929 int pgsz;
18930 int detected_pgsz;
18931 int nReserve;
18932 u8 *pPage1Disk;
18933 u8 *pPage1Cache;
18934
18935 /* Error code and error message */
18936 int errCode; /* For sqlite3_recover_errcode() */
18937 char *zErrMsg; /* For sqlite3_recover_errmsg() */
18938
18939 int eState;
18940 int bCloseTransaction;
18941
18942 /* Variables used with eState==RECOVER_STATE_WRITING */
18943 RecoverStateW1 w1;
18944
18945 /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
18946 RecoverStateLAF laf;
18947
18948 /* Fields used within sqlite3_recover_run() */
18949 sqlite3 *dbOut; /* Output database */
18950 sqlite3_stmt *pGetPage; /* SELECT against input db sqlite_dbdata */
18951 RecoverTable *pTblList; /* List of tables recovered from schema */
18952};
18953
18954/*
18955** The various states in which an sqlite3_recover object may exist:
18956**
18957** RECOVER_STATE_INIT:
18958** The object is initially created in this state. sqlite3_recover_step()
18959** has yet to be called. This is the only state in which it is permitted
18960** to call sqlite3_recover_config().
18961**
18962** RECOVER_STATE_WRITING:
18963**
18964** RECOVER_STATE_LOSTANDFOUND1:
18965** State to populate the bitmap of pages used by other tables or the
18966** database freelist.
18967**
18968** RECOVER_STATE_LOSTANDFOUND2:
18969** Populate the recovery.map table - used to figure out a "root" page
18970** for each lost page from in the database from which records are
18971** extracted.
18972**
18973** RECOVER_STATE_LOSTANDFOUND3:
18974** Populate the lost-and-found table itself.
18975*/
18976#define RECOVER_STATE_INIT 0
18977#define RECOVER_STATE_WRITING 1
18978#define RECOVER_STATE_LOSTANDFOUND1 2
18979#define RECOVER_STATE_LOSTANDFOUND2 3
18980#define RECOVER_STATE_LOSTANDFOUND3 4
18981#define RECOVER_STATE_SCHEMA2 5
18982#define RECOVER_STATE_DONE 6
18983
18984
18985/*
18986** Global variables used by this extension.
18987*/
18988typedef struct RecoverGlobal RecoverGlobal;
18989struct RecoverGlobal {
18990 const sqlite3_io_methods *pMethods;
18991 sqlite3_recover *p;
18992};
18993static RecoverGlobal recover_g;
18994
18995/*
18996** Use this static SQLite mutex to protect the globals during the
18997** first call to sqlite3_recover_step().
18998*/
18999#define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
19000
19001
19002/*
19003** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
19004*/
19005#define RECOVER_ROWID_DEFAULT 1
19006
19007/*
19008** Mutex handling:
19009**
19010** recoverEnterMutex() - Enter the recovery mutex
19011** recoverLeaveMutex() - Leave the recovery mutex
19012** recoverAssertMutexHeld() - Assert that the recovery mutex is held
19013*/
19014#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
19015# define recoverEnterMutex()
19016# define recoverLeaveMutex()
19017#else
19018static void recoverEnterMutex(void){
19019 sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
19020}
19021static void recoverLeaveMutex(void){
19022 sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
19023}
19024#endif
19025#if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
19026static void recoverAssertMutexHeld(void){
19027 assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
19028}
19029#else
19030# define recoverAssertMutexHeld()
19031#endif
19032
19033
19034/*
19035** Like strlen(). But handles NULL pointer arguments.
19036*/
19037static int recoverStrlen(const char *zStr){
19038 if( zStr==0 ) return 0;
19039 return (int)(strlen(zStr)&0x7fffffff);
19040}
19041
19042/*
19043** This function is a no-op if the recover handle passed as the first
19044** argument already contains an error (if p->errCode!=SQLITE_OK).
19045**
19046** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
19047** bytes in size. If successful, a pointer to the new buffer is returned. Or,
19048** if an OOM error occurs, NULL is returned and the handle error code
19049** (p->errCode) set to SQLITE_NOMEM.
19050*/
19051static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
19052 void *pRet = 0;
19053 assert( nByte>0 );
19054 if( p->errCode==SQLITE_OK ){
19055 pRet = sqlite3_malloc64(nByte);
19056 if( pRet ){
19057 memset(pRet, 0, nByte);
19058 }else{
19059 p->errCode = SQLITE_NOMEM;
19060 }
19061 }
19062 return pRet;
19063}
19064
19065/*
19066** Set the error code and error message for the recover handle passed as
19067** the first argument. The error code is set to the value of parameter
19068** errCode.
19069**
19070** Parameter zFmt must be a printf() style formatting string. The handle
19071** error message is set to the result of using any trailing arguments for
19072** parameter substitutions in the formatting string.
19073**
19074** For example:
19075**
19076** recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
19077*/
19078static int recoverError(
19079 sqlite3_recover *p,
19080 int errCode,
19081 const char *zFmt, ...
19082){
19083 char *z = 0;
19084 va_list ap;
19085 va_start(ap, zFmt);
19086 if( zFmt ){
19087 z = sqlite3_vmprintf(zFmt, ap);
19088 }
19089 va_end(ap);
19090 sqlite3_free(p->zErrMsg);
19091 p->zErrMsg = z;
19092 p->errCode = errCode;
19093 return errCode;
19094}
19095
19096
19097/*
19098** This function is a no-op if p->errCode is initially other than SQLITE_OK.
19099** In this case it returns NULL.
19100**
19101** Otherwise, an attempt is made to allocate and return a bitmap object
19102** large enough to store a bit for all page numbers between 1 and nPg,
19103** inclusive. The bitmap is initially zeroed.
19104*/
19105static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
19106 int nElem = (nPg+1+31) / 32;
19107 int nByte = SZ_RECOVERBITMAP_32 + nElem*sizeof(u32);
19108 RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
19109
19110 if( pRet ){
19111 pRet->nPg = nPg;
19112 }
19113 return pRet;
19114}
19115
19116/*
19117** Free a bitmap object allocated by recoverBitmapAlloc().
19118*/
19119static void recoverBitmapFree(RecoverBitmap *pMap){
19120 sqlite3_free(pMap);
19121}
19122
19123/*
19124** Set the bit associated with page iPg in bitvec pMap.
19125*/
19126static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
19127 if( iPg<=pMap->nPg ){
19128 int iElem = (iPg / 32);
19129 int iBit = (iPg % 32);
19130 pMap->aElem[iElem] |= (((u32)1) << iBit);
19131 }
19132}
19133
19134/*
19135** Query bitmap object pMap for the state of the bit associated with page
19136** iPg. Return 1 if it is set, or 0 otherwise.
19137*/
19138static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
19139 int ret = 1;
19140 if( iPg<=pMap->nPg && iPg>0 ){
19141 int iElem = (iPg / 32);
19142 int iBit = (iPg % 32);
19143 ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
19144 }
19145 return ret;
19146}
19147
19148/*
19149** Set the recover handle error to the error code and message returned by
19150** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
19151** handle db.
19152*/
19153static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
19154 return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
19155}
19156
19157/*
19158** This function is a no-op if recover handle p already contains an error
19159** (if p->errCode!=SQLITE_OK).
19160**
19161** Otherwise, it attempts to prepare the SQL statement in zSql against
19162** database handle db. If successful, the statement handle is returned.
19163** Or, if an error occurs, NULL is returned and an error left in the
19164** recover handle.
19165*/
19166static sqlite3_stmt *recoverPrepare(
19167 sqlite3_recover *p,
19168 sqlite3 *db,
19169 const char *zSql
19170){
19171 sqlite3_stmt *pStmt = 0;
19172 if( p->errCode==SQLITE_OK ){
19173 if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
19174 recoverDbError(p, db);
19175 }
19176 }
19177 return pStmt;
19178}
19179
19180/*
19181** This function is a no-op if recover handle p already contains an error
19182** (if p->errCode!=SQLITE_OK).
19183**
19184** Otherwise, argument zFmt is used as a printf() style format string,
19185** along with any trailing arguments, to create an SQL statement. This
19186** SQL statement is prepared against database handle db and, if successful,
19187** the statment handle returned. Or, if an error occurs - either during
19188** the printf() formatting or when preparing the resulting SQL - an
19189** error code and message are left in the recover handle.
19190*/
19191static sqlite3_stmt *recoverPreparePrintf(
19192 sqlite3_recover *p,
19193 sqlite3 *db,
19194 const char *zFmt, ...
19195){
19196 sqlite3_stmt *pStmt = 0;
19197 if( p->errCode==SQLITE_OK ){
19198 va_list ap;
19199 char *z;
19200 va_start(ap, zFmt);
19201 z = sqlite3_vmprintf(zFmt, ap);
19202 va_end(ap);
19203 if( z==0 ){
19204 p->errCode = SQLITE_NOMEM;
19205 }else{
19206 pStmt = recoverPrepare(p, db, z);
19207 sqlite3_free(z);
19208 }
19209 }
19210 return pStmt;
19211}
19212
19213/*
19214** Reset SQLite statement handle pStmt. If the call to sqlite3_reset()
19215** indicates that an error occurred, and there is not already an error
19216** in the recover handle passed as the first argument, set the error
19217** code and error message appropriately.
19218**
19219** This function returns a copy of the statement handle pointer passed
19220** as the second argument.
19221*/
19222static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
19223 int rc = sqlite3_reset(pStmt);
19224 if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
19225 recoverDbError(p, sqlite3_db_handle(pStmt));
19226 }
19227 return pStmt;
19228}
19229
19230/*
19231** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset()
19232** indicates that an error occurred, and there is not already an error
19233** in the recover handle passed as the first argument, set the error
19234** code and error message appropriately.
19235*/
19236static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
19237 sqlite3 *db = sqlite3_db_handle(pStmt);
19238 int rc = sqlite3_finalize(pStmt);
19239 if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
19240 recoverDbError(p, db);
19241 }
19242}
19243
19244/*
19245** This function is a no-op if recover handle p already contains an error
19246** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this
19247** case.
19248**
19249** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
19250** Or, if an error occurs, leave an error code and message in the recover
19251** handle and return a copy of the error code.
19252*/
19253static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
19254 if( p->errCode==SQLITE_OK ){
19255 int rc = sqlite3_exec(db, zSql, 0, 0, 0);
19256 if( rc ){
19257 recoverDbError(p, db);
19258 }
19259 }
19260 return p->errCode;
19261}
19262
19263/*
19264** Bind the value pVal to parameter iBind of statement pStmt. Leave an
19265** error in the recover handle passed as the first argument if an error
19266** (e.g. an OOM) occurs.
19267*/
19268static void recoverBindValue(
19269 sqlite3_recover *p,
19270 sqlite3_stmt *pStmt,
19271 int iBind,
19272 sqlite3_value *pVal
19273){
19274 if( p->errCode==SQLITE_OK ){
19275 int rc = sqlite3_bind_value(pStmt, iBind, pVal);
19276 if( rc ) recoverError(p, rc, 0);
19277 }
19278}
19279
19280/*
19281** This function is a no-op if recover handle p already contains an error
19282** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
19283**
19284** Otherwise, an attempt is made to interpret zFmt as a printf() style
19285** formatting string and the result of using the trailing arguments for
19286** parameter substitution with it written into a buffer obtained from
19287** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
19288** It is the responsibility of the caller to eventually free the buffer
19289** using sqlite3_free().
19290**
19291** Or, if an error occurs, an error code and message is left in the recover
19292** handle and NULL returned.
19293*/
19294static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
19295 va_list ap;
19296 char *z;
19297 va_start(ap, zFmt);
19298 z = sqlite3_vmprintf(zFmt, ap);
19299 va_end(ap);
19300 if( p->errCode==SQLITE_OK ){
19301 if( z==0 ) p->errCode = SQLITE_NOMEM;
19302 }else{
19303 sqlite3_free(z);
19304 z = 0;
19305 }
19306 return z;
19307}
19308
19309/*
19310** This function is a no-op if recover handle p already contains an error
19311** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
19312**
19313** Otherwise, execute "PRAGMA page_count" against the input database. If
19314** successful, return the integer result. Or, if an error occurs, leave an
19315** error code and error message in the sqlite3_recover handle and return
19316** zero.
19317*/
19318static i64 recoverPageCount(sqlite3_recover *p){
19319 i64 nPg = 0;
19320 if( p->errCode==SQLITE_OK ){
19321 sqlite3_stmt *pStmt = 0;
19322 pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
19323 if( pStmt ){
19324 sqlite3_step(pStmt);
19325 nPg = sqlite3_column_int64(pStmt, 0);
19326 }
19327 recoverFinalize(p, pStmt);
19328 }
19329 return nPg;
19330}
19331
19332/*
19333** Implementation of SQL scalar function "read_i32". The first argument to
19334** this function must be a blob. The second a non-negative integer. This
19335** function reads and returns a 32-bit big-endian integer from byte
19336** offset (4*<arg2>) of the blob.
19337**
19338** SELECT read_i32(<blob>, <idx>)
19339*/
19340static void recoverReadI32(
19341 sqlite3_context *context,
19342 int argc,
19343 sqlite3_value **argv
19344){
19345 const unsigned char *pBlob;
19346 int nBlob;
19347 int iInt;
19348
19349 assert( argc==2 );
19350 nBlob = sqlite3_value_bytes(argv[0]);
19351 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
19352 iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
19353
19354 if( (iInt+1)*4<=nBlob ){
19355 const unsigned char *a = &pBlob[iInt*4];
19356 i64 iVal = ((i64)a[0]<<24)
19357 + ((i64)a[1]<<16)
19358 + ((i64)a[2]<< 8)
19359 + ((i64)a[3]<< 0);
19360 sqlite3_result_int64(context, iVal);
19361 }
19362}
19363
19364/*
19365** Implementation of SQL scalar function "page_is_used". This function
19366** is used as part of the procedure for locating orphan rows for the
19367** lost-and-found table, and it depends on those routines having populated
19368** the sqlite3_recover.laf.pUsed variable.
19369**
19370** The only argument to this function is a page-number. It returns true
19371** if the page has already been used somehow during data recovery, or false
19372** otherwise.
19373**
19374** SELECT page_is_used(<pgno>);
19375*/
19376static void recoverPageIsUsed(
19377 sqlite3_context *pCtx,
19378 int nArg,
19379 sqlite3_value **apArg
19380){
19381 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
19382 i64 pgno = sqlite3_value_int64(apArg[0]);
19383 assert( nArg==1 );
19384 sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
19385}
19386
19387/*
19388** The implementation of a user-defined SQL function invoked by the
19389** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
19390** of the database being recovered.
19391**
19392** This function always takes a single integer argument. If the argument
19393** is zero, then the value returned is the number of pages in the db being
19394** recovered. If the argument is greater than zero, it is a page number.
19395** The value returned in this case is an SQL blob containing the data for
19396** the identified page of the db being recovered. e.g.
19397**
19398** SELECT getpage(0); -- return number of pages in db
19399** SELECT getpage(4); -- return page 4 of db as a blob of data
19400*/
19401static void recoverGetPage(
19402 sqlite3_context *pCtx,
19403 int nArg,
19404 sqlite3_value **apArg
19405){
19406 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
19407 i64 pgno = sqlite3_value_int64(apArg[0]);
19408 sqlite3_stmt *pStmt = 0;
19409
19410 assert( nArg==1 );
19411 if( pgno==0 ){
19412 i64 nPg = recoverPageCount(p);
19413 sqlite3_result_int64(pCtx, nPg);
19414 return;
19415 }else{
19416 if( p->pGetPage==0 ){
19417 pStmt = p->pGetPage = recoverPreparePrintf(
19418 p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
19419 );
19420 }else if( p->errCode==SQLITE_OK ){
19421 pStmt = p->pGetPage;
19422 }
19423
19424 if( pStmt ){
19425 sqlite3_bind_int64(pStmt, 1, pgno);
19426 if( SQLITE_ROW==sqlite3_step(pStmt) ){
19427 const u8 *aPg;
19428 int nPg;
19429 assert( p->errCode==SQLITE_OK );
19430 aPg = sqlite3_column_blob(pStmt, 0);
19431 nPg = sqlite3_column_bytes(pStmt, 0);
19432 if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
19433 aPg = p->pPage1Disk;
19434 }
19435 sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
19436 }
19437 recoverReset(p, pStmt);
19438 }
19439 }
19440
19441 if( p->errCode ){
19442 if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
19443 sqlite3_result_error_code(pCtx, p->errCode);
19444 }
19445}
19446
19447/*
19448** Find a string that is not found anywhere in z[]. Return a pointer
19449** to that string.
19450**
19451** Try to use zA and zB first. If both of those are already found in z[]
19452** then make up some string and store it in the buffer zBuf.
19453*/
19454static const char *recoverUnusedString(
19455 const char *z, /* Result must not appear anywhere in z */
19456 const char *zA, const char *zB, /* Try these first */
19457 char *zBuf /* Space to store a generated string */
19458){
19459 unsigned i = 0;
19460 if( strstr(z, zA)==0 ) return zA;
19461 if( strstr(z, zB)==0 ) return zB;
19462 do{
19463 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
19464 }while( strstr(z,zBuf)!=0 );
19465 return zBuf;
19466}
19467
19468/*
19469** Implementation of scalar SQL function "escape_crlf". The argument passed to
19470** this function is the output of built-in function quote(). If the first
19471** character of the input is "'", indicating that the value passed to quote()
19472** was a text value, then this function searches the input for "\n" and "\r"
19473** characters and adds a wrapper similar to the following:
19474**
19475** replace(replace(<input>, '\n', char(10), '\r', char(13));
19476**
19477** Or, if the first character of the input is not "'", then a copy of the input
19478** is returned.
19479*/
19480static void recoverEscapeCrlf(
19481 sqlite3_context *context,
19482 int argc,
19483 sqlite3_value **argv
19484){
19485 const char *zText = (const char*)sqlite3_value_text(argv[0]);
19486 (void)argc;
19487 if( zText && zText[0]=='\'' ){
19488 int nText = sqlite3_value_bytes(argv[0]);
19489 int i;
19490 char zBuf1[20];
19491 char zBuf2[20];
19492 const char *zNL = 0;
19493 const char *zCR = 0;
19494 int nCR = 0;
19495 int nNL = 0;
19496
19497 for(i=0; zText[i]; i++){
19498 if( zNL==0 && zText[i]=='\n' ){
19499 zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
19500 nNL = (int)strlen(zNL);
19501 }
19502 if( zCR==0 && zText[i]=='\r' ){
19503 zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
19504 nCR = (int)strlen(zCR);
19505 }
19506 }
19507
19508 if( zNL || zCR ){
19509 int iOut = 0;
19510 i64 nMax = (nNL > nCR) ? nNL : nCR;
19511 i64 nAlloc = nMax * nText + (nMax+64)*2;
19512 char *zOut = (char*)sqlite3_malloc64(nAlloc);
19513 if( zOut==0 ){
19514 sqlite3_result_error_nomem(context);
19515 return;
19516 }
19517
19518 if( zNL && zCR ){
19519 memcpy(&zOut[iOut], "replace(replace(", 16);
19520 iOut += 16;
19521 }else{
19522 memcpy(&zOut[iOut], "replace(", 8);
19523 iOut += 8;
19524 }
19525 for(i=0; zText[i]; i++){
19526 if( zText[i]=='\n' ){
19527 memcpy(&zOut[iOut], zNL, nNL);
19528 iOut += nNL;
19529 }else if( zText[i]=='\r' ){
19530 memcpy(&zOut[iOut], zCR, nCR);
19531 iOut += nCR;
19532 }else{
19533 zOut[iOut] = zText[i];
19534 iOut++;
19535 }
19536 }
19537
19538 if( zNL ){
19539 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
19540 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
19541 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
19542 }
19543 if( zCR ){
19544 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
19545 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
19546 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
19547 }
19548
19549 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
19550 sqlite3_free(zOut);
19551 return;
19552 }
19553 }
19554
19555 sqlite3_result_value(context, argv[0]);
19556}
19557
19558/*
19559** This function is a no-op if recover handle p already contains an error
19560** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
19561** this case.
19562**
19563** Otherwise, attempt to populate temporary table "recovery.schema" with the
19564** parts of the database schema that can be extracted from the input database.
19565**
19566** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
19567** and error message are left in the recover handle and a copy of the
19568** error code returned. It is not considered an error if part of all of
19569** the database schema cannot be recovered due to corruption.
19570*/
19571static int recoverCacheSchema(sqlite3_recover *p){
19572 return recoverExec(p, p->dbOut,
19573 "WITH RECURSIVE pages(p) AS ("
19574 " SELECT 1"
19575 " UNION"
19576 " SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
19577 ")"
19578 "INSERT INTO recovery.schema SELECT"
19579 " max(CASE WHEN field=0 THEN value ELSE NULL END),"
19580 " max(CASE WHEN field=1 THEN value ELSE NULL END),"
19581 " max(CASE WHEN field=2 THEN value ELSE NULL END),"
19582 " max(CASE WHEN field=3 THEN value ELSE NULL END),"
19583 " max(CASE WHEN field=4 THEN value ELSE NULL END)"
19584 "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
19585 " SELECT p FROM pages"
19586 ") GROUP BY pgno, cell"
19587 );
19588}
19589
19590/*
19591** If this recover handle is not in SQL callback mode (i.e. was not created
19592** using sqlite3_recover_init_sql()) of if an error has already occurred,
19593** this function is a no-op. Otherwise, issue a callback with SQL statement
19594** zSql as the parameter.
19595**
19596** If the callback returns non-zero, set the recover handle error code to
19597** the value returned (so that the caller will abandon processing).
19598*/
19599static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
19600 if( p->errCode==SQLITE_OK && p->xSql ){
19601 int res = p->xSql(p->pSqlCtx, zSql);
19602 if( res ){
19603 recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
19604 }
19605 }
19606}
19607
19608/*
19609** Transfer the following settings from the input database to the output
19610** database:
19611**
19612** + page-size,
19613** + auto-vacuum settings,
19614** + database encoding,
19615** + user-version (PRAGMA user_version), and
19616** + application-id (PRAGMA application_id), and
19617*/
19618static void recoverTransferSettings(sqlite3_recover *p){
19619 const char *aPragma[] = {
19620 "encoding",
19621 "page_size",
19622 "auto_vacuum",
19623 "user_version",
19624 "application_id"
19625 };
19626 int ii;
19627
19628 /* Truncate the output database to 0 pages in size. This is done by
19629 ** opening a new, empty, temp db, then using the backup API to clobber
19630 ** any existing output db with a copy of it. */
19631 if( p->errCode==SQLITE_OK ){
19632 sqlite3 *db2 = 0;
19633 int rc = sqlite3_open("", &db2);
19634 if( rc!=SQLITE_OK ){
19635 recoverDbError(p, db2);
19636 return;
19637 }
19638
19639 for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
19640 const char *zPrag = aPragma[ii];
19641 sqlite3_stmt *p1 = 0;
19642 p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
19643 if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
19644 const char *zArg = (const char*)sqlite3_column_text(p1, 0);
19645 char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
19646 recoverSqlCallback(p, z2);
19647 recoverExec(p, db2, z2);
19648 sqlite3_free(z2);
19649 if( zArg==0 ){
19650 recoverError(p, SQLITE_NOMEM, 0);
19651 }
19652 }
19653 recoverFinalize(p, p1);
19654 }
19655 recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
19656
19657 if( p->errCode==SQLITE_OK ){
19658 sqlite3 *db = p->dbOut;
19659 sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
19660 if( pBackup ){
19661 sqlite3_backup_step(pBackup, -1);
19662 p->errCode = sqlite3_backup_finish(pBackup);
19663 }else{
19664 recoverDbError(p, db);
19665 }
19666 }
19667
19668 sqlite3_close(db2);
19669 }
19670}
19671
19672/*
19673** This function is a no-op if recover handle p already contains an error
19674** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
19675** this case.
19676**
19677** Otherwise, an attempt is made to open the output database, attach
19678** and create the schema of the temporary database used to store
19679** intermediate data, and to register all required user functions and
19680** virtual table modules with the output handle.
19681**
19682** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
19683** and error message are left in the recover handle and a copy of the
19684** error code returned.
19685*/
19686static int recoverOpenOutput(sqlite3_recover *p){
19687 struct Func {
19688 const char *zName;
19689 int nArg;
19690 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
19691 } aFunc[] = {
19692 { "getpage", 1, recoverGetPage },
19693 { "page_is_used", 1, recoverPageIsUsed },
19694 { "read_i32", 2, recoverReadI32 },
19695 { "escape_crlf", 1, recoverEscapeCrlf },
19696 };
19697
19698 const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
19699 sqlite3 *db = 0; /* New database handle */
19700 int ii; /* For iterating through aFunc[] */
19701
19702 assert( p->dbOut==0 );
19703
19704 if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
19705 recoverDbError(p, db);
19706 }
19707
19708 /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
19709 ** These two are registered with the output database handle - this
19710 ** module depends on the input handle supporting the sqlite_dbpage
19711 ** virtual table only. */
19712 if( p->errCode==SQLITE_OK ){
19713 p->errCode = sqlite3_dbdata_init(db, 0, 0);
19714 }
19715
19716 /* Register the custom user-functions with the output handle. */
19717 for(ii=0;
19718 p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
19719 ii++){
19720 p->errCode = sqlite3_create_function(db, aFunc[ii].zName,
19721 aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
19722 );
19723 }
19724
19725 p->dbOut = db;
19726 return p->errCode;
19727}
19728
19729/*
19730** Attach the auxiliary database 'recovery' to the output database handle.
19731** This temporary database is used during the recovery process and then
19732** discarded.
19733*/
19734static void recoverOpenRecovery(sqlite3_recover *p){
19735 char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
19736 recoverExec(p, p->dbOut, zSql);
19737 recoverExec(p, p->dbOut,
19738 "PRAGMA writable_schema = 1;"
19739 "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);"
19740 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
19741 );
19742 sqlite3_free(zSql);
19743}
19744
19745
19746/*
19747** This function is a no-op if recover handle p already contains an error
19748** (if p->errCode!=SQLITE_OK).
19749**
19750** Otherwise, argument zName must be the name of a table that has just been
19751** created in the output database. This function queries the output db
19752** for the schema of said table, and creates a RecoverTable object to
19753** store the schema in memory. The new RecoverTable object is linked into
19754** the list at sqlite3_recover.pTblList.
19755**
19756** Parameter iRoot must be the root page of table zName in the INPUT
19757** database.
19758*/
19759static void recoverAddTable(
19760 sqlite3_recover *p,
19761 const char *zName, /* Name of table created in output db */
19762 i64 iRoot /* Root page of same table in INPUT db */
19763){
19764 sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut,
19765 "PRAGMA table_xinfo(%Q)", zName
19766 );
19767
19768 if( pStmt ){
19769 int iPk = -1;
19770 int iBind = 1;
19771 RecoverTable *pNew = 0;
19772 int nCol = 0;
19773 int nName = recoverStrlen(zName);
19774 int nByte = 0;
19775 while( sqlite3_step(pStmt)==SQLITE_ROW ){
19776 nCol++;
19777 nByte += (sqlite3_column_bytes(pStmt, 1)+1);
19778 }
19779 nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
19780 recoverReset(p, pStmt);
19781
19782 pNew = recoverMalloc(p, nByte);
19783 if( pNew ){
19784 int i = 0;
19785 int iField = 0;
19786 char *csr = 0;
19787 pNew->aCol = (RecoverColumn*)&pNew[1];
19788 pNew->zTab = csr = (char*)&pNew->aCol[nCol];
19789 pNew->nCol = nCol;
19790 pNew->iRoot = iRoot;
19791 memcpy(csr, zName, nName);
19792 csr += nName+1;
19793
19794 for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
19795 int iPKF = sqlite3_column_int(pStmt, 5);
19796 int n = sqlite3_column_bytes(pStmt, 1);
19797 const char *z = (const char*)sqlite3_column_text(pStmt, 1);
19798 const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
19799 int eHidden = sqlite3_column_int(pStmt, 6);
19800
19801 if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
19802 if( iPKF>1 ) iPk = -2;
19803 pNew->aCol[i].zCol = csr;
19804 pNew->aCol[i].eHidden = eHidden;
19805 if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
19806 pNew->aCol[i].iField = -1;
19807 }else{
19808 pNew->aCol[i].iField = iField++;
19809 }
19810 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
19811 && eHidden!=RECOVER_EHIDDEN_STORED
19812 ){
19813 pNew->aCol[i].iBind = iBind++;
19814 }
19815 memcpy(csr, z, n);
19816 csr += (n+1);
19817 }
19818
19819 pNew->pNext = p->pTblList;
19820 p->pTblList = pNew;
19821 pNew->bIntkey = 1;
19822 }
19823
19824 recoverFinalize(p, pStmt);
19825
19826 pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
19827 while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
19828 int iField = sqlite3_column_int(pStmt, 0);
19829 int iCol = sqlite3_column_int(pStmt, 1);
19830
19831 assert( iCol<pNew->nCol );
19832 pNew->aCol[iCol].iField = iField;
19833
19834 pNew->bIntkey = 0;
19835 iPk = -2;
19836 }
19837 recoverFinalize(p, pStmt);
19838
19839 if( p->errCode==SQLITE_OK ){
19840 if( iPk>=0 ){
19841 pNew->aCol[iPk].bIPK = 1;
19842 }else if( pNew->bIntkey ){
19843 pNew->iRowidBind = iBind++;
19844 }
19845 }
19846 }
19847}
19848
19849/*
19850** This function is called after recoverCacheSchema() has cached those parts
19851** of the input database schema that could be recovered in temporary table
19852** "recovery.schema". This function creates in the output database copies
19853** of all parts of that schema that must be created before the tables can
19854** be populated. Specifically, this means:
19855**
19856** * all tables that are not VIRTUAL, and
19857** * UNIQUE indexes.
19858**
19859** If the recovery handle uses SQL callbacks, then callbacks containing
19860** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
19861**
19862** Additionally, records are added to the sqlite_schema table of the
19863** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
19864** records are written directly to sqlite_schema, not actually executed.
19865** If the handle is in SQL callback mode, then callbacks are invoked
19866** with equivalent SQL statements.
19867*/
19868static int recoverWriteSchema1(sqlite3_recover *p){
19869 sqlite3_stmt *pSelect = 0;
19870 sqlite3_stmt *pTblname = 0;
19871
19872 pSelect = recoverPrepare(p, p->dbOut,
19873 "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
19874 " SELECT rootpage, name, sql, "
19875 " type='table', "
19876 " sql LIKE 'create virtual%',"
19877 " (type='index' AND (sql LIKE '%unique%' OR ?1))"
19878 " FROM recovery.schema"
19879 ")"
19880 "SELECT rootpage, tbl, isVirtual, name, sql"
19881 " FROM dbschema "
19882 " WHERE tbl OR isIndex"
19883 " ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
19884 );
19885
19886 pTblname = recoverPrepare(p, p->dbOut,
19887 "SELECT name FROM sqlite_schema "
19888 "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
19889 );
19890
19891 if( pSelect ){
19892 sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
19893 while( sqlite3_step(pSelect)==SQLITE_ROW ){
19894 i64 iRoot = sqlite3_column_int64(pSelect, 0);
19895 int bTable = sqlite3_column_int(pSelect, 1);
19896 int bVirtual = sqlite3_column_int(pSelect, 2);
19897 const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
19898 const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
19899 char *zFree = 0;
19900 int rc = SQLITE_OK;
19901
19902 if( bVirtual ){
19903 zSql = (const char*)(zFree = recoverMPrintf(p,
19904 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
19905 zName, zName, zSql
19906 ));
19907 }
19908 rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
19909 if( rc==SQLITE_OK ){
19910 recoverSqlCallback(p, zSql);
19911 if( bTable && !bVirtual ){
19912 if( SQLITE_ROW==sqlite3_step(pTblname) ){
19913 const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
19914 if( zTbl ) recoverAddTable(p, zTbl, iRoot);
19915 }
19916 recoverReset(p, pTblname);
19917 }
19918 }else if( rc!=SQLITE_ERROR ){
19919 recoverDbError(p, p->dbOut);
19920 }
19921 sqlite3_free(zFree);
19922 }
19923 }
19924 recoverFinalize(p, pSelect);
19925 recoverFinalize(p, pTblname);
19926
19927 return p->errCode;
19928}
19929
19930/*
19931** This function is called after the output database has been populated. It
19932** adds all recovered schema elements that were not created in the output
19933** database by recoverWriteSchema1() - everything except for tables and
19934** UNIQUE indexes. Specifically:
19935**
19936** * views,
19937** * triggers,
19938** * non-UNIQUE indexes.
19939**
19940** If the recover handle is in SQL callback mode, then equivalent callbacks
19941** are issued to create the schema elements.
19942*/
19943static int recoverWriteSchema2(sqlite3_recover *p){
19944 sqlite3_stmt *pSelect = 0;
19945
19946 pSelect = recoverPrepare(p, p->dbOut,
19947 p->bSlowIndexes ?
19948 "SELECT rootpage, sql FROM recovery.schema "
19949 " WHERE type!='table' AND type!='index'"
19950 :
19951 "SELECT rootpage, sql FROM recovery.schema "
19952 " WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
19953 );
19954
19955 if( pSelect ){
19956 while( sqlite3_step(pSelect)==SQLITE_ROW ){
19957 const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
19958 int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
19959 if( rc==SQLITE_OK ){
19960 recoverSqlCallback(p, zSql);
19961 }else if( rc!=SQLITE_ERROR ){
19962 recoverDbError(p, p->dbOut);
19963 }
19964 }
19965 }
19966 recoverFinalize(p, pSelect);
19967
19968 return p->errCode;
19969}
19970
19971/*
19972** This function is a no-op if recover handle p already contains an error
19973** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
19974**
19975** Otherwise, if the recover handle is configured to create an output
19976** database (was created by sqlite3_recover_init()), then this function
19977** prepares and returns an SQL statement to INSERT a new record into table
19978** pTab, assuming the first nField fields of a record extracted from disk
19979** are valid.
19980**
19981** For example, if table pTab is:
19982**
19983** CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
19984**
19985** And nField is 4, then the SQL statement prepared and returned is:
19986**
19987** INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
19988**
19989** In this case even though 4 values were extracted from the input db,
19990** only 3 are written to the output, as the generated STORED column
19991** cannot be written.
19992**
19993** If the recover handle is in SQL callback mode, then the SQL statement
19994** prepared is such that evaluating it returns a single row containing
19995** a single text value - itself an SQL statement similar to the above,
19996** except with SQL literals in place of the variables. For example:
19997**
19998** SELECT 'INSERT INTO (a, c, d) VALUES ('
19999** || quote(?1) || ', '
20000** || quote(?2) || ', '
20001** || quote(?3) || ')';
20002**
20003** In either case, it is the responsibility of the caller to eventually
20004** free the statement handle using sqlite3_finalize().
20005*/
20006static sqlite3_stmt *recoverInsertStmt(
20007 sqlite3_recover *p,
20008 RecoverTable *pTab,
20009 int nField
20010){
20011 sqlite3_stmt *pRet = 0;
20012 const char *zSep = "";
20013 const char *zSqlSep = "";
20014 char *zSql = 0;
20015 char *zFinal = 0;
20016 char *zBind = 0;
20017 int ii;
20018 int bSql = p->xSql ? 1 : 0;
20019
20020 if( nField<=0 ) return 0;
20021
20022 assert( nField<=pTab->nCol );
20023
20024 zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
20025
20026 if( pTab->iRowidBind ){
20027 assert( pTab->bIntkey );
20028 zSql = recoverMPrintf(p, "%z_rowid_", zSql);
20029 if( bSql ){
20030 zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
20031 }else{
20032 zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
20033 }
20034 zSqlSep = "||', '||";
20035 zSep = ", ";
20036 }
20037
20038 for(ii=0; ii<nField; ii++){
20039 int eHidden = pTab->aCol[ii].eHidden;
20040 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
20041 && eHidden!=RECOVER_EHIDDEN_STORED
20042 ){
20043 assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
20044 zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
20045
20046 if( bSql ){
20047 zBind = recoverMPrintf(p,
20048 "%z%sescape_crlf(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
20049 );
20050 zSqlSep = "||', '||";
20051 }else{
20052 zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
20053 }
20054 zSep = ", ";
20055 }
20056 }
20057
20058 if( bSql ){
20059 zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'",
20060 zSql, zBind
20061 );
20062 }else{
20063 zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
20064 }
20065
20066 pRet = recoverPrepare(p, p->dbOut, zFinal);
20067 sqlite3_free(zSql);
20068 sqlite3_free(zBind);
20069 sqlite3_free(zFinal);
20070
20071 return pRet;
20072}
20073
20074
20075/*
20076** Search the list of RecoverTable objects at p->pTblList for one that
20077** has root page iRoot in the input database. If such an object is found,
20078** return a pointer to it. Otherwise, return NULL.
20079*/
20080static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
20081 RecoverTable *pRet = 0;
20082 for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
20083 return pRet;
20084}
20085
20086/*
20087** This function attempts to create a lost and found table within the
20088** output db. If successful, it returns a pointer to a buffer containing
20089** the name of the new table. It is the responsibility of the caller to
20090** eventually free this buffer using sqlite3_free().
20091**
20092** If an error occurs, NULL is returned and an error code and error
20093** message left in the recover handle.
20094*/
20095static char *recoverLostAndFoundCreate(
20096 sqlite3_recover *p, /* Recover object */
20097 int nField /* Number of column fields in new table */
20098){
20099 char *zTbl = 0;
20100 sqlite3_stmt *pProbe = 0;
20101 int ii = 0;
20102
20103 pProbe = recoverPrepare(p, p->dbOut,
20104 "SELECT 1 FROM sqlite_schema WHERE name=?"
20105 );
20106 for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
20107 int bFail = 0;
20108 if( ii<0 ){
20109 zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
20110 }else{
20111 zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
20112 }
20113
20114 if( p->errCode==SQLITE_OK ){
20115 sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
20116 if( SQLITE_ROW==sqlite3_step(pProbe) ){
20117 bFail = 1;
20118 }
20119 recoverReset(p, pProbe);
20120 }
20121
20122 if( bFail ){
20123 sqlite3_clear_bindings(pProbe);
20124 sqlite3_free(zTbl);
20125 zTbl = 0;
20126 }
20127 }
20128 recoverFinalize(p, pProbe);
20129
20130 if( zTbl ){
20131 const char *zSep = 0;
20132 char *zField = 0;
20133 char *zSql = 0;
20134
20135 zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
20136 for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
20137 zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
20138 zSep = ", ";
20139 }
20140
20141 zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
20142 sqlite3_free(zField);
20143
20144 recoverExec(p, p->dbOut, zSql);
20145 recoverSqlCallback(p, zSql);
20146 sqlite3_free(zSql);
20147 }else if( p->errCode==SQLITE_OK ){
20148 recoverError(
20149 p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
20150 );
20151 }
20152
20153 return zTbl;
20154}
20155
20156/*
20157** Synthesize and prepare an INSERT statement to write to the lost_and_found
20158** table in the output database. The name of the table is zTab, and it has
20159** nField c* fields.
20160*/
20161static sqlite3_stmt *recoverLostAndFoundInsert(
20162 sqlite3_recover *p,
20163 const char *zTab,
20164 int nField
20165){
20166 int nTotal = nField + 4;
20167 int ii;
20168 char *zBind = 0;
20169 sqlite3_stmt *pRet = 0;
20170
20171 if( p->xSql==0 ){
20172 for(ii=0; ii<nTotal; ii++){
20173 zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
20174 }
20175 pRet = recoverPreparePrintf(
20176 p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
20177 );
20178 }else{
20179 const char *zSep = "";
20180 for(ii=0; ii<nTotal; ii++){
20181 zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
20182 zSep = "|| ', ' ||";
20183 }
20184 pRet = recoverPreparePrintf(
20185 p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
20186 );
20187 }
20188
20189 sqlite3_free(zBind);
20190 return pRet;
20191}
20192
20193/*
20194** Input database page iPg contains data that will be written to the
20195** lost-and-found table of the output database. This function attempts
20196** to identify the root page of the tree that page iPg belonged to.
20197** If successful, it sets output variable (*piRoot) to the page number
20198** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
20199** an SQLite error code is returned and the final value of *piRoot
20200** undefined.
20201*/
20202static int recoverLostAndFoundFindRoot(
20203 sqlite3_recover *p,
20204 i64 iPg,
20205 i64 *piRoot
20206){
20207 RecoverStateLAF *pLaf = &p->laf;
20208
20209 if( pLaf->pFindRoot==0 ){
20210 pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
20211 "WITH RECURSIVE p(pgno) AS ("
20212 " SELECT ?"
20213 " UNION"
20214 " SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
20215 ") "
20216 "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
20217 " AND m.parent IS NULL"
20218 );
20219 }
20220 if( p->errCode==SQLITE_OK ){
20221 sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
20222 if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
20223 *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
20224 }else{
20225 *piRoot = iPg;
20226 }
20227 recoverReset(p, pLaf->pFindRoot);
20228 }
20229 return p->errCode;
20230}
20231
20232/*
20233** Recover data from page iPage of the input database and write it to
20234** the lost-and-found table in the output database.
20235*/
20236static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
20237 RecoverStateLAF *pLaf = &p->laf;
20238 sqlite3_value **apVal = pLaf->apVal;
20239 sqlite3_stmt *pPageData = pLaf->pPageData;
20240 sqlite3_stmt *pInsert = pLaf->pInsert;
20241
20242 int nVal = -1;
20243 int iPrevCell = 0;
20244 i64 iRoot = 0;
20245 int bHaveRowid = 0;
20246 i64 iRowid = 0;
20247 int ii = 0;
20248
20249 if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
20250 sqlite3_bind_int64(pPageData, 1, iPage);
20251 while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
20252 int iCell = sqlite3_column_int64(pPageData, 0);
20253 int iField = sqlite3_column_int64(pPageData, 1);
20254
20255 if( iPrevCell!=iCell && nVal>=0 ){
20256 /* Insert the new row */
20257 sqlite3_bind_int64(pInsert, 1, iRoot); /* rootpgno */
20258 sqlite3_bind_int64(pInsert, 2, iPage); /* pgno */
20259 sqlite3_bind_int(pInsert, 3, nVal); /* nfield */
20260 if( bHaveRowid ){
20261 sqlite3_bind_int64(pInsert, 4, iRowid); /* id */
20262 }
20263 for(ii=0; ii<nVal; ii++){
20264 recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
20265 }
20266 if( sqlite3_step(pInsert)==SQLITE_ROW ){
20267 recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
20268 }
20269 recoverReset(p, pInsert);
20270
20271 /* Discard the accumulated row data */
20272 for(ii=0; ii<nVal; ii++){
20273 sqlite3_value_free(apVal[ii]);
20274 apVal[ii] = 0;
20275 }
20276 sqlite3_clear_bindings(pInsert);
20277 bHaveRowid = 0;
20278 nVal = -1;
20279 }
20280
20281 if( iCell<0 ) break;
20282
20283 if( iField<0 ){
20284 assert( nVal==-1 );
20285 iRowid = sqlite3_column_int64(pPageData, 2);
20286 bHaveRowid = 1;
20287 nVal = 0;
20288 }else if( iField<pLaf->nMaxField ){
20289 sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
20290 apVal[iField] = sqlite3_value_dup(pVal);
20291 assert( iField==nVal || (nVal==-1 && iField==0) );
20292 nVal = iField+1;
20293 if( apVal[iField]==0 ){
20294 recoverError(p, SQLITE_NOMEM, 0);
20295 }
20296 }
20297
20298 iPrevCell = iCell;
20299 }
20300 recoverReset(p, pPageData);
20301
20302 for(ii=0; ii<nVal; ii++){
20303 sqlite3_value_free(apVal[ii]);
20304 apVal[ii] = 0;
20305 }
20306}
20307
20308/*
20309** Perform one step (sqlite3_recover_step()) of work for the connection
20310** passed as the only argument, which is guaranteed to be in
20311** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found
20312** table of the output database is populated with recovered data that can
20313** not be assigned to any recovered schema object.
20314*/
20315static int recoverLostAndFound3Step(sqlite3_recover *p){
20316 RecoverStateLAF *pLaf = &p->laf;
20317 if( p->errCode==SQLITE_OK ){
20318 if( pLaf->pInsert==0 ){
20319 return SQLITE_DONE;
20320 }else{
20321 if( p->errCode==SQLITE_OK ){
20322 int res = sqlite3_step(pLaf->pAllPage);
20323 if( res==SQLITE_ROW ){
20324 i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
20325 if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
20326 recoverLostAndFoundOnePage(p, iPage);
20327 }
20328 }else{
20329 recoverReset(p, pLaf->pAllPage);
20330 return SQLITE_DONE;
20331 }
20332 }
20333 }
20334 }
20335 return SQLITE_OK;
20336}
20337
20338/*
20339** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3
20340** state - during which the lost-and-found table of the output database
20341** is populated with recovered data that can not be assigned to any
20342** recovered schema object.
20343*/
20344static void recoverLostAndFound3Init(sqlite3_recover *p){
20345 RecoverStateLAF *pLaf = &p->laf;
20346
20347 if( pLaf->nMaxField>0 ){
20348 char *zTab = 0; /* Name of lost_and_found table */
20349
20350 zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
20351 pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
20352 sqlite3_free(zTab);
20353
20354 pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
20355 "WITH RECURSIVE seq(ii) AS ("
20356 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
20357 ")"
20358 "SELECT ii FROM seq" , p->laf.nPg
20359 );
20360 pLaf->pPageData = recoverPrepare(p, p->dbOut,
20361 "SELECT cell, field, value "
20362 "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
20363 "UNION ALL "
20364 "SELECT -1, -1, -1"
20365 );
20366
20367 pLaf->apVal = (sqlite3_value**)recoverMalloc(p,
20368 pLaf->nMaxField*sizeof(sqlite3_value*)
20369 );
20370 }
20371}
20372
20373/*
20374** Initialize resources required in RECOVER_STATE_WRITING state - during which
20375** tables recovered from the schema of the input database are populated with
20376** recovered data.
20377*/
20378static int recoverWriteDataInit(sqlite3_recover *p){
20379 RecoverStateW1 *p1 = &p->w1;
20380 RecoverTable *pTbl = 0;
20381 int nByte = 0;
20382
20383 /* Figure out the maximum number of columns for any table in the schema */
20384 assert( p1->nMax==0 );
20385 for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
20386 if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
20387 }
20388
20389 /* Allocate an array of (sqlite3_value*) in which to accumulate the values
20390 ** that will be written to the output database in a single row. */
20391 nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
20392 p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
20393 if( p1->apVal==0 ) return p->errCode;
20394
20395 /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
20396 ** to loop through cells that appear to belong to a single table (pSel). */
20397 p1->pTbls = recoverPrepare(p, p->dbOut,
20398 "SELECT rootpage FROM recovery.schema "
20399 " WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
20400 " ORDER BY (tbl_name='sqlite_sequence') ASC"
20401 );
20402 p1->pSel = recoverPrepare(p, p->dbOut,
20403 "WITH RECURSIVE pages(page) AS ("
20404 " SELECT ?1"
20405 " UNION"
20406 " SELECT child FROM sqlite_dbptr('getpage()'), pages "
20407 " WHERE pgno=page"
20408 ") "
20409 "SELECT page, cell, field, value "
20410 "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
20411 "UNION ALL "
20412 "SELECT 0, 0, 0, 0"
20413 );
20414
20415 return p->errCode;
20416}
20417
20418/*
20419** Clean up resources allocated by recoverWriteDataInit() (stuff in
20420** sqlite3_recover.w1).
20421*/
20422static void recoverWriteDataCleanup(sqlite3_recover *p){
20423 RecoverStateW1 *p1 = &p->w1;
20424 int ii;
20425 for(ii=0; ii<p1->nVal; ii++){
20426 sqlite3_value_free(p1->apVal[ii]);
20427 }
20428 sqlite3_free(p1->apVal);
20429 recoverFinalize(p, p1->pInsert);
20430 recoverFinalize(p, p1->pTbls);
20431 recoverFinalize(p, p1->pSel);
20432 memset(p1, 0, sizeof(*p1));
20433}
20434
20435/*
20436** Perform one step (sqlite3_recover_step()) of work for the connection
20437** passed as the only argument, which is guaranteed to be in
20438** RECOVER_STATE_WRITING state - during which tables recovered from the
20439** schema of the input database are populated with recovered data.
20440*/
20441static int recoverWriteDataStep(sqlite3_recover *p){
20442 RecoverStateW1 *p1 = &p->w1;
20443 sqlite3_stmt *pSel = p1->pSel;
20444 sqlite3_value **apVal = p1->apVal;
20445
20446 if( p->errCode==SQLITE_OK && p1->pTab==0 ){
20447 if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
20448 i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
20449 p1->pTab = recoverFindTable(p, iRoot);
20450
20451 recoverFinalize(p, p1->pInsert);
20452 p1->pInsert = 0;
20453
20454 /* If this table is unknown, return early. The caller will invoke this
20455 ** function again and it will move on to the next table. */
20456 if( p1->pTab==0 ) return p->errCode;
20457
20458 /* If this is the sqlite_sequence table, delete any rows added by
20459 ** earlier INSERT statements on tables with AUTOINCREMENT primary
20460 ** keys before recovering its contents. The p1->pTbls SELECT statement
20461 ** is rigged to deliver "sqlite_sequence" last of all, so we don't
20462 ** worry about it being modified after it is recovered. */
20463 if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
20464 recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
20465 recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
20466 }
20467
20468 /* Bind the root page of this table within the original database to
20469 ** SELECT statement p1->pSel. The SELECT statement will then iterate
20470 ** through cells that look like they belong to table pTab. */
20471 sqlite3_bind_int64(pSel, 1, iRoot);
20472
20473 p1->nVal = 0;
20474 p1->bHaveRowid = 0;
20475 p1->iPrevPage = -1;
20476 p1->iPrevCell = -1;
20477 }else{
20478 return SQLITE_DONE;
20479 }
20480 }
20481 assert( p->errCode!=SQLITE_OK || p1->pTab );
20482
20483 if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
20484 RecoverTable *pTab = p1->pTab;
20485
20486 i64 iPage = sqlite3_column_int64(pSel, 0);
20487 int iCell = sqlite3_column_int(pSel, 1);
20488 int iField = sqlite3_column_int(pSel, 2);
20489 sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
20490 int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
20491
20492 assert( bNewCell==0 || (iField==-1 || iField==0) );
20493 assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
20494
20495 if( bNewCell ){
20496 int ii = 0;
20497 if( p1->nVal>=0 ){
20498 if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
20499 recoverFinalize(p, p1->pInsert);
20500 p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
20501 p1->nInsert = p1->nVal;
20502 }
20503 if( p1->nVal>0 ){
20504 sqlite3_stmt *pInsert = p1->pInsert;
20505 for(ii=0; ii<pTab->nCol; ii++){
20506 RecoverColumn *pCol = &pTab->aCol[ii];
20507 int iBind = pCol->iBind;
20508 if( iBind>0 ){
20509 if( pCol->bIPK ){
20510 sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
20511 }else if( pCol->iField<p1->nVal ){
20512 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
20513 }
20514 }
20515 }
20516 if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
20517 sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
20518 }
20519 if( SQLITE_ROW==sqlite3_step(pInsert) ){
20520 const char *z = (const char*)sqlite3_column_text(pInsert, 0);
20521 recoverSqlCallback(p, z);
20522 }
20523 recoverReset(p, pInsert);
20524 assert( p->errCode || pInsert );
20525 if( pInsert ) sqlite3_clear_bindings(pInsert);
20526 }
20527 }
20528
20529 for(ii=0; ii<p1->nVal; ii++){
20530 sqlite3_value_free(apVal[ii]);
20531 apVal[ii] = 0;
20532 }
20533 p1->nVal = -1;
20534 p1->bHaveRowid = 0;
20535 }
20536
20537 if( iPage!=0 ){
20538 if( iField<0 ){
20539 p1->iRowid = sqlite3_column_int64(pSel, 3);
20540 assert( p1->nVal==-1 );
20541 p1->nVal = 0;
20542 p1->bHaveRowid = 1;
20543 }else if( iField<pTab->nCol ){
20544 assert( apVal[iField]==0 );
20545 apVal[iField] = sqlite3_value_dup( pVal );
20546 if( apVal[iField]==0 ){
20547 recoverError(p, SQLITE_NOMEM, 0);
20548 }
20549 p1->nVal = iField+1;
20550 }else if( pTab->nCol==0 ){
20551 p1->nVal = pTab->nCol;
20552 }
20553 p1->iPrevCell = iCell;
20554 p1->iPrevPage = iPage;
20555 }
20556 }else{
20557 recoverReset(p, pSel);
20558 p1->pTab = 0;
20559 }
20560
20561 return p->errCode;
20562}
20563
20564/*
20565** Initialize resources required by sqlite3_recover_step() in
20566** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
20567** already allocated to a recovered schema element is determined.
20568*/
20569static void recoverLostAndFound1Init(sqlite3_recover *p){
20570 RecoverStateLAF *pLaf = &p->laf;
20571 sqlite3_stmt *pStmt = 0;
20572
20573 assert( p->laf.pUsed==0 );
20574 pLaf->nPg = recoverPageCount(p);
20575 pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
20576
20577 /* Prepare a statement to iterate through all pages that are part of any tree
20578 ** in the recoverable part of the input database schema to the bitmap. And,
20579 ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
20580 ** freelist. */
20581 pStmt = recoverPrepare(
20582 p, p->dbOut,
20583 "WITH trunk(pgno) AS ("
20584 " SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
20585 " UNION"
20586 " SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
20587 "),"
20588 "trunkdata(pgno, data) AS ("
20589 " SELECT pgno, getpage(pgno) FROM trunk"
20590 "),"
20591 "freelist(data, n, freepgno) AS ("
20592 " SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
20593 " UNION ALL"
20594 " SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
20595 "),"
20596 ""
20597 "roots(r) AS ("
20598 " SELECT 1 UNION ALL"
20599 " SELECT rootpage FROM recovery.schema WHERE rootpage>0"
20600 "),"
20601 "used(page) AS ("
20602 " SELECT r FROM roots"
20603 " UNION"
20604 " SELECT child FROM sqlite_dbptr('getpage()'), used "
20605 " WHERE pgno=page"
20606 ") "
20607 "SELECT page FROM used"
20608 " UNION ALL "
20609 "SELECT freepgno FROM freelist WHERE NOT ?"
20610 );
20611 if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
20612 pLaf->pUsedPages = pStmt;
20613}
20614
20615/*
20616** Perform one step (sqlite3_recover_step()) of work for the connection
20617** passed as the only argument, which is guaranteed to be in
20618** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
20619** already allocated to a recovered schema element is determined.
20620*/
20621static int recoverLostAndFound1Step(sqlite3_recover *p){
20622 RecoverStateLAF *pLaf = &p->laf;
20623 int rc = p->errCode;
20624 if( rc==SQLITE_OK ){
20625 rc = sqlite3_step(pLaf->pUsedPages);
20626 if( rc==SQLITE_ROW ){
20627 i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
20628 recoverBitmapSet(pLaf->pUsed, iPg);
20629 rc = SQLITE_OK;
20630 }else{
20631 recoverFinalize(p, pLaf->pUsedPages);
20632 pLaf->pUsedPages = 0;
20633 }
20634 }
20635 return rc;
20636}
20637
20638/*
20639** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2
20640** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
20641** are sorted into sets that likely belonged to the same database tree.
20642*/
20643static void recoverLostAndFound2Init(sqlite3_recover *p){
20644 RecoverStateLAF *pLaf = &p->laf;
20645
20646 assert( p->laf.pAllAndParent==0 );
20647 assert( p->laf.pMapInsert==0 );
20648 assert( p->laf.pMaxField==0 );
20649 assert( p->laf.nMaxField==0 );
20650
20651 pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
20652 "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
20653 );
20654 pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
20655 "WITH RECURSIVE seq(ii) AS ("
20656 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
20657 ")"
20658 "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
20659 " UNION ALL "
20660 "SELECT NULL, ii FROM seq", p->laf.nPg
20661 );
20662 pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
20663 "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
20664 );
20665}
20666
20667/*
20668** Perform one step (sqlite3_recover_step()) of work for the connection
20669** passed as the only argument, which is guaranteed to be in
20670** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified
20671** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged
20672** to the same database tree.
20673*/
20674static int recoverLostAndFound2Step(sqlite3_recover *p){
20675 RecoverStateLAF *pLaf = &p->laf;
20676 if( p->errCode==SQLITE_OK ){
20677 int res = sqlite3_step(pLaf->pAllAndParent);
20678 if( res==SQLITE_ROW ){
20679 i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
20680 if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
20681 sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
20682 sqlite3_bind_value(pLaf->pMapInsert, 2,
20683 sqlite3_column_value(pLaf->pAllAndParent, 0)
20684 );
20685 sqlite3_step(pLaf->pMapInsert);
20686 recoverReset(p, pLaf->pMapInsert);
20687 sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
20688 if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
20689 int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
20690 if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
20691 }
20692 recoverReset(p, pLaf->pMaxField);
20693 }
20694 }else{
20695 recoverFinalize(p, pLaf->pAllAndParent);
20696 pLaf->pAllAndParent =0;
20697 return SQLITE_DONE;
20698 }
20699 }
20700 return p->errCode;
20701}
20702
20703/*
20704** Free all resources allocated as part of sqlite3_recover_step() calls
20705** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
20706*/
20707static void recoverLostAndFoundCleanup(sqlite3_recover *p){
20708 recoverBitmapFree(p->laf.pUsed);
20709 p->laf.pUsed = 0;
20710 sqlite3_finalize(p->laf.pUsedPages);
20711 sqlite3_finalize(p->laf.pAllAndParent);
20712 sqlite3_finalize(p->laf.pMapInsert);
20713 sqlite3_finalize(p->laf.pMaxField);
20714 sqlite3_finalize(p->laf.pFindRoot);
20715 sqlite3_finalize(p->laf.pInsert);
20716 sqlite3_finalize(p->laf.pAllPage);
20717 sqlite3_finalize(p->laf.pPageData);
20718 p->laf.pUsedPages = 0;
20719 p->laf.pAllAndParent = 0;
20720 p->laf.pMapInsert = 0;
20721 p->laf.pMaxField = 0;
20722 p->laf.pFindRoot = 0;
20723 p->laf.pInsert = 0;
20724 p->laf.pAllPage = 0;
20725 p->laf.pPageData = 0;
20726 sqlite3_free(p->laf.apVal);
20727 p->laf.apVal = 0;
20728}
20729
20730/*
20731** Free all resources allocated as part of sqlite3_recover_step() calls.
20732*/
20733static void recoverFinalCleanup(sqlite3_recover *p){
20734 RecoverTable *pTab = 0;
20735 RecoverTable *pNext = 0;
20736
20737 recoverWriteDataCleanup(p);
20738 recoverLostAndFoundCleanup(p);
20739
20740 for(pTab=p->pTblList; pTab; pTab=pNext){
20741 pNext = pTab->pNext;
20742 sqlite3_free(pTab);
20743 }
20744 p->pTblList = 0;
20745 sqlite3_finalize(p->pGetPage);
20746 p->pGetPage = 0;
20747 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
20748
20749 {
20750#ifndef NDEBUG
20751 int res =
20752#endif
20753 sqlite3_close(p->dbOut);
20754 assert( res==SQLITE_OK );
20755 }
20756 p->dbOut = 0;
20757}
20758
20759/*
20760** Decode and return an unsigned 16-bit big-endian integer value from
20761** buffer a[].
20762*/
20763static u32 recoverGetU16(const u8 *a){
20764 return (((u32)a[0])<<8) + ((u32)a[1]);
20765}
20766
20767/*
20768** Decode and return an unsigned 32-bit big-endian integer value from
20769** buffer a[].
20770*/
20771static u32 recoverGetU32(const u8 *a){
20772 return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
20773}
20774
20775/*
20776** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
20777** and return the number of bytes consumed.
20778*/
20779static int recoverGetVarint(const u8 *a, i64 *pVal){
20780 sqlite3_uint64 u = 0;
20781 int i;
20782 for(i=0; i<8; i++){
20783 u = (u<<7) + (a[i]&0x7f);
20784 if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
20785 }
20786 u = (u<<8) + (a[i]&0xff);
20787 *pVal = (sqlite3_int64)u;
20788 return 9;
20789}
20790
20791/*
20792** The second argument points to a buffer n bytes in size. If this buffer
20793** or a prefix thereof appears to contain a well-formed SQLite b-tree page,
20794** return the page-size in bytes. Otherwise, if the buffer does not
20795** appear to contain a well-formed b-tree page, return 0.
20796*/
20797static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
20798 u8 *aUsed = aTmp;
20799 int nFrag = 0;
20800 int nActual = 0;
20801 int iFree = 0;
20802 int nCell = 0; /* Number of cells on page */
20803 int iCellOff = 0; /* Offset of cell array in page */
20804 int iContent = 0;
20805 int eType = 0;
20806 int ii = 0;
20807
20808 eType = (int)a[0];
20809 if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
20810
20811 iFree = (int)recoverGetU16(&a[1]);
20812 nCell = (int)recoverGetU16(&a[3]);
20813 iContent = (int)recoverGetU16(&a[5]);
20814 if( iContent==0 ) iContent = 65536;
20815 nFrag = (int)a[7];
20816
20817 if( iContent>n ) return 0;
20818
20819 memset(aUsed, 0, n);
20820 memset(aUsed, 0xFF, iContent);
20821
20822 /* Follow the free-list. This is the same format for all b-tree pages. */
20823 if( iFree && iFree<=iContent ) return 0;
20824 while( iFree ){
20825 int iNext = 0;
20826 int nByte = 0;
20827 if( iFree>(n-4) ) return 0;
20828 iNext = recoverGetU16(&a[iFree]);
20829 nByte = recoverGetU16(&a[iFree+2]);
20830 if( iFree+nByte>n || nByte<4 ) return 0;
20831 if( iNext && iNext<iFree+nByte ) return 0;
20832 memset(&aUsed[iFree], 0xFF, nByte);
20833 iFree = iNext;
20834 }
20835
20836 /* Run through the cells */
20837 if( eType==0x02 || eType==0x05 ){
20838 iCellOff = 12;
20839 }else{
20840 iCellOff = 8;
20841 }
20842 if( (iCellOff + 2*nCell)>iContent ) return 0;
20843 for(ii=0; ii<nCell; ii++){
20844 int iByte;
20845 i64 nPayload = 0;
20846 int nByte = 0;
20847 int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
20848 if( iOff<iContent || iOff>n ){
20849 return 0;
20850 }
20851 if( eType==0x05 || eType==0x02 ) nByte += 4;
20852 nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
20853 if( eType==0x0D ){
20854 i64 dummy = 0;
20855 nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
20856 }
20857 if( eType!=0x05 ){
20858 int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
20859 int M = ((n-12)*32/255)-23;
20860 int K = M+((nPayload-M)%(n-4));
20861
20862 if( nPayload<X ){
20863 nByte += nPayload;
20864 }else if( K<=X ){
20865 nByte += K+4;
20866 }else{
20867 nByte += M+4;
20868 }
20869 }
20870
20871 if( iOff+nByte>n ){
20872 return 0;
20873 }
20874 for(iByte=iOff; iByte<(iOff+nByte); iByte++){
20875 if( aUsed[iByte]!=0 ){
20876 return 0;
20877 }
20878 aUsed[iByte] = 0xFF;
20879 }
20880 }
20881
20882 nActual = 0;
20883 for(ii=0; ii<n; ii++){
20884 if( aUsed[ii]==0 ) nActual++;
20885 }
20886 return (nActual==nFrag);
20887}
20888
20889
20890static int recoverVfsClose(sqlite3_file*);
20891static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
20892static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
20893static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
20894static int recoverVfsSync(sqlite3_file*, int flags);
20895static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
20896static int recoverVfsLock(sqlite3_file*, int);
20897static int recoverVfsUnlock(sqlite3_file*, int);
20898static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
20899static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
20900static int recoverVfsSectorSize(sqlite3_file*);
20901static int recoverVfsDeviceCharacteristics(sqlite3_file*);
20902static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
20903static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
20904static void recoverVfsShmBarrier(sqlite3_file*);
20905static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
20906static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
20907static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
20908
20909static sqlite3_io_methods recover_methods = {
20910 2, /* iVersion */
20911 recoverVfsClose,
20912 recoverVfsRead,
20913 recoverVfsWrite,
20914 recoverVfsTruncate,
20915 recoverVfsSync,
20916 recoverVfsFileSize,
20917 recoverVfsLock,
20918 recoverVfsUnlock,
20919 recoverVfsCheckReservedLock,
20920 recoverVfsFileControl,
20921 recoverVfsSectorSize,
20922 recoverVfsDeviceCharacteristics,
20923 recoverVfsShmMap,
20924 recoverVfsShmLock,
20925 recoverVfsShmBarrier,
20926 recoverVfsShmUnmap,
20927 recoverVfsFetch,
20928 recoverVfsUnfetch
20929};
20930
20931static int recoverVfsClose(sqlite3_file *pFd){
20932 assert( pFd->pMethods!=&recover_methods );
20933 return pFd->pMethods->xClose(pFd);
20934}
20935
20936/*
20937** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
20938*/
20939static void recoverPutU16(u8 *a, u32 v){
20940 a[0] = (v>>8) & 0x00FF;
20941 a[1] = (v>>0) & 0x00FF;
20942}
20943
20944/*
20945** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
20946*/
20947static void recoverPutU32(u8 *a, u32 v){
20948 a[0] = (v>>24) & 0x00FF;
20949 a[1] = (v>>16) & 0x00FF;
20950 a[2] = (v>>8) & 0x00FF;
20951 a[3] = (v>>0) & 0x00FF;
20952}
20953
20954/*
20955** Detect the page-size of the database opened by file-handle pFd by
20956** searching the first part of the file for a well-formed SQLite b-tree
20957** page. If parameter nReserve is non-zero, then as well as searching for
20958** a b-tree page with zero reserved bytes, this function searches for one
20959** with nReserve reserved bytes at the end of it.
20960**
20961** If successful, set variable p->detected_pgsz to the detected page-size
20962** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
20963** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
20964** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
20965** is returned. The final value of p->detected_pgsz is undefined in this
20966** case.
20967*/
20968static int recoverVfsDetectPagesize(
20969 sqlite3_recover *p, /* Recover handle */
20970 sqlite3_file *pFd, /* File-handle open on input database */
20971 u32 nReserve, /* Possible nReserve value */
20972 i64 nSz /* Size of database file in bytes */
20973){
20974 int rc = SQLITE_OK;
20975 const int nMin = 512;
20976 const int nMax = 65536;
20977 const int nMaxBlk = 4;
20978 u32 pgsz = 0;
20979 int iBlk = 0;
20980 u8 *aPg = 0;
20981 u8 *aTmp = 0;
20982 int nBlk = 0;
20983
20984 aPg = (u8*)sqlite3_malloc(2*nMax);
20985 if( aPg==0 ) return SQLITE_NOMEM;
20986 aTmp = &aPg[nMax];
20987
20988 nBlk = (nSz+nMax-1)/nMax;
20989 if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
20990
20991 do {
20992 for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
20993 int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
20994 memset(aPg, 0, nMax);
20995 rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
20996 if( rc==SQLITE_OK ){
20997 int pgsz2;
20998 for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
20999 int iOff;
21000 for(iOff=0; iOff<nMax; iOff+=pgsz2){
21001 if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
21002 pgsz = pgsz2;
21003 break;
21004 }
21005 }
21006 }
21007 }
21008 }
21009 if( pgsz>(u32)p->detected_pgsz ){
21010 p->detected_pgsz = pgsz;
21011 p->nReserve = nReserve;
21012 }
21013 if( nReserve==0 ) break;
21014 nReserve = 0;
21015 }while( 1 );
21016
21017 p->detected_pgsz = pgsz;
21018 sqlite3_free(aPg);
21019 return rc;
21020}
21021
21022/*
21023** The xRead() method of the wrapper VFS. This is used to intercept calls
21024** to read page 1 of the input database.
21025*/
21026static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
21027 int rc = SQLITE_OK;
21028 if( pFd->pMethods==&recover_methods ){
21029 pFd->pMethods = recover_g.pMethods;
21030 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
21031 if( nByte==16 ){
21032 sqlite3_randomness(16, aBuf);
21033 }else
21034 if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
21035 /* Ensure that the database has a valid header file. The only fields
21036 ** that really matter to recovery are:
21037 **
21038 ** + Database page size (16-bits at offset 16)
21039 ** + Size of db in pages (32-bits at offset 28)
21040 ** + Database encoding (32-bits at offset 56)
21041 **
21042 ** Also preserved are:
21043 **
21044 ** + first freelist page (32-bits at offset 32)
21045 ** + size of freelist (32-bits at offset 36)
21046 ** + the wal-mode flags (16-bits at offset 18)
21047 **
21048 ** We also try to preserve the auto-vacuum, incr-value, user-version
21049 ** and application-id fields - all 32 bit quantities at offsets
21050 ** 52, 60, 64 and 68. All other fields are set to known good values.
21051 **
21052 ** Byte offset 105 should also contain the page-size as a 16-bit
21053 ** integer.
21054 */
21055 const int aPreserve[] = {32, 36, 52, 60, 64, 68};
21056 u8 aHdr[108] = {
21057 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66,
21058 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
21059 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
21060 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
21061 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
21062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
21063 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
21064 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
21065 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
21066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21069 0x00, 0x2e, 0x5b, 0x30,
21070
21071 0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
21072 };
21073 u8 *a = (u8*)aBuf;
21074
21075 u32 pgsz = recoverGetU16(&a[16]);
21076 u32 nReserve = a[20];
21077 u32 enc = recoverGetU32(&a[56]);
21078 u32 dbsz = 0;
21079 i64 dbFileSize = 0;
21080 int ii;
21081 sqlite3_recover *p = recover_g.p;
21082
21083 if( pgsz==0x01 ) pgsz = 65536;
21084 rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
21085
21086 if( rc==SQLITE_OK && p->detected_pgsz==0 ){
21087 rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
21088 }
21089 if( p->detected_pgsz ){
21090 pgsz = p->detected_pgsz;
21091 nReserve = p->nReserve;
21092 }
21093
21094 if( pgsz ){
21095 dbsz = dbFileSize / pgsz;
21096 }
21097 if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
21098 enc = SQLITE_UTF8;
21099 }
21100
21101 sqlite3_free(p->pPage1Cache);
21102 p->pPage1Cache = 0;
21103 p->pPage1Disk = 0;
21104
21105 p->pgsz = nByte;
21106 p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
21107 if( p->pPage1Cache ){
21108 p->pPage1Disk = &p->pPage1Cache[nByte];
21109 memcpy(p->pPage1Disk, aBuf, nByte);
21110 aHdr[18] = a[18];
21111 aHdr[19] = a[19];
21112 recoverPutU32(&aHdr[28], dbsz);
21113 recoverPutU32(&aHdr[56], enc);
21114 recoverPutU16(&aHdr[105], pgsz-nReserve);
21115 if( pgsz==65536 ) pgsz = 1;
21116 recoverPutU16(&aHdr[16], pgsz);
21117 aHdr[20] = nReserve;
21118 for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
21119 memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
21120 }
21121 memcpy(aBuf, aHdr, sizeof(aHdr));
21122 memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
21123
21124 memcpy(p->pPage1Cache, aBuf, nByte);
21125 }else{
21126 rc = p->errCode;
21127 }
21128
21129 }
21130 pFd->pMethods = &recover_methods;
21131 }else{
21132 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
21133 }
21134 return rc;
21135}
21136
21137/*
21138** Used to make sqlite3_io_methods wrapper methods less verbose.
21139*/
21140#define RECOVER_VFS_WRAPPER(code)
21141 int rc = SQLITE_OK;
21142 if( pFd->pMethods==&recover_methods ){
21143 pFd->pMethods = recover_g.pMethods;
21144 rc = code;
21145 pFd->pMethods = &recover_methods;
21146 }else{
21147 rc = code;
21148 }
21149 return rc;
21150
21151/*
21152** Methods of the wrapper VFS. All methods except for xRead() and xClose()
21153** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
21154** method on the lower level VFS, then reinstall the wrapper before returning.
21155** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
21156*/
21157static int recoverVfsWrite(
21158 sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
21159){
21160 RECOVER_VFS_WRAPPER (
21161 pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
21162 );
21163}
21164static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
21165 RECOVER_VFS_WRAPPER (
21166 pFd->pMethods->xTruncate(pFd, size)
21167 );
21168}
21169static int recoverVfsSync(sqlite3_file *pFd, int flags){
21170 RECOVER_VFS_WRAPPER (
21171 pFd->pMethods->xSync(pFd, flags)
21172 );
21173}
21174static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
21175 RECOVER_VFS_WRAPPER (
21176 pFd->pMethods->xFileSize(pFd, pSize)
21177 );
21178}
21179static int recoverVfsLock(sqlite3_file *pFd, int eLock){
21180 RECOVER_VFS_WRAPPER (
21181 pFd->pMethods->xLock(pFd, eLock)
21182 );
21183}
21184static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
21185 RECOVER_VFS_WRAPPER (
21186 pFd->pMethods->xUnlock(pFd, eLock)
21187 );
21188}
21189static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
21190 RECOVER_VFS_WRAPPER (
21191 pFd->pMethods->xCheckReservedLock(pFd, pResOut)
21192 );
21193}
21194static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
21195 RECOVER_VFS_WRAPPER (
21196 (pFd->pMethods ? pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
21197 );
21198}
21199static int recoverVfsSectorSize(sqlite3_file *pFd){
21200 RECOVER_VFS_WRAPPER (
21201 pFd->pMethods->xSectorSize(pFd)
21202 );
21203}
21204static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
21205 RECOVER_VFS_WRAPPER (
21206 pFd->pMethods->xDeviceCharacteristics(pFd)
21207 );
21208}
21209static int recoverVfsShmMap(
21210 sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
21211){
21212 RECOVER_VFS_WRAPPER (
21213 pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
21214 );
21215}
21216static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
21217 RECOVER_VFS_WRAPPER (
21218 pFd->pMethods->xShmLock(pFd, offset, n, flags)
21219 );
21220}
21221static void recoverVfsShmBarrier(sqlite3_file *pFd){
21222 if( pFd->pMethods==&recover_methods ){
21223 pFd->pMethods = recover_g.pMethods;
21224 pFd->pMethods->xShmBarrier(pFd);
21225 pFd->pMethods = &recover_methods;
21226 }else{
21227 pFd->pMethods->xShmBarrier(pFd);
21228 }
21229}
21230static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
21231 RECOVER_VFS_WRAPPER (
21232 pFd->pMethods->xShmUnmap(pFd, deleteFlag)
21233 );
21234}
21235
21236static int recoverVfsFetch(
21237 sqlite3_file *pFd,
21238 sqlite3_int64 iOff,
21239 int iAmt,
21240 void **pp
21241){
21242 (void)pFd;
21243 (void)iOff;
21244 (void)iAmt;
21245 *pp = 0;
21246 return SQLITE_OK;
21247}
21248static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
21249 (void)pFd;
21250 (void)iOff;
21251 (void)p;
21252 return SQLITE_OK;
21253}
21254
21255/*
21256** Install the VFS wrapper around the file-descriptor open on the input
21257** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
21258** when this function is called.
21259*/
21260static void recoverInstallWrapper(sqlite3_recover *p){
21261 sqlite3_file *pFd = 0;
21262 assert( recover_g.pMethods==0 );
21263 recoverAssertMutexHeld();
21264 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
21265 assert( pFd==0 || pFd->pMethods!=&recover_methods );
21266 if( pFd && pFd->pMethods ){
21267 int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
21268 recover_g.pMethods = pFd->pMethods;
21269 recover_g.p = p;
21270 recover_methods.iVersion = iVersion;
21271 pFd->pMethods = &recover_methods;
21272 }
21273}
21274
21275/*
21276** Uninstall the VFS wrapper that was installed around the file-descriptor open
21277** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
21278** held when this function is called.
21279*/
21280static void recoverUninstallWrapper(sqlite3_recover *p){
21281 sqlite3_file *pFd = 0;
21282 recoverAssertMutexHeld();
21283 sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
21284 if( pFd && pFd->pMethods ){
21285 pFd->pMethods = recover_g.pMethods;
21286 recover_g.pMethods = 0;
21287 recover_g.p = 0;
21288 }
21289}
21290
21291/*
21292** This function does the work of a single sqlite3_recover_step() call. It
21293** is guaranteed that the handle is not in an error state when this
21294** function is called.
21295*/
21296static void recoverStep(sqlite3_recover *p){
21297 assert( p && p->errCode==SQLITE_OK );
21298 switch( p->eState ){
21299 case RECOVER_STATE_INIT: {
21300 int bUseWrapper = 1;
21301 /* This is the very first call to sqlite3_recover_step() on this object.
21302 */
21303 recoverSqlCallback(p, "BEGIN");
21304 recoverSqlCallback(p, "PRAGMA writable_schema = on");
21305 recoverSqlCallback(p, "PRAGMA foreign_keys = off");
21306
21307 recoverEnterMutex();
21308
21309 /* Open the output database. And register required virtual tables and
21310 ** user functions with the new handle. */
21311 recoverOpenOutput(p);
21312
21313 /* Attempt to open a transaction and read page 1 of the input database.
21314 ** Two attempts may be made - one with a wrapper installed to ensure
21315 ** that the database header is sane, and then if that attempt returns
21316 ** SQLITE_NOTADB, then again with no wrapper. The second attempt is
21317 ** required for encrypted databases. */
21318 if( p->errCode==SQLITE_OK ){
21319 do{
21320 p->errCode = SQLITE_OK;
21321 if( bUseWrapper ) recoverInstallWrapper(p);
21322
21323 /* Open a transaction on the input database. */
21324 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
21325 recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
21326 recoverExec(p, p->dbIn, "BEGIN");
21327 if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
21328 recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
21329 recoverTransferSettings(p);
21330 recoverOpenRecovery(p);
21331 recoverCacheSchema(p);
21332
21333 if( bUseWrapper ) recoverUninstallWrapper(p);
21334 }while( p->errCode==SQLITE_NOTADB
21335 && (bUseWrapper--)
21336 && SQLITE_OK==sqlite3_exec(p->dbIn, "ROLLBACK", 0, 0, 0)
21337 );
21338 }
21339
21340 recoverLeaveMutex();
21341 recoverExec(p, p->dbOut, "BEGIN");
21342 recoverWriteSchema1(p);
21343 p->eState = RECOVER_STATE_WRITING;
21344 break;
21345 }
21346
21347 case RECOVER_STATE_WRITING: {
21348 if( p->w1.pTbls==0 ){
21349 recoverWriteDataInit(p);
21350 }
21351 if( SQLITE_DONE==recoverWriteDataStep(p) ){
21352 recoverWriteDataCleanup(p);
21353 if( p->zLostAndFound ){
21354 p->eState = RECOVER_STATE_LOSTANDFOUND1;
21355 }else{
21356 p->eState = RECOVER_STATE_SCHEMA2;
21357 }
21358 }
21359 break;
21360 }
21361
21362 case RECOVER_STATE_LOSTANDFOUND1: {
21363 if( p->laf.pUsed==0 ){
21364 recoverLostAndFound1Init(p);
21365 }
21366 if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
21367 p->eState = RECOVER_STATE_LOSTANDFOUND2;
21368 }
21369 break;
21370 }
21371 case RECOVER_STATE_LOSTANDFOUND2: {
21372 if( p->laf.pAllAndParent==0 ){
21373 recoverLostAndFound2Init(p);
21374 }
21375 if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
21376 p->eState = RECOVER_STATE_LOSTANDFOUND3;
21377 }
21378 break;
21379 }
21380
21381 case RECOVER_STATE_LOSTANDFOUND3: {
21382 if( p->laf.pInsert==0 ){
21383 recoverLostAndFound3Init(p);
21384 }
21385 if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
21386 p->eState = RECOVER_STATE_SCHEMA2;
21387 }
21388 break;
21389 }
21390
21391 case RECOVER_STATE_SCHEMA2: {
21392 int rc = SQLITE_OK;
21393
21394 recoverWriteSchema2(p);
21395 p->eState = RECOVER_STATE_DONE;
21396
21397 /* If no error has occurred, commit the write transaction on the output
21398 ** database. Regardless of whether or not an error has occurred, make
21399 ** an attempt to end the read transaction on the input database. */
21400 recoverExec(p, p->dbOut, "COMMIT");
21401 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
21402 if( p->errCode==SQLITE_OK ) p->errCode = rc;
21403
21404 recoverSqlCallback(p, "PRAGMA writable_schema = off");
21405 recoverSqlCallback(p, "COMMIT");
21406 p->eState = RECOVER_STATE_DONE;
21407 recoverFinalCleanup(p);
21408 break;
21409 };
21410
21411 case RECOVER_STATE_DONE: {
21412 /* no-op */
21413 break;
21414 };
21415 }
21416}
21417
21418
21419/*
21420** This is a worker function that does the heavy lifting for both init
21421** functions:
21422**
21423** sqlite3_recover_init()
21424** sqlite3_recover_init_sql()
21425**
21426** All this function does is allocate space for the recover handle and
21427** take copies of the input parameters. All the real work is done within
21428** sqlite3_recover_run().
21429*/
21430sqlite3_recover *recoverInit(
21431 sqlite3* db,
21432 const char *zDb,
21433 const char *zUri, /* Output URI for _recover_init() */
21434 int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
21435 void *pSqlCtx /* Context arg for _recover_init_sql() */
21436){
21437 sqlite3_recover *pRet = 0;
21438 int nDb = 0;
21439 int nUri = 0;
21440 int nByte = 0;
21441
21442 if( zDb==0 ){ zDb = "main"; }
21443
21444 nDb = recoverStrlen(zDb);
21445 nUri = recoverStrlen(zUri);
21446
21447 nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
21448 pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
21449 if( pRet ){
21450 memset(pRet, 0, nByte);
21451 pRet->dbIn = db;
21452 pRet->zDb = (char*)&pRet[1];
21453 pRet->zUri = &pRet->zDb[nDb+1];
21454 memcpy(pRet->zDb, zDb, nDb);
21455 if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
21456 pRet->xSql = xSql;
21457 pRet->pSqlCtx = pSqlCtx;
21458 pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
21459 }
21460
21461 return pRet;
21462}
21463
21464/*
21465** Initialize a recovery handle that creates a new database containing
21466** the recovered data.
21467*/
21468sqlite3_recover *sqlite3_recover_init(
21469 sqlite3* db,
21470 const char *zDb,
21471 const char *zUri
21472){
21473 return recoverInit(db, zDb, zUri, 0, 0);
21474}
21475
21476/*
21477** Initialize a recovery handle that returns recovered data in the
21478** form of SQL statements via a callback.
21479*/
21480sqlite3_recover *sqlite3_recover_init_sql(
21481 sqlite3* db,
21482 const char *zDb,
21483 int (*xSql)(void*, const char*),
21484 void *pSqlCtx
21485){
21486 return recoverInit(db, zDb, 0, xSql, pSqlCtx);
21487}
21488
21489/*
21490** Return the handle error message, if any.
21491*/
21492const char *sqlite3_recover_errmsg(sqlite3_recover *p){
21493 return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
21494}
21495
21496/*
21497** Return the handle error code.
21498*/
21499int sqlite3_recover_errcode(sqlite3_recover *p){
21500 return p ? p->errCode : SQLITE_NOMEM;
21501}
21502
21503/*
21504** Configure the handle.
21505*/
21506int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
21507 int rc = SQLITE_OK;
21508 if( p==0 ){
21509 rc = SQLITE_NOMEM;
21510 }else if( p->eState!=RECOVER_STATE_INIT ){
21511 rc = SQLITE_MISUSE;
21512 }else{
21513 switch( op ){
21514 case 789:
21515 /* This undocumented magic configuration option is used to set the
21516 ** name of the auxiliary database that is ATTACH-ed to the database
21517 ** connection and used to hold state information during the
21518 ** recovery process. This option is for debugging use only and
21519 ** is subject to change or removal at any time. */
21520 sqlite3_free(p->zStateDb);
21521 p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
21522 break;
21523
21524 case SQLITE_RECOVER_LOST_AND_FOUND: {
21525 const char *zArg = (const char*)pArg;
21526 sqlite3_free(p->zLostAndFound);
21527 if( zArg ){
21528 p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
21529 }else{
21530 p->zLostAndFound = 0;
21531 }
21532 break;
21533 }
21534
21535 case SQLITE_RECOVER_FREELIST_CORRUPT:
21536 p->bFreelistCorrupt = *(int*)pArg;
21537 break;
21538
21539 case SQLITE_RECOVER_ROWIDS:
21540 p->bRecoverRowid = *(int*)pArg;
21541 break;
21542
21543 case SQLITE_RECOVER_SLOWINDEXES:
21544 p->bSlowIndexes = *(int*)pArg;
21545 break;
21546
21547 default:
21548 rc = SQLITE_NOTFOUND;
21549 break;
21550 }
21551 }
21552
21553 return rc;
21554}
21555
21556/*
21557** Do a unit of work towards the recovery job. Return SQLITE_OK if
21558** no error has occurred but database recovery is not finished, SQLITE_DONE
21559** if database recovery has been successfully completed, or an SQLite
21560** error code if an error has occurred.
21561*/
21562int sqlite3_recover_step(sqlite3_recover *p){
21563 if( p==0 ) return SQLITE_NOMEM;
21564 if( p->errCode==SQLITE_OK ) recoverStep(p);
21565 if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
21566 return SQLITE_DONE;
21567 }
21568 return p->errCode;
21569}
21570
21571/*
21572** Do the configured recovery operation. Return SQLITE_OK if successful, or
21573** else an SQLite error code.
21574*/
21575int sqlite3_recover_run(sqlite3_recover *p){
21576 while( SQLITE_OK==sqlite3_recover_step(p) );
21577 return sqlite3_recover_errcode(p);
21578}
21579
21580
21581/*
21582** Free all resources associated with the recover handle passed as the only
21583** argument. The results of using a handle with any sqlite3_recover_**
21584** API function after it has been passed to this function are undefined.
21585**
21586** A copy of the value returned by the first call made to sqlite3_recover_run()
21587** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
21588** not been called on this handle.
21589*/
21590int sqlite3_recover_finish(sqlite3_recover *p){
21591 int rc;
21592 if( p==0 ){
21593 rc = SQLITE_NOMEM;
21594 }else{
21595 recoverFinalCleanup(p);
21596 if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
21597 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
21598 if( p->errCode==SQLITE_OK ) p->errCode = rc;
21599 }
21600 rc = p->errCode;
21601 sqlite3_free(p->zErrMsg);
21602 sqlite3_free(p->zStateDb);
21603 sqlite3_free(p->zLostAndFound);
21604 sqlite3_free(p->pPage1Cache);
21605 sqlite3_free(p);
21606 }
21607 return rc;
21608}
21609
21610#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
21611
21612/************************* End ../ext/recover/sqlite3recover.c ********************/
21613# endif /* SQLITE_HAVE_SQLITE3R */
21614#endif
21615#ifdef SQLITE_SHELL_EXTSRC
21616# include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
21617#endif
21618
21619#if defined(SQLITE_ENABLE_SESSION)
21620/*
21621** State information for a single open session
21622*/
21623typedef struct OpenSession OpenSession;
21624struct OpenSession {
21625 char *zName; /* Symbolic name for this session */
21626 int nFilter; /* Number of xFilter rejection GLOB patterns */
21627 char **azFilter; /* Array of xFilter rejection GLOB patterns */
21628 sqlite3_session *p; /* The open session */
21629};
21630#endif
21631
21632typedef struct ExpertInfo ExpertInfo;
21634 sqlite3expert *pExpert;
21636};
21637
21638/* A single line in the EQP output */
21639typedef struct EQPGraphRow EQPGraphRow;
21641 int iEqpId; /* ID for this row */
21642 int iParentId; /* ID of the parent row */
21643 EQPGraphRow *pNext; /* Next row in sequence */
21644 char zText[1]; /* Text to display for this row */
21645};
21646
21647/* All EQP output is collected into an instance of the following */
21648typedef struct EQPGraph EQPGraph;
21649struct EQPGraph {
21650 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
21651 EQPGraphRow *pLast; /* Last element of the pRow list */
21652 char zPrefix[100]; /* Graph prefix */
21653};
21654
21655/* Parameters affecting columnar mode result display (defaulting together) */
21656typedef struct ColModeOpts {
21657 int iWrap; /* In columnar modes, wrap lines reaching this limit */
21658 u8 bQuote; /* Quote results for .mode box and table */
21659 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */
21660} ColModeOpts;
21661#define ColModeOpts_default { 60, 0, 0 }
21662#define ColModeOpts_default_qbox { 60, 1, 0 }
21663
21664/*
21665** State information about the database connection is contained in an
21666** instance of the following structure.
21667*/
21668typedef struct ShellState ShellState;
21670 sqlite3 *db; /* The database */
21671 u8 autoExplain; /* Automatically turn on .explain mode */
21672 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
21673 u8 autoEQPtest; /* autoEQP is in test mode */
21674 u8 autoEQPtrace; /* autoEQP is in trace mode */
21675 u8 scanstatsOn; /* True to display scan stats before each finalize */
21676 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
21677 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
21678 u8 nEqpLevel; /* Depth of the EQP output graph */
21679 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */
21680 u8 bSafeMode; /* True to prohibit unsafe operations */
21681 u8 bSafeModePersist; /* The long-term value of bSafeMode */
21682 u8 eRestoreState; /* See comments above doAutoDetectRestore() */
21683 u8 crlfMode; /* Do NL-to-CRLF translations when enabled (maybe) */
21684 u8 eEscMode; /* Escape mode for text output */
21685 ColModeOpts cmOpts; /* Option values affecting columnar mode output */
21686 unsigned statsOn; /* True to display memory stats before each finalize */
21687 unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */
21688 int inputNesting; /* Track nesting level of .read and other redirects */
21689 int outCount; /* Revert to stdout when reaching zero */
21690 int cnt; /* Number of records displayed so far */
21691 int lineno; /* Line number of last line read from in */
21692 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */
21693 FILE *in; /* Read commands from this stream */
21694 FILE *out; /* Write results here */
21695 FILE *traceOut; /* Output for sqlite3_trace() */
21696 int nErr; /* Number of errors seen */
21697 int mode; /* An output mode setting */
21698 int modePrior; /* Saved mode */
21699 int cMode; /* temporary output mode for the current query */
21700 int normalMode; /* Output mode before ".explain on" */
21701 int writableSchema; /* True if PRAGMA writable_schema=ON */
21702 int showHeader; /* True to show column names in List or Column mode */
21703 int nCheck; /* Number of ".check" commands run */
21704 unsigned nProgress; /* Number of progress callbacks encountered */
21705 unsigned mxProgress; /* Maximum progress callbacks before failing */
21706 unsigned flgProgress; /* Flags for the progress callback */
21707 unsigned shellFlgs; /* Various flags */
21708 unsigned priorShFlgs; /* Saved copy of flags */
21709 sqlite3_int64 szMax; /* --maxsize argument to .open */
21710 char *zDestTable; /* Name of destination table when MODE_Insert */
21711 char *zTempFile; /* Temporary file that might need deleting */
21712 char zTestcase[30]; /* Name of current test case */
21713 char colSeparator[20]; /* Column separator character for several modes */
21714 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
21715 char colSepPrior[20]; /* Saved column separator */
21716 char rowSepPrior[20]; /* Saved row separator */
21717 int *colWidth; /* Requested width of each column in columnar modes */
21718 int *actualWidth; /* Actual width of each column */
21719 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */
21720 char nullValue[20]; /* The text to print when a NULL comes back from
21721 ** the database */
21722 char outfile[FILENAME_MAX]; /* Filename for *out */
21723 sqlite3_stmt *pStmt; /* Current statement if any. */
21724 FILE *pLog; /* Write log output here */
21725 struct AuxDb { /* Storage space for auxiliary database connections */
21726 sqlite3 *db; /* Connection pointer */
21727 const char *zDbFilename; /* Filename used to open the connection */
21728 char *zFreeOnClose; /* Free this memory allocation on close */
21729#if defined(SQLITE_ENABLE_SESSION)
21730 int nSession; /* Number of active sessions */
21731 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
21732#endif
21733 } aAuxDb[5], /* Array of all database connections */
21734 *pAuxDb; /* Currently active database connection */
21735 int *aiIndent; /* Array of indents used in MODE_Explain */
21736 int nIndent; /* Size of array aiIndent[] */
21737 int iIndent; /* Index of current op in aiIndent[] */
21738 char *zNonce; /* Nonce for temporary safe-mode escapes */
21739 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
21740 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
21741#ifdef SQLITE_SHELL_FIDDLE
21742 struct {
21743 const char * zInput; /* Input string from wasm/JS proxy */
21744 const char * zPos; /* Cursor pos into zInput */
21745 const char * zDefaultDbName; /* Default name for db file */
21746 } wasm;
21747#endif
21748};
21749
21750#ifdef SQLITE_SHELL_FIDDLE
21751static ShellState shellState;
21752#endif
21753
21754
21755/* Allowed values for ShellState.autoEQP
21756*/
21757#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
21758#define AUTOEQP_on 1 /* Automatic EQP is on */
21759#define AUTOEQP_trigger 2 /* On and also show plans for triggers */
21760#define AUTOEQP_full 3 /* Show full EXPLAIN */
21761
21762/* Allowed values for ShellState.openMode
21763*/
21764#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
21765#define SHELL_OPEN_NORMAL 1 /* Normal database file */
21766#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
21767#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
21768#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
21769#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */
21770#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */
21771
21772/* Allowed values for ShellState.eTraceType
21773*/
21774#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */
21775#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */
21776#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */
21777
21778/* Bits in the ShellState.flgProgress variable */
21779#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */
21780#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progress
21781 ** callback limit is reached, and for each
21782 ** top-level SQL statement */
21783#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */
21784
21785/* Allowed values for ShellState.eEscMode. The default value should
21786** be 0, so to change the default, reorder the names.
21788#define SHELL_ESC_ASCII 0 /* Substitute ^Y for X where Y=X+0x40 */
21789#define SHELL_ESC_SYMBOL 1 /* Substitute U+2400 graphics */
21790#define SHELL_ESC_OFF 2 /* Send characters verbatim */
21791
21792static const char *shell_EscModeNames[] = { "ascii", "symbol", "off" };
21793
21794/*
21795** These are the allowed shellFlgs values
21797#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
21798#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
21799#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
21800#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
21801#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
21802#define SHFLG_CountChanges 0x00000020 /* .changes setting */
21803#define SHFLG_Echo 0x00000040 /* .echo on/off, or --echo setting */
21804#define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */
21805#define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */
21806#define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */
21807#define SHFLG_TestingMode 0x00000400 /* allow unsafe testing features */
21808
21809/*
21810** Macros for testing and setting shellFlgs
21812#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
21813#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
21814#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
21815
21816/*
21817** These are the allowed modes.
21819#define MODE_Line 0 /* One column per line. Blank line between records */
21820#define MODE_Column 1 /* One record per line in neat columns */
21821#define MODE_List 2 /* One record per line with a separator */
21822#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
21823#define MODE_Html 4 /* Generate an XHTML table */
21824#define MODE_Insert 5 /* Generate SQL "insert" statements */
21825#define MODE_Quote 6 /* Quote values as for SQL */
21826#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
21827#define MODE_Csv 8 /* Quote strings, numbers are plain */
21828#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
21829#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
21830#define MODE_Pretty 11 /* Pretty-print schemas */
21831#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
21832#define MODE_Json 13 /* Output JSON */
21833#define MODE_Markdown 14 /* Markdown formatting */
21834#define MODE_Table 15 /* MySQL-style table formatting */
21835#define MODE_Box 16 /* Unicode box-drawing characters */
21836#define MODE_Count 17 /* Output only a count of the rows of output */
21837#define MODE_Off 18 /* No query output shown */
21838#define MODE_ScanExp 19 /* Like MODE_Explain, but for ".scanstats vm" */
21839#define MODE_Www 20 /* Full web-page output */
21840
21841static const char *modeDescr[] = {
21842 "line",
21843 "column",
21844 "list",
21845 "semi",
21846 "html",
21847 "insert",
21848 "quote",
21849 "tcl",
21850 "csv",
21851 "explain",
21852 "ascii",
21853 "prettyprint",
21854 "eqp",
21855 "json",
21856 "markdown",
21857 "table",
21858 "box",
21859 "count",
21860 "off",
21861 "scanexp",
21862 "www",
21863};
21864
21865/*
21866** These are the column/row/line separators used by the various
21867** import/export modes.
21869#define SEP_Column "|"
21870#define SEP_Row "\n"
21871#define SEP_Tab "\t"
21872#define SEP_Space " "
21873#define SEP_Comma ","
21874#define SEP_CrLf "\r\n"
21875#define SEP_Unit "\x1F"
21876#define SEP_Record "\x1E"
21877
21878/*
21879** Limit input nesting via .read or any other input redirect.
21880** It's not too expensive, so a generous allowance can be made.
21881*/
21882#define MAX_INPUT_NESTING 25
21883
21884/*
21885** A callback for the sqlite3_log() interface.
21886*/
21887static void shellLog(void *pArg, int iErrCode, const char *zMsg){
21888 ShellState *p = (ShellState*)pArg;
21889 if( p->pLog==0 ) return;
21890 sqlite3_fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
21891 fflush(p->pLog);
21892}
21893
21894/*
21895** SQL function: shell_putsnl(X)
21896**
21897** Write the text X to the screen (or whatever output is being directed)
21898** adding a newline at the end, and then return X.
21899*/
21900static void shellPutsFunc(
21901 sqlite3_context *pCtx,
21902 int nVal,
21903 sqlite3_value **apVal
21904){
21905 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
21906 (void)nVal;
21907 sqlite3_fprintf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
21908 sqlite3_result_value(pCtx, apVal[0]);
21909}
21910
21911/*
21912** If in safe mode, print an error message described by the arguments
21913** and exit immediately.
21914*/
21915static void failIfSafeMode(
21916 ShellState *p,
21917 const char *zErrMsg,
21918 ...
21919){
21920 if( p->bSafeMode ){
21921 va_list ap;
21922 char *zMsg;
21923 va_start(ap, zErrMsg);
21924 zMsg = sqlite3_vmprintf(zErrMsg, ap);
21925 va_end(ap);
21926 sqlite3_fprintf(stderr, "line %d: %s\n", p->lineno, zMsg);
21927 exit(1);
21928 }
21929}
21930
21931/*
21932** SQL function: edit(VALUE)
21933** edit(VALUE,EDITOR)
21934**
21935** These steps:
21936**
21937** (1) Write VALUE into a temporary file.
21938** (2) Run program EDITOR on that temporary file.
21939** (3) Read the temporary file back and return its content as the result.
21940** (4) Delete the temporary file
21941**
21942** If the EDITOR argument is omitted, use the value in the VISUAL
21943** environment variable. If still there is no EDITOR, through an error.
21944**
21945** Also throw an error if the EDITOR program returns a non-zero exit code.
21947#ifndef SQLITE_NOHAVE_SYSTEM
21948static void editFunc(
21949 sqlite3_context *context,
21950 int argc,
21951 sqlite3_value **argv
21952){
21953 const char *zEditor;
21954 char *zTempFile = 0;
21955 sqlite3 *db;
21956 char *zCmd = 0;
21957 int bBin;
21958 int rc;
21959 int hasCRLF = 0;
21960 FILE *f = 0;
21961 sqlite3_int64 sz;
21962 sqlite3_int64 x;
21963 unsigned char *p = 0;
21964
21965 if( argc==2 ){
21966 zEditor = (const char*)sqlite3_value_text(argv[1]);
21967 }else{
21968 zEditor = getenv("VISUAL");
21969 }
21970 if( zEditor==0 ){
21971 sqlite3_result_error(context, "no editor for edit()", -1);
21972 return;
21973 }
21974 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
21975 sqlite3_result_error(context, "NULL input to edit()", -1);
21976 return;
21977 }
21978 db = sqlite3_context_db_handle(context);
21979 zTempFile = 0;
21981 if( zTempFile==0 ){
21982 sqlite3_uint64 r = 0;
21983 sqlite3_randomness(sizeof(r), &r);
21984 zTempFile = sqlite3_mprintf("temp%llx", r);
21985 if( zTempFile==0 ){
21987 return;
21988 }
21989 }
21990 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
21991 /* When writing the file to be edited, do \n to \r\n conversions on systems
21992 ** that want \r\n line endings */
21993 f = sqlite3_fopen(zTempFile, bBin ? "wb" : "w");
21994 if( f==0 ){
21995 sqlite3_result_error(context, "edit() cannot open temp file", -1);
21996 goto edit_func_end;
21997 }
21998 sz = sqlite3_value_bytes(argv[0]);
21999 if( bBin ){
22000 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
22001 }else{
22002 const char *z = (const char*)sqlite3_value_text(argv[0]);
22003 /* Remember whether or not the value originally contained \r\n */
22004 if( z && strstr(z,"\r\n")!=0 ) hasCRLF = 1;
22005 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
22006 }
22007 fclose(f);
22008 f = 0;
22009 if( x!=sz ){
22010 sqlite3_result_error(context, "edit() could not write the whole file", -1);
22011 goto edit_func_end;
22012 }
22013 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
22014 if( zCmd==0 ){
22016 goto edit_func_end;
22017 }
22018 rc = system(zCmd);
22019 sqlite3_free(zCmd);
22020 if( rc ){
22021 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
22022 goto edit_func_end;
22023 }
22024 f = sqlite3_fopen(zTempFile, "rb");
22025 if( f==0 ){
22027 "edit() cannot reopen temp file after edit", -1);
22028 goto edit_func_end;
22029 }
22030 fseek(f, 0, SEEK_END);
22031 sz = ftell(f);
22032 rewind(f);
22033 p = sqlite3_malloc64( sz+1 );
22034 if( p==0 ){
22036 goto edit_func_end;
22037 }
22038 x = fread(p, 1, (size_t)sz, f);
22039 fclose(f);
22040 f = 0;
22041 if( x!=sz ){
22042 sqlite3_result_error(context, "could not read back the whole file", -1);
22043 goto edit_func_end;
22044 }
22045 if( bBin ){
22047 }else{
22048 sqlite3_int64 i, j;
22049 if( hasCRLF ){
22050 /* If the original contains \r\n then do no conversions back to \n */
22051 }else{
22052 /* If the file did not originally contain \r\n then convert any new
22053 ** \r\n back into \n */
22054 p[sz] = 0;
22055 for(i=j=0; i<sz; i++){
22056 if( p[i]=='\r' && p[i+1]=='\n' ) i++;
22057 p[j++] = p[i];
22058 }
22059 sz = j;
22060 p[sz] = 0;
22061 }
22062 sqlite3_result_text64(context, (const char*)p, sz,
22064 }
22065 p = 0;
22066
22067edit_func_end:
22068 if( f ) fclose(f);
22069 unlink(zTempFile);
22070 sqlite3_free(zTempFile);
22072}
22073#endif /* SQLITE_NOHAVE_SYSTEM */
22074
22075/*
22076** Save or restore the current output mode
22077*/
22078static void outputModePush(ShellState *p){
22079 p->modePrior = p->mode;
22081 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
22083}
22084static void outputModePop(ShellState *p){
22085 p->mode = p->modePrior;
22087 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
22088 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
22089}
22090
22091/*
22092** Set output mode to text or binary for Windows.
22093*/
22094static void setCrlfMode(ShellState *p){
22095#ifdef _WIN32
22096 if( p->crlfMode ){
22097 sqlite3_fsetmode(p->out, _O_TEXT);
22098 }else{
22099 sqlite3_fsetmode(p->out, _O_BINARY);
22100 }
22101#else
22102 UNUSED_PARAMETER(p);
22103#endif
22104}
22105
22106/*
22107** Output the given string as a hex-encoded blob (eg. X'1234' )
22108*/
22109static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
22110 int i;
22111 unsigned char *aBlob = (unsigned char*)pBlob;
22112
22113 char *zStr = sqlite3_malloc(nBlob*2 + 1);
22115
22116 for(i=0; i<nBlob; i++){
22117 static const char aHex[] = {
22118 '0', '1', '2', '3', '4', '5', '6', '7',
22119 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
22120 };
22121 zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
22122 zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
22123 }
22124 zStr[i*2] = '\0';
22125
22126 sqlite3_fprintf(out, "X'%s'", zStr);
22127 sqlite3_free(zStr);
22128}
22129
22130/*
22131** Output the given string as a quoted string using SQL quoting conventions:
22132**
22133** (1) Single quotes (') within the string are doubled
22134** (2) The whle string is enclosed in '...'
22135** (3) Control characters other than \n, \t, and \r\n are escaped
22136** using \u00XX notation and if such substitutions occur,
22137** the whole string is enclosed in unistr('...') instead of '...'.
22138**
22139** Step (3) is omitted if the control-character escape mode is OFF.
22140**
22141** See also: output_quoted_escaped_string() which does the same except
22142** that it does not make exceptions for \n, \t, and \r\n in step (3).
22143*/
22144static void output_quoted_string(ShellState *p, const char *zInX){
22145 int i;
22146 int needUnistr = 0;
22147 int needDblQuote = 0;
22148 const unsigned char *z = (const unsigned char*)zInX;
22149 unsigned char c;
22150 FILE *out = p->out;
22151 sqlite3_fsetmode(out, _O_BINARY);
22152 if( z==0 ) return;
22153 for(i=0; (c = z[i])!=0; i++){
22154 if( c=='\'' ){ needDblQuote = 1; }
22155 if( c>0x1f ) continue;
22156 if( c=='\t' || c=='\n' ) continue;
22157 if( c=='\r' && z[i+1]=='\n' ) continue;
22158 needUnistr = 1;
22159 break;
22160 }
22161 if( (needDblQuote==0 && needUnistr==0)
22162 || (needDblQuote==0 && p->eEscMode==SHELL_ESC_OFF)
22163 ){
22164 sqlite3_fprintf(out, "'%s'",z);
22165 }else if( p->eEscMode==SHELL_ESC_OFF ){
22166 char *zEncoded = sqlite3_mprintf("%Q", z);
22167 sqlite3_fputs(zEncoded, out);
22168 sqlite3_free(zEncoded);
22169 }else{
22170 if( needUnistr ){
22171 sqlite3_fputs("unistr('", out);
22172 }else{
22173 sqlite3_fputs("'", out);
22174 }
22175 while( *z ){
22176 for(i=0; (c = z[i])!=0; i++){
22177 if( c=='\'' ) break;
22178 if( c>0x1f ) continue;
22179 if( c=='\t' || c=='\n' ) continue;
22180 if( c=='\r' && z[i+1]=='\n' ) continue;
22181 break;
22182 }
22183 if( i ){
22184 sqlite3_fprintf(out, "%.*s", i, z);
22185 z += i;
22186 }
22187 if( c==0 ) break;
22188 if( c=='\'' ){
22189 sqlite3_fputs("''", out);
22190 }else{
22191 sqlite3_fprintf(out, "\\u%04x", c);
22192 }
22193 z++;
22194 }
22195 if( needUnistr ){
22196 sqlite3_fputs("')", out);
22197 }else{
22198 sqlite3_fputs("'", out);
22199 }
22200 }
22201 setCrlfMode(p);
22202}
22203
22204/*
22205** Output the given string as a quoted string using SQL quoting conventions.
22206** Additionallly , escape the "\n" and "\r" characters so that they do not
22207** get corrupted by end-of-line translation facilities in some operating
22208** systems.
22209**
22210** This is like output_quoted_string() but with the addition of the \r\n
22211** escape mechanism.
22212*/
22213static void output_quoted_escaped_string(ShellState *p, const char *z){
22214 char *zEscaped;
22215 sqlite3_fsetmode(p->out, _O_BINARY);
22216 if( p->eEscMode==SHELL_ESC_OFF ){
22217 zEscaped = sqlite3_mprintf("%Q", z);
22218 }else{
22219 zEscaped = sqlite3_mprintf("%#Q", z);
22220 }
22221 sqlite3_fputs(zEscaped, p->out);
22222 sqlite3_free(zEscaped);
22223 setCrlfMode(p);
22224}
22225
22226/*
22227** Find earliest of chars within s specified in zAny.
22228** With ns == ~0, is like strpbrk(s,zAny) and s must be 0-terminated.
22229*/
22230static const char *anyOfInStr(const char *s, const char *zAny, size_t ns){
22231 const char *pcFirst = 0;
22232 if( ns == ~(size_t)0 ) ns = strlen(s);
22233 while(*zAny){
22234 const char *pc = (const char*)memchr(s, *zAny&0xff, ns);
22235 if( pc ){
22236 pcFirst = pc;
22237 ns = pcFirst - s;
22238 }
22239 ++zAny;
22240 }
22241 return pcFirst;
22242}
22243
22244/* Skip over as much z[] input char sequence as is valid UTF-8,
22245** limited per nAccept char's or whole characters and containing
22246** no char cn such that ((1<<cn) & ccm)!=0. On return, the
22247** sequence z:return (inclusive:exclusive) is validated UTF-8.
22248** Limit: nAccept>=0 => char count, nAccept<0 => character
22249 */
22250const char *zSkipValidUtf8(const char *z, int nAccept, long ccm){
22251 int ng = (nAccept<0)? -nAccept : 0;
22252 const char *pcLimit = (nAccept>=0)? z+nAccept : 0;
22253 assert(z!=0);
22254 while( (pcLimit)? (z<pcLimit) : (ng-- != 0) ){
22255 unsigned char c = *(u8*)z;
22256 if( c<0x7f ){
22257 if( ccm != 0L && c < 0x20 && ((1L<<c) & ccm) != 0 ) return z;
22258 ++z; /* ASCII */
22259 }else if( (c & 0xC0) != 0xC0 ) return z; /* not a lead byte */
22260 else{
22261 const char *zt = z+1; /* Got lead byte, look at trail bytes.*/
22262 do{
22263 if( pcLimit && zt >= pcLimit ) return z;
22264 else{
22265 char ct = *zt++;
22266 if( ct==0 || (zt-z)>4 || (ct & 0xC0)!=0x80 ){
22267 /* Trailing bytes are too few, too many, or invalid. */
22268 return z;
22269 }
22270 }
22271 } while( ((c <<= 1) & 0x40) == 0x40 ); /* Eat lead byte's count. */
22272 z = zt;
22273 }
22274 }
22275 return z;
22276}
22277
22278
22279/*
22280** Output the given string as a quoted according to C or TCL quoting rules.
22281*/
22282static void output_c_string(FILE *out, const char *z){
22283 char c;
22284 static const char *zq = "\"";
22285 static long ctrlMask = ~0L;
22286 static const char *zDQBSRO = "\"\\\x7f"; /* double-quote, backslash, rubout */
22287 char ace[3] = "\\?";
22288 char cbsSay;
22289 sqlite3_fputs(zq, out);
22290 while( *z!=0 ){
22291 const char *pcDQBSRO = anyOfInStr(z, zDQBSRO, ~(size_t)0);
22292 const char *pcPast = zSkipValidUtf8(z, INT_MAX, ctrlMask);
22293 const char *pcEnd = (pcDQBSRO && pcDQBSRO < pcPast)? pcDQBSRO : pcPast;
22294 if( pcEnd > z ){
22295 sqlite3_fprintf(out, "%.*s", (int)(pcEnd-z), z);
22296 }
22297 if( (c = *pcEnd)==0 ) break;
22298 ++pcEnd;
22299 switch( c ){
22300 case '\\': case '"':
22301 cbsSay = (char)c;
22302 break;
22303 case '\t': cbsSay = 't'; break;
22304 case '\n': cbsSay = 'n'; break;
22305 case '\r': cbsSay = 'r'; break;
22306 case '\f': cbsSay = 'f'; break;
22307 default: cbsSay = 0; break;
22308 }
22309 if( cbsSay ){
22310 ace[1] = cbsSay;
22311 sqlite3_fputs(ace, out);
22312 }else if( !isprint(c&0xff) ){
22313 sqlite3_fprintf(out, "\\%03o", c&0xff);
22314 }else{
22315 ace[1] = (char)c;
22316 sqlite3_fputs(ace+1, out);
22317 }
22318 z = pcEnd;
22319 }
22320 sqlite3_fputs(zq, out);
22321}
22322
22323/*
22324** Output the given string as quoted according to JSON quoting rules.
22325*/
22326static void output_json_string(FILE *out, const char *z, i64 n){
22327 unsigned char c;
22328 static const char *zq = "\"";
22329 static long ctrlMask = ~0L;
22330 static const char *zDQBS = "\"\\";
22331 const char *pcLimit;
22332 char ace[3] = "\\?";
22333 char cbsSay;
22334
22335 if( z==0 ) z = "";
22336 pcLimit = z + ((n<0)? strlen(z) : (size_t)n);
22337 sqlite3_fputs(zq, out);
22338 while( z < pcLimit ){
22339 const char *pcDQBS = anyOfInStr(z, zDQBS, pcLimit-z);
22340 const char *pcPast = zSkipValidUtf8(z, (int)(pcLimit-z), ctrlMask);
22341 const char *pcEnd = (pcDQBS && pcDQBS < pcPast)? pcDQBS : pcPast;
22342 if( pcEnd > z ){
22343 sqlite3_fprintf(out, "%.*s", (int)(pcEnd-z), z);
22344 z = pcEnd;
22345 }
22346 if( z >= pcLimit ) break;
22347 c = (unsigned char)*(z++);
22348 switch( c ){
22349 case '"': case '\\':
22350 cbsSay = (char)c;
22351 break;
22352 case '\b': cbsSay = 'b'; break;
22353 case '\f': cbsSay = 'f'; break;
22354 case '\n': cbsSay = 'n'; break;
22355 case '\r': cbsSay = 'r'; break;
22356 case '\t': cbsSay = 't'; break;
22357 default: cbsSay = 0; break;
22358 }
22359 if( cbsSay ){
22360 ace[1] = cbsSay;
22361 sqlite3_fputs(ace, out);
22362 }else if( c<=0x1f || c>=0x7f ){
22363 sqlite3_fprintf(out, "\\u%04x", c);
22364 }else{
22365 ace[1] = (char)c;
22366 sqlite3_fputs(ace+1, out);
22367 }
22368 }
22369 sqlite3_fputs(zq, out);
22370}
22371
22372/*
22373** Escape the input string if it is needed and in accordance with
22374** eEscMode.
22375**
22376** Escaping is needed if the string contains any control characters
22377** other than \t, \n, and \r\n
22378**
22379** If no escaping is needed (the common case) then set *ppFree to NULL
22380** and return the original string. If escapingn is needed, write the
22381** escaped string into memory obtained from sqlite3_malloc64() or the
22382** equivalent, and return the new string and set *ppFree to the new string
22383** as well.
22384**
22385** The caller is responsible for freeing *ppFree if it is non-NULL in order
22386** to reclaim memory.
22387*/
22388static const char *escapeOutput(
22389 ShellState *p,
22390 const char *zInX,
22391 char **ppFree
22392){
22393 i64 i, j;
22394 i64 nCtrl = 0;
22395 unsigned char *zIn;
22396 unsigned char c;
22397 unsigned char *zOut;
22398
22399
22400 /* No escaping if disabled */
22401 if( p->eEscMode==SHELL_ESC_OFF ){
22402 *ppFree = 0;
22403 return zInX;
22404 }
22405
22406 /* Count the number of control characters in the string. */
22407 zIn = (unsigned char*)zInX;
22408 for(i=0; (c = zIn[i])!=0; i++){
22409 if( c<=0x1f
22410 && c!='\t'
22411 && c!='\n'
22412 && (c!='\r' || zIn[i+1]!='\n')
22413 ){
22414 nCtrl++;
22415 }
22416 }
22417 if( nCtrl==0 ){
22418 *ppFree = 0;
22419 return zInX;
22420 }
22421 if( p->eEscMode==SHELL_ESC_SYMBOL ) nCtrl *= 2;
22422 zOut = sqlite3_malloc64( i + nCtrl + 1 );
22424 for(i=j=0; (c = zIn[i])!=0; i++){
22425 if( c>0x1f
22426 || c=='\t'
22427 || c=='\n'
22428 || (c=='\r' && zIn[i+1]=='\n')
22429 ){
22430 continue;
22431 }
22432 if( i>0 ){
22433 memcpy(&zOut[j], zIn, i);
22434 j += i;
22435 }
22436 zIn += i+1;
22437 i = -1;
22438 switch( p->eEscMode ){
22439 case SHELL_ESC_SYMBOL:
22440 zOut[j++] = 0xe2;
22441 zOut[j++] = 0x90;
22442 zOut[j++] = 0x80+c;
22443 break;
22444 case SHELL_ESC_ASCII:
22445 zOut[j++] = '^';
22446 zOut[j++] = 0x40+c;
22447 break;
22448 }
22449 }
22450 if( i>0 ){
22451 memcpy(&zOut[j], zIn, i);
22452 j += i;
22453 }
22454 zOut[j] = 0;
22455 *ppFree = (char*)zOut;
22456 return (char*)zOut;
22457}
22458
22459/*
22460** Output the given string with characters that are special to
22461** HTML escaped.
22462*/
22463static void output_html_string(FILE *out, const char *z){
22464 int i;
22465 if( z==0 ) z = "";
22466 while( *z ){
22467 for(i=0; z[i]
22468 && z[i]!='<'
22469 && z[i]!='&'
22470 && z[i]!='>'
22471 && z[i]!='\"'
22472 && z[i]!='\'';
22473 i++){}
22474 if( i>0 ){
22475 sqlite3_fprintf(out, "%.*s",i,z);
22476 }
22477 if( z[i]=='<' ){
22478 sqlite3_fputs("&lt;", out);
22479 }else if( z[i]=='&' ){
22480 sqlite3_fputs("&amp;", out);
22481 }else if( z[i]=='>' ){
22482 sqlite3_fputs("&gt;", out);
22483 }else if( z[i]=='\"' ){
22484 sqlite3_fputs("&quot;", out);
22485 }else if( z[i]=='\'' ){
22486 sqlite3_fputs("&#39;", out);
22487 }else{
22488 break;
22489 }
22490 z += i + 1;
22491 }
22492}
22493
22494/*
22495** If a field contains any character identified by a 1 in the following
22496** array, then the string must be quoted for CSV.
22497*/
22498static const char needCsvQuote[] = {
22499 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22500 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22501 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
22502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22503 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22505 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22506 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
22507 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22508 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22509 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22510 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22511 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22512 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22513 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22514 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
22515};
22516
22517/*
22518** Output a single term of CSV. Actually, p->colSeparator is used for
22519** the separator, which may or may not be a comma. p->nullValue is
22520** the null value. Strings are quoted if necessary. The separator
22521** is only issued if bSep is true.
22522*/
22523static void output_csv(ShellState *p, const char *z, int bSep){
22524 if( z==0 ){
22525 sqlite3_fprintf(p->out, "%s",p->nullValue);
22526 }else{
22527 unsigned i;
22528 for(i=0; z[i]; i++){
22529 if( needCsvQuote[((unsigned char*)z)[i]] ){
22530 i = 0;
22531 break;
22532 }
22533 }
22534 if( i==0 || strstr(z, p->colSeparator)!=0 ){
22535 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
22536 shell_check_oom(zQuoted);
22537 sqlite3_fputs(zQuoted, p->out);
22538 sqlite3_free(zQuoted);
22539 }else{
22540 sqlite3_fputs(z, p->out);
22541 }
22542 }
22543 if( bSep ){
22544 sqlite3_fputs(p->colSeparator, p->out);
22545 }
22546}
22547
22548/*
22549** This routine runs when the user presses Ctrl-C
22550*/
22551static void interrupt_handler(int NotUsed){
22552 UNUSED_PARAMETER(NotUsed);
22553 if( ++seenInterrupt>1 ) exit(1);
22555}
22556
22557#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
22558/*
22559** This routine runs for console events (e.g. Ctrl-C) on Win32
22560*/
22561static BOOL WINAPI ConsoleCtrlHandler(
22562 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
22563){
22564 if( dwCtrlType==CTRL_C_EVENT ){
22565 interrupt_handler(0);
22566 return TRUE;
22567 }
22568 return FALSE;
22569}
22570#endif
22571
22572#ifndef SQLITE_OMIT_AUTHORIZATION
22573/*
22574** This authorizer runs in safe mode.
22575*/
22576static int safeModeAuth(
22577 void *pClientData,
22578 int op,
22579 const char *zA1,
22580 const char *zA2,
22581 const char *zA3,
22582 const char *zA4
22583){
22584 ShellState *p = (ShellState*)pClientData;
22585 static const char *azProhibitedFunctions[] = {
22586 "edit",
22587 "fts3_tokenizer",
22588 "load_extension",
22589 "readfile",
22590 "writefile",
22591 "zipfile",
22592 "zipfile_cds",
22593 };
22594 UNUSED_PARAMETER(zA1);
22595 UNUSED_PARAMETER(zA3);
22596 UNUSED_PARAMETER(zA4);
22597 switch( op ){
22598 case SQLITE_ATTACH: {
22599#ifndef SQLITE_SHELL_FIDDLE
22600 /* In WASM builds the filesystem is a virtual sandbox, so
22601 ** there's no harm in using ATTACH. */
22602 failIfSafeMode(p, "cannot run ATTACH in safe mode");
22603#endif
22604 break;
22605 }
22606 case SQLITE_FUNCTION: {
22607 int i;
22608 for(i=0; i<ArraySize(azProhibitedFunctions); i++){
22609 if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
22610 failIfSafeMode(p, "cannot use the %s() function in safe mode",
22611 azProhibitedFunctions[i]);
22612 }
22613 }
22614 break;
22615 }
22616 }
22617 return SQLITE_OK;
22618}
22619
22620/*
22621** When the ".auth ON" is set, the following authorizer callback is
22622** invoked. It always returns SQLITE_OK.
22623*/
22624static int shellAuth(
22625 void *pClientData,
22626 int op,
22627 const char *zA1,
22628 const char *zA2,
22629 const char *zA3,
22630 const char *zA4
22631){
22632 ShellState *p = (ShellState*)pClientData;
22633 static const char *azAction[] = { 0,
22634 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
22635 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
22636 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
22637 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
22638 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
22639 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
22640 "PRAGMA", "READ", "SELECT",
22641 "TRANSACTION", "UPDATE", "ATTACH",
22642 "DETACH", "ALTER_TABLE", "REINDEX",
22643 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
22644 "FUNCTION", "SAVEPOINT", "RECURSIVE"
22645 };
22646 int i;
22647 const char *az[4];
22648 az[0] = zA1;
22649 az[1] = zA2;
22650 az[2] = zA3;
22651 az[3] = zA4;
22652 sqlite3_fprintf(p->out, "authorizer: %s", azAction[op]);
22653 for(i=0; i<4; i++){
22654 sqlite3_fputs(" ", p->out);
22655 if( az[i] ){
22656 output_c_string(p->out, az[i]);
22657 }else{
22658 sqlite3_fputs("NULL", p->out);
22659 }
22660 }
22661 sqlite3_fputs("\n", p->out);
22662 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
22663 return SQLITE_OK;
22664}
22665#endif
22666
22667/*
22668** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
22669**
22670** This routine converts some CREATE TABLE statements for shadow tables
22671** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
22672**
22673** If the schema statement in z[] contains a start-of-comment and if
22674** sqlite3_complete() returns false, try to terminate the comment before
22675** printing the result. https://sqlite.org/forum/forumpost/d7be961c5c
22676*/
22677static void printSchemaLine(FILE *out, const char *z, const char *zTail){
22678 char *zToFree = 0;
22679 if( z==0 ) return;
22680 if( zTail==0 ) return;
22681 if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
22682 const char *zOrig = z;
22683 static const char *azTerm[] = { "", "*/", "\n" };
22684 int i;
22685 for(i=0; i<ArraySize(azTerm); i++){
22686 char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
22688 if( sqlite3_complete(zNew) ){
22689 size_t n = strlen(zNew);
22690 zNew[n-1] = 0;
22691 zToFree = zNew;
22692 z = zNew;
22693 break;
22694 }
22695 sqlite3_free(zNew);
22696 }
22697 }
22698 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
22699 sqlite3_fprintf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
22700 }else{
22701 sqlite3_fprintf(out, "%s%s", z, zTail);
22702 }
22704}
22705static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
22706 char c = z[n];
22707 z[n] = 0;
22708 printSchemaLine(out, z, zTail);
22709 z[n] = c;
22710}
22711
22712/*
22713** Return true if string z[] has nothing but whitespace and comments to the
22714** end of the first line.
22715*/
22716static int wsToEol(const char *z){
22717 int i;
22718 for(i=0; z[i]; i++){
22719 if( z[i]=='\n' ) return 1;
22720 if( IsSpace(z[i]) ) continue;
22721 if( z[i]=='-' && z[i+1]=='-' ) return 1;
22722 return 0;
22723 }
22724 return 1;
22725}
22726
22727/*
22728** Add a new entry to the EXPLAIN QUERY PLAN data
22729*/
22730static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
22731 EQPGraphRow *pNew;
22732 i64 nText;
22733 if( zText==0 ) return;
22734 nText = strlen(zText);
22735 if( p->autoEQPtest ){
22736 sqlite3_fprintf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
22737 }
22738 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
22740 pNew->iEqpId = iEqpId;
22741 pNew->iParentId = p2;
22742 memcpy(pNew->zText, zText, nText+1);
22743 pNew->pNext = 0;
22744 if( p->sGraph.pLast ){
22745 p->sGraph.pLast->pNext = pNew;
22746 }else{
22747 p->sGraph.pRow = pNew;
22748 }
22749 p->sGraph.pLast = pNew;
22750}
22751
22752/*
22753** Free and reset the EXPLAIN QUERY PLAN data that has been collected
22754** in p->sGraph.
22755*/
22756static void eqp_reset(ShellState *p){
22757 EQPGraphRow *pRow, *pNext;
22758 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
22759 pNext = pRow->pNext;
22760 sqlite3_free(pRow);
22761 }
22762 memset(&p->sGraph, 0, sizeof(p->sGraph));
22763}
22764
22765/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
22766** pOld, or return the first such line if pOld is NULL
22767*/
22768static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
22769 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
22770 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
22771 return pRow;
22772}
22773
22774/* Render a single level of the graph that has iEqpId as its parent. Called
22775** recursively to render sublevels.
22776*/
22777static void eqp_render_level(ShellState *p, int iEqpId){
22778 EQPGraphRow *pRow, *pNext;
22779 i64 n = strlen(p->sGraph.zPrefix);
22780 char *z;
22781 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
22782 pNext = eqp_next_row(p, iEqpId, pRow);
22783 z = pRow->zText;
22784 sqlite3_fprintf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
22785 pNext ? "|--" : "`--", z);
22786 if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
22787 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
22788 eqp_render_level(p, pRow->iEqpId);
22789 p->sGraph.zPrefix[n] = 0;
22790 }
22791 }
22792}
22793
22794/*
22795** Display and reset the EXPLAIN QUERY PLAN data
22796*/
22797static void eqp_render(ShellState *p, i64 nCycle){
22798 EQPGraphRow *pRow = p->sGraph.pRow;
22799 if( pRow ){
22800 if( pRow->zText[0]=='-' ){
22801 if( pRow->pNext==0 ){
22802 eqp_reset(p);
22803 return;
22804 }
22805 sqlite3_fprintf(p->out, "%s\n", pRow->zText+3);
22806 p->sGraph.pRow = pRow->pNext;
22807 sqlite3_free(pRow);
22808 }else if( nCycle>0 ){
22809 sqlite3_fprintf(p->out, "QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
22810 }else{
22811 sqlite3_fputs("QUERY PLAN\n", p->out);
22812 }
22813 p->sGraph.zPrefix[0] = 0;
22814 eqp_render_level(p, 0);
22815 eqp_reset(p);
22816 }
22817}
22818
22819#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
22820/*
22821** Progress handler callback.
22822*/
22823static int progress_handler(void *pClientData) {
22824 ShellState *p = (ShellState*)pClientData;
22825 p->nProgress++;
22826 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
22827 sqlite3_fprintf(p->out, "Progress limit reached (%u)\n", p->nProgress);
22830 return 1;
22831 }
22832 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
22833 sqlite3_fprintf(p->out, "Progress %u\n", p->nProgress);
22834 }
22835 return 0;
22836}
22837#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
22838
22839/*
22840** Print N dashes
22841*/
22842static void print_dashes(FILE *out, int N){
22843 const char zDash[] = "--------------------------------------------------";
22844 const int nDash = sizeof(zDash) - 1;
22845 while( N>nDash ){
22846 sqlite3_fputs(zDash, out);
22847 N -= nDash;
22848 }
22849 sqlite3_fprintf(out, "%.*s", N, zDash);
22850}
22851
22852/*
22853** Print a markdown or table-style row separator using ascii-art
22854*/
22855static void print_row_separator(
22856 ShellState *p,
22857 int nArg,
22858 const char *zSep
22859){
22860 int i;
22861 if( nArg>0 ){
22862 sqlite3_fputs(zSep, p->out);
22863 print_dashes(p->out, p->actualWidth[0]+2);
22864 for(i=1; i<nArg; i++){
22865 sqlite3_fputs(zSep, p->out);
22866 print_dashes(p->out, p->actualWidth[i]+2);
22867 }
22868 sqlite3_fputs(zSep, p->out);
22869 }
22870 sqlite3_fputs("\n", p->out);
22871}
22872
22873/*
22874** This is the callback routine that the shell
22875** invokes for each row of a query result.
22876*/
22877static int shell_callback(
22878 void *pArg,
22879 int nArg, /* Number of result columns */
22880 char **azArg, /* Text of each result column */
22881 char **azCol, /* Column names */
22882 int *aiType /* Column types. Might be NULL */
22883){
22884 int i;
22885 ShellState *p = (ShellState*)pArg;
22886
22887 if( azArg==0 ) return 0;
22888 switch( p->cMode ){
22889 case MODE_Count:
22890 case MODE_Off: {
22891 break;
22892 }
22893 case MODE_Line: {
22894 int w = 5;
22895 if( azArg==0 ) break;
22896 for(i=0; i<nArg; i++){
22897 int len = strlen30(azCol[i] ? azCol[i] : "");
22898 if( len>w ) w = len;
22899 }
22900 if( p->cnt++>0 ) sqlite3_fputs(p->rowSeparator, p->out);
22901 for(i=0; i<nArg; i++){
22902 char *pFree = 0;
22903 const char *pDisplay;
22904 pDisplay = escapeOutput(p, azArg[i] ? azArg[i] : p->nullValue, &pFree);
22905 sqlite3_fprintf(p->out, "%*s = %s%s", w, azCol[i],
22906 pDisplay, p->rowSeparator);
22907 if( pFree ) sqlite3_free(pFree);
22908 }
22909 break;
22910 }
22911 case MODE_ScanExp:
22912 case MODE_Explain: {
22913 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
22914 static const int aExplainMap[] = {0, 1, 2, 3, 4, 5, 6, 7 };
22915 static const int aScanExpWidth[] = {4, 15, 6, 13, 4, 4, 4, 13, 2, 13};
22916 static const int aScanExpMap[] = {0, 9, 8, 1, 2, 3, 4, 5, 6, 7 };
22917
22918 const int *aWidth = aExplainWidth;
22919 const int *aMap = aExplainMap;
22920 int nWidth = ArraySize(aExplainWidth);
22921 int iIndent = 1;
22922
22923 if( p->cMode==MODE_ScanExp ){
22924 aWidth = aScanExpWidth;
22925 aMap = aScanExpMap;
22926 nWidth = ArraySize(aScanExpWidth);
22927 iIndent = 3;
22928 }
22929 if( nArg>nWidth ) nArg = nWidth;
22930
22931 /* If this is the first row seen, print out the headers */
22932 if( p->cnt++==0 ){
22933 for(i=0; i<nArg; i++){
22934 utf8_width_print(p->out, aWidth[i], azCol[ aMap[i] ]);
22935 sqlite3_fputs(i==nArg-1 ? "\n" : " ", p->out);
22936 }
22937 for(i=0; i<nArg; i++){
22938 print_dashes(p->out, aWidth[i]);
22939 sqlite3_fputs(i==nArg-1 ? "\n" : " ", p->out);
22940 }
22941 }
22942
22943 /* If there is no data, exit early. */
22944 if( azArg==0 ) break;
22945
22946 for(i=0; i<nArg; i++){
22947 const char *zSep = " ";
22948 int w = aWidth[i];
22949 const char *zVal = azArg[ aMap[i] ];
22950 if( i==nArg-1 ) w = 0;
22951 if( zVal && strlenChar(zVal)>w ){
22952 w = strlenChar(zVal);
22953 zSep = " ";
22954 }
22955 if( i==iIndent && p->aiIndent && p->pStmt ){
22956 if( p->iIndent<p->nIndent ){
22957 sqlite3_fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
22958 }
22959 p->iIndent++;
22960 }
22961 utf8_width_print(p->out, w, zVal ? zVal : p->nullValue);
22962 sqlite3_fputs(i==nArg-1 ? "\n" : zSep, p->out);
22963 }
22964 break;
22965 }
22966 case MODE_Semi: { /* .schema and .fullschema output */
22967 printSchemaLine(p->out, azArg[0], ";\n");
22968 break;
22969 }
22970 case MODE_Pretty: { /* .schema and .fullschema with --indent */
22971 char *z;
22972 int j;
22973 int nParen = 0;
22974 char cEnd = 0;
22975 char c;
22976 int nLine = 0;
22977 int isIndex;
22978 int isWhere = 0;
22979 assert( nArg==1 );
22980 if( azArg[0]==0 ) break;
22981 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
22982 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
22983 ){
22984 sqlite3_fprintf(p->out, "%s;\n", azArg[0]);
22985 break;
22986 }
22987 isIndex = sqlite3_strlike("CREATE INDEX%", azArg[0], 0)==0
22988 || sqlite3_strlike("CREATE UNIQUE INDEX%", azArg[0], 0)==0;
22989 z = sqlite3_mprintf("%s", azArg[0]);
22991 j = 0;
22992 for(i=0; IsSpace(z[i]); i++){}
22993 for(; (c = z[i])!=0; i++){
22994 if( IsSpace(c) ){
22995 if( z[j-1]=='\r' ) z[j-1] = '\n';
22996 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
22997 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
22998 j--;
22999 }
23000 z[j++] = c;
23001 }
23002 while( j>0 && IsSpace(z[j-1]) ){ j--; }
23003 z[j] = 0;
23004 if( strlen30(z)>=79 ){
23005 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
23006 if( c==cEnd ){
23007 cEnd = 0;
23008 }else if( c=='"' || c=='\'' || c=='`' ){
23009 cEnd = c;
23010 }else if( c=='[' ){
23011 cEnd = ']';
23012 }else if( c=='-' && z[i+1]=='-' ){
23013 cEnd = '\n';
23014 }else if( c=='(' ){
23015 nParen++;
23016 }else if( c==')' ){
23017 nParen--;
23018 if( nLine>0 && nParen==0 && j>0 && !isWhere ){
23019 printSchemaLineN(p->out, z, j, "\n");
23020 j = 0;
23021 }
23022 }else if( (c=='w' || c=='W')
23023 && nParen==0 && isIndex
23024 && sqlite3_strnicmp("WHERE",&z[i],5)==0
23025 && !IsAlnum(z[i+5]) && z[i+5]!='_' ){
23026 isWhere = 1;
23027 }else if( isWhere && (c=='A' || c=='a')
23028 && nParen==0
23029 && sqlite3_strnicmp("AND",&z[i],3)==0
23030 && !IsAlnum(z[i+3]) && z[i+3]!='_' ){
23031 printSchemaLineN(p->out, z, j, "\n ");
23032 j = 0;
23033 }
23034 z[j++] = c;
23035 if( nParen==1 && cEnd==0
23036 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
23037 && !isWhere
23038 ){
23039 if( c=='\n' ) j--;
23040 printSchemaLineN(p->out, z, j, "\n ");
23041 j = 0;
23042 nLine++;
23043 while( IsSpace(z[i+1]) ){ i++; }
23044 }
23045 }
23046 z[j] = 0;
23047 }
23048 printSchemaLine(p->out, z, ";\n");
23050 break;
23051 }
23052 case MODE_List: {
23053 if( p->cnt++==0 && p->showHeader ){
23054 for(i=0; i<nArg; i++){
23055 char *z = azCol[i];
23056 char *pFree;
23057 const char *zOut = escapeOutput(p, z, &pFree);
23058 sqlite3_fprintf(p->out, "%s%s", zOut,
23059 i==nArg-1 ? p->rowSeparator : p->colSeparator);
23060 if( pFree ) sqlite3_free(pFree);
23061 }
23062 }
23063 if( azArg==0 ) break;
23064 for(i=0; i<nArg; i++){
23065 char *z = azArg[i];
23066 char *pFree;
23067 const char *zOut;
23068 if( z==0 ) z = p->nullValue;
23069 zOut = escapeOutput(p, z, &pFree);
23070 sqlite3_fputs(zOut, p->out);
23071 if( pFree ) sqlite3_free(pFree);
23072 sqlite3_fputs((i<nArg-1)? p->colSeparator : p->rowSeparator, p->out);
23073 }
23074 break;
23075 }
23076 case MODE_Www:
23077 case MODE_Html: {
23078 if( p->cnt==0 && p->cMode==MODE_Www ){
23079 sqlite3_fputs(
23080 "</PRE>\n"
23081 "<TABLE border='1' cellspacing='0' cellpadding='2'>\n"
23082 ,p->out
23083 );
23084 }
23085 if( p->cnt==0 && (p->showHeader || p->cMode==MODE_Www) ){
23086 sqlite3_fputs("<TR>", p->out);
23087 for(i=0; i<nArg; i++){
23088 sqlite3_fputs("<TH>", p->out);
23089 output_html_string(p->out, azCol[i]);
23090 sqlite3_fputs("</TH>\n", p->out);
23091 }
23092 sqlite3_fputs("</TR>\n", p->out);
23093 }
23094 p->cnt++;
23095 if( azArg==0 ) break;
23096 sqlite3_fputs("<TR>", p->out);
23097 for(i=0; i<nArg; i++){
23098 sqlite3_fputs("<TD>", p->out);
23099 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
23100 sqlite3_fputs("</TD>\n", p->out);
23101 }
23102 sqlite3_fputs("</TR>\n", p->out);
23103 break;
23104 }
23105 case MODE_Tcl: {
23106 if( p->cnt++==0 && p->showHeader ){
23107 for(i=0; i<nArg; i++){
23108 output_c_string(p->out, azCol[i] ? azCol[i] : "");
23109 if(i<nArg-1) sqlite3_fputs(p->colSeparator, p->out);
23110 }
23111 sqlite3_fputs(p->rowSeparator, p->out);
23112 }
23113 if( azArg==0 ) break;
23114 for(i=0; i<nArg; i++){
23115 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
23116 if(i<nArg-1) sqlite3_fputs(p->colSeparator, p->out);
23117 }
23118 sqlite3_fputs(p->rowSeparator, p->out);
23119 break;
23120 }
23121 case MODE_Csv: {
23122 sqlite3_fsetmode(p->out, _O_BINARY);
23123 if( p->cnt++==0 && p->showHeader ){
23124 for(i=0; i<nArg; i++){
23125 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
23126 }
23127 sqlite3_fputs(p->rowSeparator, p->out);
23128 }
23129 if( nArg>0 ){
23130 for(i=0; i<nArg; i++){
23131 output_csv(p, azArg[i], i<nArg-1);
23132 }
23133 sqlite3_fputs(p->rowSeparator, p->out);
23134 }
23135 setCrlfMode(p);
23136 break;
23137 }
23138 case MODE_Insert: {
23139 if( azArg==0 ) break;
23140 sqlite3_fprintf(p->out, "INSERT INTO %s",p->zDestTable);
23141 if( p->showHeader ){
23142 sqlite3_fputs("(", p->out);
23143 for(i=0; i<nArg; i++){
23144 if( i>0 ) sqlite3_fputs(",", p->out);
23145 if( quoteChar(azCol[i]) ){
23146 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
23148 sqlite3_fputs(z, p->out);
23150 }else{
23151 sqlite3_fprintf(p->out, "%s", azCol[i]);
23152 }
23153 }
23154 sqlite3_fputs(")", p->out);
23155 }
23156 p->cnt++;
23157 for(i=0; i<nArg; i++){
23158 sqlite3_fputs(i>0 ? "," : " VALUES(", p->out);
23159 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
23160 sqlite3_fputs("NULL", p->out);
23161 }else if( aiType && aiType[i]==SQLITE_TEXT ){
23162 if( ShellHasFlag(p, SHFLG_Newlines) ){
23163 output_quoted_string(p, azArg[i]);
23164 }else{
23165 output_quoted_escaped_string(p, azArg[i]);
23166 }
23167 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
23168 sqlite3_fputs(azArg[i], p->out);
23169 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
23170 char z[50];
23171 double r = sqlite3_column_double(p->pStmt, i);
23172 sqlite3_uint64 ur;
23173 memcpy(&ur,&r,sizeof(r));
23174 if( ur==0x7ff0000000000000LL ){
23175 sqlite3_fputs("9.0e+999", p->out);
23176 }else if( ur==0xfff0000000000000LL ){
23177 sqlite3_fputs("-9.0e+999", p->out);
23178 }else{
23180 if( r==(double)ir ){
23181 sqlite3_snprintf(50,z,"%lld.0", ir);
23182 }else{
23183 sqlite3_snprintf(50,z,"%!.20g", r);
23184 }
23185 sqlite3_fputs(z, p->out);
23186 }
23187 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
23188 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
23189 int nBlob = sqlite3_column_bytes(p->pStmt, i);
23190 output_hex_blob(p->out, pBlob, nBlob);
23191 }else if( isNumber(azArg[i], 0) ){
23192 sqlite3_fputs(azArg[i], p->out);
23193 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
23194 output_quoted_string(p, azArg[i]);
23195 }else{
23196 output_quoted_escaped_string(p, azArg[i]);
23197 }
23198 }
23199 sqlite3_fputs(");\n", p->out);
23200 break;
23201 }
23202 case MODE_Json: {
23203 if( azArg==0 ) break;
23204 if( p->cnt==0 ){
23205 sqlite3_fputs("[{", p->out);
23206 }else{
23207 sqlite3_fputs(",\n{", p->out);
23208 }
23209 p->cnt++;
23210 for(i=0; i<nArg; i++){
23211 output_json_string(p->out, azCol[i], -1);
23212 sqlite3_fputs(":", p->out);
23213 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
23214 sqlite3_fputs("null", p->out);
23215 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
23216 char z[50];
23217 double r = sqlite3_column_double(p->pStmt, i);
23218 sqlite3_uint64 ur;
23219 memcpy(&ur,&r,sizeof(r));
23220 if( ur==0x7ff0000000000000LL ){
23221 sqlite3_fputs("9.0e+999", p->out);
23222 }else if( ur==0xfff0000000000000LL ){
23223 sqlite3_fputs("-9.0e+999", p->out);
23224 }else{
23225 sqlite3_snprintf(50,z,"%!.20g", r);
23226 sqlite3_fputs(z, p->out);
23227 }
23228 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
23229 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
23230 int nBlob = sqlite3_column_bytes(p->pStmt, i);
23231 output_json_string(p->out, pBlob, nBlob);
23232 }else if( aiType && aiType[i]==SQLITE_TEXT ){
23233 output_json_string(p->out, azArg[i], -1);
23234 }else{
23235 sqlite3_fputs(azArg[i], p->out);
23236 }
23237 if( i<nArg-1 ){
23238 sqlite3_fputs(",", p->out);
23239 }
23240 }
23241 sqlite3_fputs("}", p->out);
23242 break;
23243 }
23244 case MODE_Quote: {
23245 if( azArg==0 ) break;
23246 if( p->cnt==0 && p->showHeader ){
23247 for(i=0; i<nArg; i++){
23248 if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
23249 output_quoted_string(p, azCol[i]);
23250 }
23251 sqlite3_fputs(p->rowSeparator, p->out);
23252 }
23253 p->cnt++;
23254 for(i=0; i<nArg; i++){
23255 if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
23256 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
23257 sqlite3_fputs("NULL", p->out);
23258 }else if( aiType && aiType[i]==SQLITE_TEXT ){
23259 output_quoted_string(p, azArg[i]);
23260 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
23261 sqlite3_fputs(azArg[i], p->out);
23262 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
23263 char z[50];
23264 double r = sqlite3_column_double(p->pStmt, i);
23265 sqlite3_snprintf(50,z,"%!.20g", r);
23266 sqlite3_fputs(z, p->out);
23267 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
23268 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
23269 int nBlob = sqlite3_column_bytes(p->pStmt, i);
23270 output_hex_blob(p->out, pBlob, nBlob);
23271 }else if( isNumber(azArg[i], 0) ){
23272 sqlite3_fputs(azArg[i], p->out);
23273 }else{
23274 output_quoted_string(p, azArg[i]);
23275 }
23276 }
23277 sqlite3_fputs(p->rowSeparator, p->out);
23278 break;
23279 }
23280 case MODE_Ascii: {
23281 if( p->cnt++==0 && p->showHeader ){
23282 for(i=0; i<nArg; i++){
23283 if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
23284 sqlite3_fputs(azCol[i] ? azCol[i] : "", p->out);
23285 }
23286 sqlite3_fputs(p->rowSeparator, p->out);
23287 }
23288 if( azArg==0 ) break;
23289 for(i=0; i<nArg; i++){
23290 if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
23291 sqlite3_fputs(azArg[i] ? azArg[i] : p->nullValue, p->out);
23292 }
23293 sqlite3_fputs(p->rowSeparator, p->out);
23294 break;
23295 }
23296 case MODE_EQP: {
23297 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
23298 break;
23299 }
23300 }
23301 return 0;
23302}
23303
23304/*
23305** This is the callback routine that the SQLite library
23306** invokes for each row of a query result.
23307*/
23308static int callback(void *pArg, int nArg, char **azArg, char **azCol){
23309 /* since we don't have type info, call the shell_callback with a NULL value */
23310 return shell_callback(pArg, nArg, azArg, azCol, NULL);
23311}
23312
23313/*
23314** This is the callback routine from sqlite3_exec() that appends all
23315** output onto the end of a ShellText object.
23316*/
23317static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
23318 ShellText *p = (ShellText*)pArg;
23319 int i;
23320 UNUSED_PARAMETER(az);
23321 if( azArg==0 ) return 0;
23322 if( p->n ) appendText(p, "|", 0);
23323 for(i=0; i<nArg; i++){
23324 if( i ) appendText(p, ",", 0);
23325 if( azArg[i] ) appendText(p, azArg[i], 0);
23326 }
23327 return 0;
23328}
23329
23330/*
23331** Generate an appropriate SELFTEST table in the main database.
23332*/
23333static void createSelftestTable(ShellState *p){
23334 char *zErrMsg = 0;
23336 "SAVEPOINT selftest_init;\n"
23337 "CREATE TABLE IF NOT EXISTS selftest(\n"
23338 " tno INTEGER PRIMARY KEY,\n" /* Test number */
23339 " op TEXT,\n" /* Operator: memo run */
23340 " cmd TEXT,\n" /* Command text */
23341 " ans TEXT\n" /* Desired answer */
23342 ");"
23343 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
23344 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
23345 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
23346 " 'memo','Tests generated by --init');\n"
23347 "INSERT INTO [_shell$self]\n"
23348 " SELECT 'run',\n"
23349 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
23350 "FROM sqlite_schema ORDER BY 2'',224))',\n"
23351 " hex(sha3_query('SELECT type,name,tbl_name,sql "
23352 "FROM sqlite_schema ORDER BY 2',224));\n"
23353 "INSERT INTO [_shell$self]\n"
23354 " SELECT 'run',"
23355 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
23356 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
23357 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
23358 " FROM (\n"
23359 " SELECT name FROM sqlite_schema\n"
23360 " WHERE type='table'\n"
23361 " AND name<>'selftest'\n"
23362 " AND coalesce(rootpage,0)>0\n"
23363 " )\n"
23364 " ORDER BY name;\n"
23365 "INSERT INTO [_shell$self]\n"
23366 " VALUES('run','PRAGMA integrity_check','ok');\n"
23367 "INSERT INTO selftest(tno,op,cmd,ans)"
23368 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
23369 "DROP TABLE [_shell$self];"
23370 ,0,0,&zErrMsg);
23371 if( zErrMsg ){
23372 sqlite3_fprintf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
23373 sqlite3_free(zErrMsg);
23374 }
23375 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
23376}
23377
23378
23379/*
23380** Set the destination table field of the ShellState structure to
23381** the name of the table given. Escape any quote characters in the
23382** table name.
23383*/
23384static void set_table_name(ShellState *p, const char *zName){
23385 int i, n;
23386 char cQuote;
23387 char *z;
23388
23389 if( p->zDestTable ){
23390 free(p->zDestTable);
23391 p->zDestTable = 0;
23392 }
23393 if( zName==0 ) return;
23394 cQuote = quoteChar(zName);
23395 n = strlen30(zName);
23396 if( cQuote ) n += n+2;
23397 z = p->zDestTable = malloc( n+1 );
23399 n = 0;
23400 if( cQuote ) z[n++] = cQuote;
23401 for(i=0; zName[i]; i++){
23402 z[n++] = zName[i];
23403 if( zName[i]==cQuote ) z[n++] = cQuote;
23404 }
23405 if( cQuote ) z[n++] = cQuote;
23406 z[n] = 0;
23407}
23408
23409/*
23410** Maybe construct two lines of text that point out the position of a
23411** syntax error. Return a pointer to the text, in memory obtained from
23412** sqlite3_malloc(). Or, if the most recent error does not involve a
23413** specific token that we can point to, return an empty string.
23414**
23415** In all cases, the memory returned is obtained from sqlite3_malloc64()
23416** and should be released by the caller invoking sqlite3_free().
23417*/
23418static char *shell_error_context(const char *zSql, sqlite3 *db){
23419 int iOffset;
23420 size_t len;
23421 char *zCode;
23422 char *zMsg;
23423 int i;
23424 if( db==0
23425 || zSql==0
23426 || (iOffset = sqlite3_error_offset(db))<0
23427 || iOffset>=(int)strlen(zSql)
23428 ){
23429 return sqlite3_mprintf("");
23430 }
23431 while( iOffset>50 ){
23432 iOffset--;
23433 zSql++;
23434 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
23435 }
23436 len = strlen(zSql);
23437 if( len>78 ){
23438 len = 78;
23439 while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
23440 }
23441 zCode = sqlite3_mprintf("%.*s", len, zSql);
23442 shell_check_oom(zCode);
23443 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
23444 if( iOffset<25 ){
23445 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode,iOffset,"");
23446 }else{
23447 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode,iOffset-14,"");
23448 }
23449 return zMsg;
23450}
23451
23452
23453/*
23454** Execute a query statement that will generate SQL output. Print
23455** the result columns, comma-separated, on a line and then add a
23456** semicolon terminator to the end of that line.
23457**
23458** If the number of columns is 1 and that column contains text "--"
23459** then write the semicolon on a separate line. That way, if a
23460** "--" comment occurs at the end of the statement, the comment
23461** won't consume the semicolon terminator.
23462*/
23463static int run_table_dump_query(
23464 ShellState *p, /* Query context */
23465 const char *zSelect /* SELECT statement to extract content */
23466){
23467 sqlite3_stmt *pSelect;
23468 int rc;
23469 int nResult;
23470 int i;
23471 const char *z;
23472 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
23473 if( rc!=SQLITE_OK || !pSelect ){
23474 char *zContext = shell_error_context(zSelect, p->db);
23475 sqlite3_fprintf(p->out, "/**** ERROR: (%d) %s *****/\n%s",
23476 rc, sqlite3_errmsg(p->db), zContext);
23477 sqlite3_free(zContext);
23478 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
23479 return rc;
23480 }
23481 rc = sqlite3_step(pSelect);
23482 nResult = sqlite3_column_count(pSelect);
23483 while( rc==SQLITE_ROW ){
23484 z = (const char*)sqlite3_column_text(pSelect, 0);
23485 sqlite3_fprintf(p->out, "%s", z);
23486 for(i=1; i<nResult; i++){
23487 sqlite3_fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
23488 }
23489 if( z==0 ) z = "";
23490 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
23491 if( z[0] ){
23492 sqlite3_fputs("\n;\n", p->out);
23493 }else{
23494 sqlite3_fputs(";\n", p->out);
23495 }
23496 rc = sqlite3_step(pSelect);
23497 }
23498 rc = sqlite3_finalize(pSelect);
23499 if( rc!=SQLITE_OK ){
23500 sqlite3_fprintf(p->out, "/**** ERROR: (%d) %s *****/\n",
23502 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
23503 }
23504 return rc;
23505}
23506
23507/*
23508** Allocate space and save off string indicating current error.
23509*/
23510static char *save_err_msg(
23511 sqlite3 *db, /* Database to query */
23512 const char *zPhase, /* When the error occurs */
23513 int rc, /* Error code returned from API */
23514 const char *zSql /* SQL string, or NULL */
23515){
23516 char *zErr;
23517 char *zContext;
23518 sqlite3_str *pStr = sqlite3_str_new(0);
23519 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
23520 if( rc>1 ){
23521 sqlite3_str_appendf(pStr, " (%d)", rc);
23522 }
23523 zContext = shell_error_context(zSql, db);
23524 if( zContext ){
23525 sqlite3_str_appendall(pStr, zContext);
23526 sqlite3_free(zContext);
23527 }
23528 zErr = sqlite3_str_finish(pStr);
23530 return zErr;
23531}
23532
23533#ifdef __linux__
23534/*
23535** Attempt to display I/O stats on Linux using /proc/PID/io
23536*/
23537static void displayLinuxIoStats(FILE *out){
23538 FILE *in;
23539 char z[200];
23540 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
23541 in = sqlite3_fopen(z, "rb");
23542 if( in==0 ) return;
23543 while( sqlite3_fgets(z, sizeof(z), in)!=0 ){
23544 static const struct {
23545 const char *zPattern;
23546 const char *zDesc;
23547 } aTrans[] = {
23548 { "rchar: ", "Bytes received by read():" },
23549 { "wchar: ", "Bytes sent to write():" },
23550 { "syscr: ", "Read() system calls:" },
23551 { "syscw: ", "Write() system calls:" },
23552 { "read_bytes: ", "Bytes read from storage:" },
23553 { "write_bytes: ", "Bytes written to storage:" },
23554 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
23555 };
23556 int i;
23557 for(i=0; i<ArraySize(aTrans); i++){
23558 int n = strlen30(aTrans[i].zPattern);
23559 if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
23560 sqlite3_fprintf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
23561 break;
23562 }
23563 }
23564 }
23565 fclose(in);
23566}
23567#endif
23568
23569/*
23570** Display a single line of status using 64-bit values.
23571*/
23572static void displayStatLine(
23573 FILE *out, /* Write to this channel */
23574 char *zLabel, /* Label for this one line */
23575 char *zFormat, /* Format for the result */
23576 int iStatusCtrl, /* Which status to display */
23577 int bReset /* True to reset the stats */
23578){
23579 sqlite3_int64 iCur = -1;
23580 sqlite3_int64 iHiwtr = -1;
23581 int i, nPercent;
23582 char zLine[200];
23583 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
23584 for(i=0, nPercent=0; zFormat[i]; i++){
23585 if( zFormat[i]=='%' ) nPercent++;
23586 }
23587 if( nPercent>1 ){
23588 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
23589 }else{
23590 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
23591 }
23592 sqlite3_fprintf(out, "%-36s %s\n", zLabel, zLine);
23593}
23594
23595/*
23596** Display memory stats.
23597*/
23598static int display_stats(
23599 sqlite3 *db, /* Database to query */
23600 ShellState *pArg, /* Pointer to ShellState */
23601 int bReset /* True to reset the stats */
23602){
23603 int iCur;
23604 int iHiwtr;
23605 FILE *out;
23606 if( pArg==0 || pArg->out==0 ) return 0;
23607 out = pArg->out;
23608
23609 if( pArg->pStmt && pArg->statsOn==2 ){
23610 int nCol, i, x;
23611 sqlite3_stmt *pStmt = pArg->pStmt;
23612 char z[100];
23613 nCol = sqlite3_column_count(pStmt);
23614 sqlite3_fprintf(out, "%-36s %d\n", "Number of output columns:", nCol);
23615 for(i=0; i<nCol; i++){
23616 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
23617 sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
23618#ifndef SQLITE_OMIT_DECLTYPE
23619 sqlite3_snprintf(30, z+x, "declared type:");
23620 sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
23621#endif
23622#ifdef SQLITE_ENABLE_COLUMN_METADATA
23623 sqlite3_snprintf(30, z+x, "database name:");
23624 sqlite3_fprintf(out, "%-36s %s\n", z,
23625 sqlite3_column_database_name(pStmt,i));
23626 sqlite3_snprintf(30, z+x, "table name:");
23627 sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
23628 sqlite3_snprintf(30, z+x, "origin name:");
23629 sqlite3_fprintf(out, "%-36s %s\n", z,sqlite3_column_origin_name(pStmt,i));
23630#endif
23631 }
23632 }
23633
23634 if( pArg->statsOn==3 ){
23635 if( pArg->pStmt ){
23637 sqlite3_fprintf(out, "VM-steps: %d\n", iCur);
23638 }
23639 return 0;
23640 }
23641
23642 displayStatLine(out, "Memory Used:",
23643 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
23644 displayStatLine(out, "Number of Outstanding Allocations:",
23645 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
23646 if( pArg->shellFlgs & SHFLG_Pagecache ){
23647 displayStatLine(out, "Number of Pcache Pages Used:",
23648 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
23649 }
23650 displayStatLine(out, "Number of Pcache Overflow Bytes:",
23651 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
23652 displayStatLine(out, "Largest Allocation:",
23653 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
23654 displayStatLine(out, "Largest Pcache Allocation:",
23655 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
23656#ifdef YYTRACKMAXSTACKDEPTH
23657 displayStatLine(out, "Deepest Parser Stack:",
23658 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
23659#endif
23660
23661 if( db ){
23662 if( pArg->shellFlgs & SHFLG_Lookaside ){
23663 iHiwtr = iCur = -1;
23665 &iCur, &iHiwtr, bReset);
23666 sqlite3_fprintf(out,
23667 "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
23669 &iCur, &iHiwtr, bReset);
23670 sqlite3_fprintf(out,
23671 "Successful lookaside attempts: %d\n", iHiwtr);
23673 &iCur, &iHiwtr, bReset);
23674 sqlite3_fprintf(out,
23675 "Lookaside failures due to size: %d\n", iHiwtr);
23677 &iCur, &iHiwtr, bReset);
23678 sqlite3_fprintf(out,
23679 "Lookaside failures due to OOM: %d\n", iHiwtr);
23680 }
23681 iHiwtr = iCur = -1;
23683 sqlite3_fprintf(out,
23684 "Pager Heap Usage: %d bytes\n", iCur);
23685 iHiwtr = iCur = -1;
23687 sqlite3_fprintf(out,
23688 "Page cache hits: %d\n", iCur);
23689 iHiwtr = iCur = -1;
23691 sqlite3_fprintf(out,
23692 "Page cache misses: %d\n", iCur);
23693 iHiwtr = iCur = -1;
23695 sqlite3_fprintf(out,
23696 "Page cache writes: %d\n", iCur);
23697 iHiwtr = iCur = -1;
23699 sqlite3_fprintf(out,
23700 "Page cache spills: %d\n", iCur);
23701 iHiwtr = iCur = -1;
23703 sqlite3_fprintf(out,
23704 "Schema Heap Usage: %d bytes\n", iCur);
23705 iHiwtr = iCur = -1;
23707 sqlite3_fprintf(out,
23708 "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
23709 }
23710
23711 if( pArg->pStmt ){
23712 int iHit, iMiss;
23714 bReset);
23715 sqlite3_fprintf(out,
23716 "Fullscan Steps: %d\n", iCur);
23718 sqlite3_fprintf(out,
23719 "Sort Operations: %d\n", iCur);
23721 sqlite3_fprintf(out,
23722 "Autoindex Inserts: %d\n", iCur);
23724 bReset);
23726 bReset);
23727 if( iHit || iMiss ){
23728 sqlite3_fprintf(out,
23729 "Bloom filter bypass taken: %d/%d\n", iHit, iHit+iMiss);
23730 }
23732 sqlite3_fprintf(out,
23733 "Virtual Machine Steps: %d\n", iCur);
23735 sqlite3_fprintf(out,
23736 "Reprepare operations: %d\n", iCur);
23738 sqlite3_fprintf(out,
23739 "Number of times run: %d\n", iCur);
23741 sqlite3_fprintf(out,
23742 "Memory used by prepared stmt: %d\n", iCur);
23743 }
23744
23745#ifdef __linux__
23746 displayLinuxIoStats(pArg->out);
23747#endif
23748
23749 /* Do not remove this machine readable comment: extra-stats-output-here */
23750
23751 return 0;
23752}
23753
23754
23755#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
23756static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
23757 int iPid = 0;
23758 int ret = 1;
23759 sqlite3_stmt_scanstatus_v2(p, iEntry,
23760 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
23761 );
23762 while( iPid!=0 ){
23763 int ii;
23764 for(ii=0; 1; ii++){
23765 int iId;
23766 int res;
23767 res = sqlite3_stmt_scanstatus_v2(p, ii,
23768 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
23769 );
23770 if( res ) break;
23771 if( iId==iPid ){
23772 sqlite3_stmt_scanstatus_v2(p, ii,
23773 SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
23774 );
23775 }
23776 }
23777 ret++;
23778 }
23779 return ret;
23780}
23781#endif
23782
23783#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
23784static void display_explain_scanstats(
23785 sqlite3 *db, /* Database to query */
23786 ShellState *pArg /* Pointer to ShellState */
23787){
23788 static const int f = SQLITE_SCANSTAT_COMPLEX;
23789 sqlite3_stmt *p = pArg->pStmt;
23790 int ii = 0;
23791 i64 nTotal = 0;
23792 int nWidth = 0;
23793 eqp_reset(pArg);
23794
23795 for(ii=0; 1; ii++){
23796 const char *z = 0;
23797 int n = 0;
23798 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
23799 break;
23800 }
23801 n = (int)strlen(z) + scanStatsHeight(p, ii)*3;
23802 if( n>nWidth ) nWidth = n;
23803 }
23804 nWidth += 4;
23805
23806 sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
23807 for(ii=0; 1; ii++){
23808 i64 nLoop = 0;
23809 i64 nRow = 0;
23810 i64 nCycle = 0;
23811 int iId = 0;
23812 int iPid = 0;
23813 const char *zo = 0;
23814 const char *zName = 0;
23815 char *zText = 0;
23816 double rEst = 0.0;
23817
23818 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){
23819 break;
23820 }
23821 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
23822 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
23823 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
23824 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
23825 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
23826 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
23827 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
23828
23829 zText = sqlite3_mprintf("%s", zo);
23830 if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
23831 char *z = 0;
23832 if( nCycle>=0 && nTotal>0 ){
23833 z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
23834 nCycle, ((nCycle*100)+nTotal/2) / nTotal
23835 );
23836 }
23837 if( nLoop>=0 ){
23838 z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
23839 }
23840 if( nRow>=0 ){
23841 z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
23842 }
23843
23844 if( zName && pArg->scanstatsOn>1 ){
23845 double rpl = (double)nRow / (double)nLoop;
23846 z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
23847 }
23848
23849 zText = sqlite3_mprintf(
23850 "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
23851 );
23852 }
23853
23854 eqp_append(pArg, iId, iPid, zText);
23855 sqlite3_free(zText);
23856 }
23857
23858 eqp_render(pArg, nTotal);
23859}
23860#endif
23861
23862
23863/*
23864** Parameter azArray points to a zero-terminated array of strings. zStr
23865** points to a single nul-terminated string. Return non-zero if zStr
23866** is equal, according to strcmp(), to any of the strings in the array.
23867** Otherwise, return zero.
23868*/
23869static int str_in_array(const char *zStr, const char **azArray){
23870 int i;
23871 for(i=0; azArray[i]; i++){
23872 if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
23873 }
23874 return 0;
23875}
23876
23877/*
23878** If compiled statement pSql appears to be an EXPLAIN statement, allocate
23879** and populate the ShellState.aiIndent[] array with the number of
23880** spaces each opcode should be indented before it is output.
23881**
23882** The indenting rules are:
23883**
23884** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
23885** all opcodes that occur between the p2 jump destination and the opcode
23886** itself by 2 spaces.
23887**
23888** * Do the previous for "Return" instructions for when P2 is positive.
23889** See tag-20220407a in wherecode.c and vdbe.c.
23890**
23891** * For each "Goto", if the jump destination is earlier in the program
23892** and ends on one of:
23893** Yield SeekGt SeekLt RowSetRead Rewind
23894** or if the P1 parameter is one instead of zero,
23895** then indent all opcodes between the earlier instruction
23896** and "Goto" by 2 spaces.
23897*/
23898static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
23899 int *abYield = 0; /* True if op is an OP_Yield */
23900 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
23901 int iOp; /* Index of operation in p->aiIndent[] */
23902
23903 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
23904 "Return", 0 };
23905 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
23906 "Rewind", 0 };
23907 const char *azGoto[] = { "Goto", 0 };
23908
23909 /* The caller guarantees that the leftmost 4 columns of the statement
23910 ** passed to this function are equivalent to the leftmost 4 columns
23911 ** of EXPLAIN statement output. In practice the statement may be
23912 ** an EXPLAIN, or it may be a query on the bytecode() virtual table. */
23913 assert( sqlite3_column_count(pSql)>=4 );
23914 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
23915 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
23916 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
23917 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
23918
23919 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
23920 int i;
23921 int iAddr = sqlite3_column_int(pSql, 0);
23922 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
23923 int p1 = sqlite3_column_int(pSql, 2);
23924 int p2 = sqlite3_column_int(pSql, 3);
23925
23926 /* Assuming that p2 is an instruction address, set variable p2op to the
23927 ** index of that instruction in the aiIndent[] array. p2 and p2op may be
23928 ** different if the current instruction is part of a sub-program generated
23929 ** by an SQL trigger or foreign key. */
23930 int p2op = (p2 + (iOp-iAddr));
23931
23932 /* Grow the p->aiIndent array as required */
23933 if( iOp>=nAlloc ){
23934 nAlloc += 100;
23935 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
23937 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
23938 shell_check_oom(abYield);
23939 }
23940
23941 abYield[iOp] = str_in_array(zOp, azYield);
23942 p->aiIndent[iOp] = 0;
23943 p->nIndent = iOp+1;
23944 if( str_in_array(zOp, azNext) && p2op>0 ){
23945 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
23946 }
23947 if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
23948 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
23949 }
23950 }
23951
23952 p->iIndent = 0;
23953 sqlite3_free(abYield);
23954 sqlite3_reset(pSql);
23955}
23956
23957/*
23958** Free the array allocated by explain_data_prepare().
23959*/
23960static void explain_data_delete(ShellState *p){
23962 p->aiIndent = 0;
23963 p->nIndent = 0;
23964 p->iIndent = 0;
23965}
23966
23967static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
23968
23969/*
23970** Display scan stats.
23971*/
23972static void display_scanstats(
23973 sqlite3 *db, /* Database to query */
23974 ShellState *pArg /* Pointer to ShellState */
23975){
23976#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
23977 UNUSED_PARAMETER(db);
23978 UNUSED_PARAMETER(pArg);
23979#else
23980 if( pArg->scanstatsOn==3 ){
23981 const char *zSql =
23982 " SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
23983 " format('% 6s (%.2f%%)',"
23984 " CASE WHEN ncycle<100_000 THEN ncycle || ' '"
23985 " WHEN ncycle<100_000_000 THEN (ncycle/1_000) || 'K'"
23986 " WHEN ncycle<100_000_000_000 THEN (ncycle/1_000_000) || 'M'"
23987 " ELSE (ncycle/1000_000_000) || 'G' END,"
23988 " ncycle*100.0/(sum(ncycle) OVER ())"
23989 " ) AS cycles"
23990 " FROM bytecode(?)";
23991
23992 int rc = SQLITE_OK;
23993 sqlite3_stmt *pStmt = 0;
23994 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
23995 if( rc==SQLITE_OK ){
23996 sqlite3_stmt *pSave = pArg->pStmt;
23997 pArg->pStmt = pStmt;
23998 sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
23999
24000 pArg->cnt = 0;
24001 pArg->cMode = MODE_ScanExp;
24002 explain_data_prepare(pArg, pStmt);
24003 exec_prepared_stmt(pArg, pStmt);
24004 explain_data_delete(pArg);
24005
24006 sqlite3_finalize(pStmt);
24007 pArg->pStmt = pSave;
24008 }
24009 }else{
24010 display_explain_scanstats(db, pArg);
24011 }
24012#endif
24013}
24014
24015/*
24016** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
24018static unsigned int savedSelectTrace;
24019static unsigned int savedWhereTrace;
24020static void disable_debug_trace_modes(void){
24021 unsigned int zero = 0;
24026}
24027static void restore_debug_trace_modes(void){
24030}
24032/* Create the TEMP table used to store parameter bindings */
24033static void bind_table_init(ShellState *p){
24034 int wrSchema = 0;
24035 int defensiveMode = 0;
24041 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
24042 " key TEXT PRIMARY KEY,\n"
24043 " value\n"
24044 ") WITHOUT ROWID;",
24045 0, 0, 0);
24048}
24049
24050/*
24051** Bind parameters on a prepared statement.
24052**
24053** Parameter bindings are taken from a TEMP table of the form:
24054**
24055** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
24056** WITHOUT ROWID;
24057**
24058** No bindings occur if this table does not exist. The name of the table
24059** begins with "sqlite_" so that it will not collide with ordinary application
24060** tables. The table must be in the TEMP schema.
24061*/
24062static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
24063 int nVar;
24064 int i;
24065 int rc;
24066 sqlite3_stmt *pQ = 0;
24067
24069 if( nVar==0 ) return; /* Nothing to do */
24070 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
24071 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
24072 rc = SQLITE_NOTFOUND;
24073 pQ = 0;
24074 }else{
24076 "SELECT value FROM temp.sqlite_parameters"
24077 " WHERE key=?1", -1, &pQ, 0);
24078 }
24079 for(i=1; i<=nVar; i++){
24080 char zNum[30];
24081 const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
24082 if( zVar==0 ){
24083 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
24084 zVar = zNum;
24085 }
24087 if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
24089#ifdef NAN
24090 }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
24091 sqlite3_bind_double(pStmt, i, NAN);
24092#endif
24093#ifdef INFINITY
24094 }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
24095 sqlite3_bind_double(pStmt, i, INFINITY);
24096#endif
24097 }else if( strncmp(zVar, "$int_", 5)==0 ){
24098 sqlite3_bind_int(pStmt, i, atoi(&zVar[5]));
24099 }else if( strncmp(zVar, "$text_", 6)==0 ){
24100 size_t szVar = strlen(zVar);
24101 char *zBuf = sqlite3_malloc64( szVar-5 );
24102 if( zBuf ){
24103 memcpy(zBuf, &zVar[6], szVar-5);
24105 }
24106 }else{
24107 sqlite3_bind_null(pStmt, i);
24108 }
24110 }
24112}
24113
24114/*
24115** UTF8 box-drawing characters. Imagine box lines like this:
24116**
24117** 1
24118** |
24119** 4 --+-- 2
24120** |
24121** 3
24122**
24123** Each box characters has between 2 and 4 of the lines leading from
24124** the center. The characters are here identified by the numbers of
24125** their corresponding lines.
24127#define BOX_24 "\342\224\200" /* U+2500 --- */
24128#define BOX_13 "\342\224\202" /* U+2502 | */
24129#define BOX_23 "\342\224\214" /* U+250c ,- */
24130#define BOX_34 "\342\224\220" /* U+2510 -, */
24131#define BOX_12 "\342\224\224" /* U+2514 '- */
24132#define BOX_14 "\342\224\230" /* U+2518 -' */
24133#define BOX_123 "\342\224\234" /* U+251c |- */
24134#define BOX_134 "\342\224\244" /* U+2524 -| */
24135#define BOX_234 "\342\224\254" /* U+252c -,- */
24136#define BOX_124 "\342\224\264" /* U+2534 -'- */
24137#define BOX_1234 "\342\224\274" /* U+253c -|- */
24138
24139/* Draw horizontal line N characters long using unicode box
24140** characters
24141*/
24142static void print_box_line(FILE *out, int N){
24143 const char zDash[] =
24146 const int nDash = sizeof(zDash) - 1;
24147 N *= 3;
24148 while( N>nDash ){
24149 sqlite3_fputs(zDash, out);
24150 N -= nDash;
24151 }
24152 sqlite3_fprintf(out, "%.*s", N, zDash);
24153}
24154
24155/*
24156** Draw a horizontal separator for a MODE_Box table.
24157*/
24158static void print_box_row_separator(
24159 ShellState *p,
24160 int nArg,
24161 const char *zSep1,
24162 const char *zSep2,
24163 const char *zSep3
24164){
24165 int i;
24166 if( nArg>0 ){
24167 sqlite3_fputs(zSep1, p->out);
24168 print_box_line(p->out, p->actualWidth[0]+2);
24169 for(i=1; i<nArg; i++){
24170 sqlite3_fputs(zSep2, p->out);
24171 print_box_line(p->out, p->actualWidth[i]+2);
24172 }
24173 sqlite3_fputs(zSep3, p->out);
24174 }
24175 sqlite3_fputs("\n", p->out);
24176}
24177
24178/*
24179** z[] is a line of text that is to be displayed the .mode box or table or
24180** similar tabular formats. z[] might contain control characters such
24181** as \n, \t, \f, or \r.
24182**
24183** Compute characters to display on the first line of z[]. Stop at the
24184** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained
24185** from malloc()) of that first line, which caller should free sometime.
24186** Write anything to display on the next line into *pzTail. If this is
24187** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
24188*/
24189static char *translateForDisplayAndDup(
24190 ShellState *p, /* To access current settings */
24191 const unsigned char *z, /* Input text to be transformed */
24192 const unsigned char **pzTail, /* OUT: Tail of the input for next line */
24193 int mxWidth, /* Max width. 0 means no limit */
24194 u8 bWordWrap /* If true, avoid breaking mid-word */
24195){
24196 int i; /* Input bytes consumed */
24197 int j; /* Output bytes generated */
24198 int k; /* Input bytes to be displayed */
24199 int n; /* Output column number */
24200 unsigned char *zOut; /* Output text */
24201
24202 if( z==0 ){
24203 *pzTail = 0;
24204 return 0;
24205 }
24206 if( mxWidth<0 ) mxWidth = -mxWidth;
24207 if( mxWidth==0 ) mxWidth = 1000000;
24208 i = j = n = 0;
24209 while( n<mxWidth ){
24210 unsigned char c = z[i];
24211 if( c>=0xc0 ){
24212 int u;
24213 int len = decodeUtf8(&z[i], &u);
24214 i += len;
24215 j += len;
24216 n += cli_wcwidth(u);
24217 continue;
24218 }
24219 if( c>=' ' ){
24220 n++;
24221 i++;
24222 j++;
24223 continue;
24224 }
24225 if( c==0 || c=='\n' || (c=='\r' && z[i+1]=='\n') ) break;
24226 if( c=='\t' ){
24227 do{
24228 n++;
24229 j++;
24230 }while( (n&7)!=0 && n<mxWidth );
24231 i++;
24232 continue;
24233 }
24234 if( c==0x1b && p->eEscMode==SHELL_ESC_OFF && (k = isVt100(&z[i]))>0 ){
24235 i += k;
24236 j += k;
24237 }else{
24238 n++;
24239 j += 3;
24240 i++;
24241 }
24242 }
24243 if( n>=mxWidth && bWordWrap ){
24244 /* Perhaps try to back up to a better place to break the line */
24245 for(k=i; k>i/2; k--){
24246 if( IsSpace(z[k-1]) ) break;
24247 }
24248 if( k<=i/2 ){
24249 for(k=i; k>i/2; k--){
24250 if( IsAlnum(z[k-1])!=IsAlnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
24251 }
24252 }
24253 if( k<=i/2 ){
24254 k = i;
24255 }else{
24256 i = k;
24257 while( z[i]==' ' ) i++;
24258 }
24259 }else{
24260 k = i;
24261 }
24262 if( n>=mxWidth && z[i]>=' ' ){
24263 *pzTail = &z[i];
24264 }else if( z[i]=='\r' && z[i+1]=='\n' ){
24265 *pzTail = z[i+2] ? &z[i+2] : 0;
24266 }else if( z[i]==0 || z[i+1]==0 ){
24267 *pzTail = 0;
24268 }else{
24269 *pzTail = &z[i+1];
24270 }
24271 zOut = malloc( j+1 );
24273 i = j = n = 0;
24274 while( i<k ){
24275 unsigned char c = z[i];
24276 if( c>=0xc0 ){
24277 int u;
24278 int len = decodeUtf8(&z[i], &u);
24279 do{ zOut[j++] = z[i++]; }while( (--len)>0 );
24280 n += cli_wcwidth(u);
24281 continue;
24282 }
24283 if( c>=' ' ){
24284 n++;
24285 zOut[j++] = z[i++];
24286 continue;
24287 }
24288 if( c==0 ) break;
24289 if( z[i]=='\t' ){
24290 do{
24291 n++;
24292 zOut[j++] = ' ';
24293 }while( (n&7)!=0 && n<mxWidth );
24294 i++;
24295 continue;
24296 }
24297 switch( p->eEscMode ){
24298 case SHELL_ESC_SYMBOL:
24299 zOut[j++] = 0xe2;
24300 zOut[j++] = 0x90;
24301 zOut[j++] = 0x80 + c;
24302 break;
24303 case SHELL_ESC_ASCII:
24304 zOut[j++] = '^';
24305 zOut[j++] = 0x40 + c;
24306 break;
24307 case SHELL_ESC_OFF: {
24308 int nn;
24309 if( c==0x1b && (nn = isVt100(&z[i]))>0 ){
24310 memcpy(&zOut[j], &z[i], nn);
24311 j += nn;
24312 i += nn - 1;
24313 }else{
24314 zOut[j++] = c;
24315 }
24316 break;
24317 }
24318 }
24319 i++;
24320 }
24321 zOut[j] = 0;
24322 return (char*)zOut;
24323}
24324
24325/* Return true if the text string z[] contains characters that need
24326** unistr() escaping.
24327*/
24328static int needUnistr(const unsigned char *z){
24329 unsigned char c;
24330 if( z==0 ) return 0;
24331 while( (c = *z)>0x1f || c=='\t' || c=='\n' || (c=='\r' && z[1]=='\n') ){ z++; }
24332 return c!=0;
24333}
24334
24335/* Extract the value of the i-th current column for pStmt as an SQL literal
24336** value. Memory is obtained from sqlite3_malloc64() and must be freed by
24337** the caller.
24338*/
24339static char *quoted_column(sqlite3_stmt *pStmt, int i){
24340 switch( sqlite3_column_type(pStmt, i) ){
24341 case SQLITE_NULL: {
24342 return sqlite3_mprintf("NULL");
24343 }
24344 case SQLITE_INTEGER:
24345 case SQLITE_FLOAT: {
24347 }
24348 case SQLITE_TEXT: {
24349 const unsigned char *zText = sqlite3_column_text(pStmt,i);
24350 return sqlite3_mprintf(needUnistr(zText)?"%#Q":"%Q",zText);
24351 }
24352 case SQLITE_BLOB: {
24353 int j;
24354 sqlite3_str *pStr = sqlite3_str_new(0);
24355 const unsigned char *a = sqlite3_column_blob(pStmt,i);
24356 int n = sqlite3_column_bytes(pStmt,i);
24357 sqlite3_str_append(pStr, "x'", 2);
24358 for(j=0; j<n; j++){
24359 sqlite3_str_appendf(pStr, "%02x", a[j]);
24360 }
24361 sqlite3_str_append(pStr, "'", 1);
24362 return sqlite3_str_finish(pStr);
24363 }
24364 }
24365 return 0; /* Not reached */
24366}
24367
24368/*
24369** Run a prepared statement and output the result in one of the
24370** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
24371** or MODE_Box.
24372**
24373** This is different from ordinary exec_prepared_stmt() in that
24374** it has to run the entire query and gather the results into memory
24375** first, in order to determine column widths, before providing
24376** any output.
24377*/
24378static void exec_prepared_stmt_columnar(
24379 ShellState *p, /* Pointer to ShellState */
24380 sqlite3_stmt *pStmt /* Statement to run */
24381){
24382 sqlite3_int64 nRow = 0;
24383 int nColumn = 0;
24384 char **azData = 0;
24385 sqlite3_int64 nAlloc = 0;
24386 char *abRowDiv = 0;
24387 const unsigned char *uz;
24388 const char *z;
24389 char **azQuoted = 0;
24390 int rc;
24391 sqlite3_int64 i, nData;
24392 int j, nTotal, w, n;
24393 const char *colSep = 0;
24394 const char *rowSep = 0;
24395 const unsigned char **azNextLine = 0;
24396 int bNextLine = 0;
24397 int bMultiLineRowExists = 0;
24398 int bw = p->cmOpts.bWordWrap;
24399 const char *zEmpty = "";
24400 const char *zShowNull = p->nullValue;
24401
24402 rc = sqlite3_step(pStmt);
24403 if( rc!=SQLITE_ROW ) return;
24404 nColumn = sqlite3_column_count(pStmt);
24405 if( nColumn==0 ) goto columnar_end;
24406 nAlloc = nColumn*4;
24407 if( nAlloc<=0 ) nAlloc = 1;
24408 azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
24409 shell_check_oom(azData);
24410 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
24411 shell_check_oom(azNextLine);
24412 memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
24413 if( p->cmOpts.bQuote ){
24414 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
24415 shell_check_oom(azQuoted);
24416 memset(azQuoted, 0, nColumn*sizeof(char*) );
24417 }
24418 abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
24419 shell_check_oom(abRowDiv);
24420 if( nColumn>p->nWidth ){
24421 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
24423 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
24424 p->nWidth = nColumn;
24425 p->actualWidth = &p->colWidth[nColumn];
24426 }
24427 memset(p->actualWidth, 0, nColumn*sizeof(int));
24428 for(i=0; i<nColumn; i++){
24429 w = p->colWidth[i];
24430 if( w<0 ) w = -w;
24431 p->actualWidth[i] = w;
24432 }
24433 for(i=0; i<nColumn; i++){
24434 const unsigned char *zNotUsed;
24435 int wx = p->colWidth[i];
24436 if( wx==0 ){
24437 wx = p->cmOpts.iWrap;
24438 }
24439 if( wx<0 ) wx = -wx;
24440 uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
24441 if( uz==0 ) uz = (u8*)"";
24442 azData[i] = translateForDisplayAndDup(p, uz, &zNotUsed, wx, bw);
24443 }
24444 do{
24445 int useNextLine = bNextLine;
24446 bNextLine = 0;
24447 if( (nRow+2)*nColumn >= nAlloc ){
24448 nAlloc *= 2;
24449 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
24450 shell_check_oom(azData);
24451 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
24452 shell_check_oom(abRowDiv);
24453 }
24454 abRowDiv[nRow] = 1;
24455 nRow++;
24456 for(i=0; i<nColumn; i++){
24457 int wx = p->colWidth[i];
24458 if( wx==0 ){
24459 wx = p->cmOpts.iWrap;
24460 }
24461 if( wx<0 ) wx = -wx;
24462 if( useNextLine ){
24463 uz = azNextLine[i];
24464 if( uz==0 ) uz = (u8*)zEmpty;
24465 }else if( p->cmOpts.bQuote ){
24466 assert( azQuoted!=0 );
24467 sqlite3_free(azQuoted[i]);
24468 azQuoted[i] = quoted_column(pStmt,i);
24469 uz = (const unsigned char*)azQuoted[i];
24470 }else{
24471 uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
24472 if( uz==0 ) uz = (u8*)zShowNull;
24473 }
24474 azData[nRow*nColumn + i]
24475 = translateForDisplayAndDup(p, uz, &azNextLine[i], wx, bw);
24476 if( azNextLine[i] ){
24477 bNextLine = 1;
24478 abRowDiv[nRow-1] = 0;
24479 bMultiLineRowExists = 1;
24480 }
24481 }
24482 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
24483 nTotal = nColumn*(nRow+1);
24484 for(i=0; i<nTotal; i++){
24485 z = azData[i];
24486 if( z==0 ) z = (char*)zEmpty;
24487 n = strlenChar(z);
24488 j = i%nColumn;
24489 if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
24490 }
24491 if( seenInterrupt ) goto columnar_end;
24492 switch( p->cMode ){
24493 case MODE_Column: {
24494 colSep = " ";
24495 rowSep = "\n";
24496 if( p->showHeader ){
24497 for(i=0; i<nColumn; i++){
24498 w = p->actualWidth[i];
24499 if( p->colWidth[i]<0 ) w = -w;
24500 utf8_width_print(p->out, w, azData[i]);
24501 sqlite3_fputs(i==nColumn-1?"\n":" ", p->out);
24502 }
24503 for(i=0; i<nColumn; i++){
24504 print_dashes(p->out, p->actualWidth[i]);
24505 sqlite3_fputs(i==nColumn-1?"\n":" ", p->out);
24506 }
24507 }
24508 break;
24509 }
24510 case MODE_Table: {
24511 colSep = " | ";
24512 rowSep = " |\n";
24513 print_row_separator(p, nColumn, "+");
24514 sqlite3_fputs("| ", p->out);
24515 for(i=0; i<nColumn; i++){
24516 w = p->actualWidth[i];
24517 n = strlenChar(azData[i]);
24518 sqlite3_fprintf(p->out, "%*s%s%*s", (w-n)/2, "",
24519 azData[i], (w-n+1)/2, "");
24520 sqlite3_fputs(i==nColumn-1?" |\n":" | ", p->out);
24521 }
24522 print_row_separator(p, nColumn, "+");
24523 break;
24524 }
24525 case MODE_Markdown: {
24526 colSep = " | ";
24527 rowSep = " |\n";
24528 sqlite3_fputs("| ", p->out);
24529 for(i=0; i<nColumn; i++){
24530 w = p->actualWidth[i];
24531 n = strlenChar(azData[i]);
24532 sqlite3_fprintf(p->out, "%*s%s%*s", (w-n)/2, "",
24533 azData[i], (w-n+1)/2, "");
24534 sqlite3_fputs(i==nColumn-1?" |\n":" | ", p->out);
24535 }
24536 print_row_separator(p, nColumn, "|");
24537 break;
24538 }
24539 case MODE_Box: {
24540 colSep = " " BOX_13 " ";
24541 rowSep = " " BOX_13 "\n";
24542 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
24543 sqlite3_fputs(BOX_13 " ", p->out);
24544 for(i=0; i<nColumn; i++){
24545 w = p->actualWidth[i];
24546 n = strlenChar(azData[i]);
24547 sqlite3_fprintf(p->out, "%*s%s%*s%s",
24548 (w-n)/2, "", azData[i], (w-n+1)/2, "",
24549 i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
24550 }
24551 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
24552 break;
24553 }
24554 }
24555 for(i=nColumn, j=0; i<nTotal; i++, j++){
24556 if( j==0 && p->cMode!=MODE_Column ){
24557 sqlite3_fputs(p->cMode==MODE_Box?BOX_13" ":"| ", p->out);
24558 }
24559 z = azData[i];
24560 if( z==0 ) z = p->nullValue;
24561 w = p->actualWidth[j];
24562 if( p->colWidth[j]<0 ) w = -w;
24564 if( j==nColumn-1 ){
24565 sqlite3_fputs(rowSep, p->out);
24566 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
24567 if( p->cMode==MODE_Table ){
24568 print_row_separator(p, nColumn, "+");
24569 }else if( p->cMode==MODE_Box ){
24570 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
24571 }else if( p->cMode==MODE_Column ){
24572 sqlite3_fputs("\n", p->out);
24573 }
24574 }
24575 j = -1;
24576 if( seenInterrupt ) goto columnar_end;
24577 }else{
24578 sqlite3_fputs(colSep, p->out);
24579 }
24580 }
24581 if( p->cMode==MODE_Table ){
24582 print_row_separator(p, nColumn, "+");
24583 }else if( p->cMode==MODE_Box ){
24584 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
24585 }
24586columnar_end:
24587 if( seenInterrupt ){
24588 sqlite3_fputs("Interrupt\n", p->out);
24589 }
24590 nData = (nRow+1)*nColumn;
24591 for(i=0; i<nData; i++){
24592 z = azData[i];
24593 if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
24594 }
24595 sqlite3_free(azData);
24596 sqlite3_free((void*)azNextLine);
24597 sqlite3_free(abRowDiv);
24598 if( azQuoted ){
24599 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
24600 sqlite3_free(azQuoted);
24601 }
24602}
24603
24604/*
24605** Run a prepared statement
24606*/
24607static void exec_prepared_stmt(
24608 ShellState *pArg, /* Pointer to ShellState */
24609 sqlite3_stmt *pStmt /* Statement to run */
24610){
24611 int rc;
24612 sqlite3_uint64 nRow = 0;
24613
24614 if( pArg->cMode==MODE_Column
24615 || pArg->cMode==MODE_Table
24616 || pArg->cMode==MODE_Box
24617 || pArg->cMode==MODE_Markdown
24618 ){
24619 exec_prepared_stmt_columnar(pArg, pStmt);
24620 return;
24621 }
24622
24623 /* perform the first step. this will tell us if we
24624 ** have a result set or not and how wide it is.
24625 */
24626 rc = sqlite3_step(pStmt);
24627 /* if we have a result set... */
24628 if( SQLITE_ROW == rc ){
24629 /* allocate space for col name ptr, value ptr, and type */
24630 int nCol = sqlite3_column_count(pStmt);
24631 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
24632 if( !pData ){
24634 }else{
24635 char **azCols = (char **)pData; /* Names of result columns */
24636 char **azVals = &azCols[nCol]; /* Results */
24637 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
24638 int i, x;
24639 assert(sizeof(int) <= sizeof(char *));
24640 /* save off ptrs to column names */
24641 for(i=0; i<nCol; i++){
24642 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
24643 }
24644 do{
24645 nRow++;
24646 /* extract the data and data types */
24647 for(i=0; i<nCol; i++){
24648 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
24649 if( x==SQLITE_BLOB
24650 && pArg
24651 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
24652 ){
24653 azVals[i] = "";
24654 }else{
24655 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
24656 }
24657 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
24658 rc = SQLITE_NOMEM;
24659 break; /* from for */
24660 }
24661 } /* end for */
24662
24663 /* if data and types extracted successfully... */
24664 if( SQLITE_ROW == rc ){
24665 /* call the supplied callback with the result row data */
24666 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
24667 rc = SQLITE_ABORT;
24668 }else{
24669 rc = sqlite3_step(pStmt);
24670 }
24671 }
24672 } while( SQLITE_ROW == rc );
24673 sqlite3_free(pData);
24674 if( pArg->cMode==MODE_Json ){
24675 sqlite3_fputs("]\n", pArg->out);
24676 }else if( pArg->cMode==MODE_Www ){
24677 sqlite3_fputs("</TABLE>\n<PRE>\n", pArg->out);
24678 }else if( pArg->cMode==MODE_Count ){
24679 char zBuf[200];
24680 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
24681 nRow, nRow!=1 ? "s" : "");
24682 printf("%s", zBuf);
24683 }
24684 }
24685 }
24686}
24687
24688#ifndef SQLITE_OMIT_VIRTUALTABLE
24689/*
24690** This function is called to process SQL if the previous shell command
24691** was ".expert". It passes the SQL in the second argument directly to
24692** the sqlite3expert object.
24693**
24694** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
24695** code. In this case, (*pzErr) may be set to point to a buffer containing
24696** an English language error message. It is the responsibility of the
24697** caller to eventually free this buffer using sqlite3_free().
24698*/
24699static int expertHandleSQL(
24700 ShellState *pState,
24701 const char *zSql,
24702 char **pzErr
24703){
24704 assert( pState->expert.pExpert );
24705 assert( pzErr==0 || *pzErr==0 );
24706 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
24707}
24708
24709/*
24710** This function is called either to silently clean up the object
24711** created by the ".expert" command (if bCancel==1), or to generate a
24712** report from it and then clean it up (if bCancel==0).
24713**
24714** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
24715** code. In this case, (*pzErr) may be set to point to a buffer containing
24716** an English language error message. It is the responsibility of the
24717** caller to eventually free this buffer using sqlite3_free().
24718*/
24719static int expertFinish(
24720 ShellState *pState,
24721 int bCancel,
24722 char **pzErr
24723){
24724 int rc = SQLITE_OK;
24725 sqlite3expert *p = pState->expert.pExpert;
24726 FILE *out = pState->out;
24727 assert( p );
24728 assert( bCancel || pzErr==0 || *pzErr==0 );
24729 if( bCancel==0 ){
24730 int bVerbose = pState->expert.bVerbose;
24731
24732 rc = sqlite3_expert_analyze(p, pzErr);
24733 if( rc==SQLITE_OK ){
24734 int nQuery = sqlite3_expert_count(p);
24735 int i;
24736
24737 if( bVerbose ){
24739 sqlite3_fputs("-- Candidates -----------------------------\n", out);
24740 sqlite3_fprintf(out, "%s\n", zCand);
24741 }
24742 for(i=0; i<nQuery; i++){
24743 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
24745 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
24746 if( zIdx==0 ) zIdx = "(no new indexes)\n";
24747 if( bVerbose ){
24748 sqlite3_fprintf(out,
24749 "-- Query %d --------------------------------\n"
24750 "%s\n\n"
24751 ,i+1, zSql);
24752 }
24753 sqlite3_fprintf(out, "%s\n%s\n", zIdx, zEQP);
24754 }
24755 }
24756 }
24758 pState->expert.pExpert = 0;
24759 return rc;
24760}
24761
24762/*
24763** Implementation of ".expert" dot command.
24764*/
24765static int expertDotCommand(
24766 ShellState *pState, /* Current shell tool state */
24767 char **azArg, /* Array of arguments passed to dot command */
24768 int nArg /* Number of entries in azArg[] */
24769){
24770 int rc = SQLITE_OK;
24771 char *zErr = 0;
24772 int i;
24773 int iSample = 0;
24774
24775 assert( pState->expert.pExpert==0 );
24776 memset(&pState->expert, 0, sizeof(ExpertInfo));
24777
24778 for(i=1; rc==SQLITE_OK && i<nArg; i++){
24779 char *z = azArg[i];
24780 int n;
24781 if( z[0]=='-' && z[1]=='-' ) z++;
24782 n = strlen30(z);
24783 if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
24784 pState->expert.bVerbose = 1;
24785 }
24786 else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
24787 if( i==(nArg-1) ){
24788 sqlite3_fprintf(stderr, "option requires an argument: %s\n", z);
24789 rc = SQLITE_ERROR;
24790 }else{
24791 iSample = (int)integerValue(azArg[++i]);
24792 if( iSample<0 || iSample>100 ){
24793 sqlite3_fprintf(stderr,"value out of range: %s\n", azArg[i]);
24794 rc = SQLITE_ERROR;
24795 }
24796 }
24797 }
24798 else{
24799 sqlite3_fprintf(stderr,"unknown option: %s\n", z);
24800 rc = SQLITE_ERROR;
24801 }
24802 }
24803
24804 if( rc==SQLITE_OK ){
24805 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
24806 if( pState->expert.pExpert==0 ){
24807 sqlite3_fprintf(stderr,
24808 "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
24809 rc = SQLITE_ERROR;
24810 }else{
24813 );
24814 }
24815 }
24816 sqlite3_free(zErr);
24817
24818 return rc;
24819}
24820#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
24821
24822/*
24823** Execute a statement or set of statements. Print
24824** any result rows/columns depending on the current mode
24825** set via the supplied callback.
24826**
24827** This is very similar to SQLite's built-in sqlite3_exec()
24828** function except it takes a slightly different callback
24829** and callback data argument.
24830*/
24831static int shell_exec(
24832 ShellState *pArg, /* Pointer to ShellState */
24833 const char *zSql, /* SQL to be evaluated */
24834 char **pzErrMsg /* Error msg written here */
24835){
24836 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
24837 int rc = SQLITE_OK; /* Return Code */
24838 int rc2;
24839 const char *zLeftover; /* Tail of unprocessed SQL */
24840 sqlite3 *db = pArg->db;
24841
24842 if( pzErrMsg ){
24843 *pzErrMsg = NULL;
24844 }
24845
24846#ifndef SQLITE_OMIT_VIRTUALTABLE
24847 if( pArg->expert.pExpert ){
24848 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
24849 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
24850 }
24851#endif
24852
24853 while( zSql[0] && (SQLITE_OK == rc) ){
24854 static const char *zStmtSql;
24855 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
24856 if( SQLITE_OK != rc ){
24857 if( pzErrMsg ){
24858 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
24859 }
24860 }else{
24861 if( !pStmt ){
24862 /* this happens for a comment or white-space */
24863 zSql = zLeftover;
24864 while( IsSpace(zSql[0]) ) zSql++;
24865 continue;
24866 }
24867 zStmtSql = sqlite3_sql(pStmt);
24868 if( zStmtSql==0 ) zStmtSql = "";
24869 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
24870
24871 /* save off the prepared statement handle and reset row count */
24872 if( pArg ){
24873 pArg->pStmt = pStmt;
24874 pArg->cnt = 0;
24875 }
24876
24877 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
24878 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
24879 sqlite3_stmt *pExplain;
24880 int triggerEQP = 0;
24881 disable_debug_trace_modes();
24883 if( pArg->autoEQP>=AUTOEQP_trigger ){
24885 }
24886 pExplain = pStmt;
24887 sqlite3_reset(pExplain);
24888 rc = sqlite3_stmt_explain(pExplain, 2);
24889 if( rc==SQLITE_OK ){
24890 bind_prepared_stmt(pArg, pExplain);
24891 while( sqlite3_step(pExplain)==SQLITE_ROW ){
24892 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
24893 int iEqpId = sqlite3_column_int(pExplain, 0);
24894 int iParentId = sqlite3_column_int(pExplain, 1);
24895 if( zEQPLine==0 ) zEQPLine = "";
24896 if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
24897 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
24898 }
24899 eqp_render(pArg, 0);
24900 }
24901 if( pArg->autoEQP>=AUTOEQP_full ){
24902 /* Also do an EXPLAIN for ".eqp full" mode */
24903 sqlite3_reset(pExplain);
24904 rc = sqlite3_stmt_explain(pExplain, 1);
24905 if( rc==SQLITE_OK ){
24906 pArg->cMode = MODE_Explain;
24907 assert( sqlite3_stmt_isexplain(pExplain)==1 );
24908 bind_prepared_stmt(pArg, pExplain);
24909 explain_data_prepare(pArg, pExplain);
24910 exec_prepared_stmt(pArg, pExplain);
24911 explain_data_delete(pArg);
24912 }
24913 }
24914 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
24916 }
24917 sqlite3_reset(pStmt);
24919 restore_debug_trace_modes();
24920 }
24921
24922 if( pArg ){
24923 int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
24924 pArg->cMode = pArg->mode;
24925 if( pArg->autoExplain ){
24926 if( bIsExplain ){
24927 pArg->cMode = MODE_Explain;
24928 }
24929 if( sqlite3_stmt_isexplain(pStmt)==2 ){
24930 pArg->cMode = MODE_EQP;
24931 }
24932 }
24933
24934 /* If the shell is currently in ".explain" mode, gather the extra
24935 ** data required to add indents to the output.*/
24936 if( pArg->cMode==MODE_Explain && bIsExplain ){
24937 explain_data_prepare(pArg, pStmt);
24938 }
24939 }
24940
24941 bind_prepared_stmt(pArg, pStmt);
24942 exec_prepared_stmt(pArg, pStmt);
24943 explain_data_delete(pArg);
24944 eqp_render(pArg, 0);
24945
24946 /* print usage stats if stats on */
24947 if( pArg && pArg->statsOn ){
24948 display_stats(db, pArg, 0);
24949 }
24950
24951 /* print loop-counters if required */
24952 if( pArg && pArg->scanstatsOn ){
24953 display_scanstats(db, pArg);
24954 }
24955
24956 /* Finalize the statement just executed. If this fails, save a
24957 ** copy of the error message. Otherwise, set zSql to point to the
24958 ** next statement to execute. */
24959 rc2 = sqlite3_finalize(pStmt);
24960 if( rc!=SQLITE_NOMEM ) rc = rc2;
24961 if( rc==SQLITE_OK ){
24962 zSql = zLeftover;
24963 while( IsSpace(zSql[0]) ) zSql++;
24964 }else if( pzErrMsg ){
24965 *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
24966 }
24967
24968 /* clear saved stmt handle */
24969 if( pArg ){
24970 pArg->pStmt = NULL;
24971 }
24972 }
24973 } /* end while */
24974
24975 return rc;
24976}
24977
24978/*
24979** Release memory previously allocated by tableColumnList().
24980*/
24981static void freeColumnList(char **azCol){
24982 int i;
24983 for(i=1; azCol[i]; i++){
24984 sqlite3_free(azCol[i]);
24985 }
24986 /* azCol[0] is a static string */
24987 sqlite3_free(azCol);
24988}
24989
24990/*
24991** Return a list of pointers to strings which are the names of all
24992** columns in table zTab. The memory to hold the names is dynamically
24993** allocated and must be released by the caller using a subsequent call
24994** to freeColumnList().
24995**
24996** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
24997** value that needs to be preserved, then azCol[0] is filled in with the
24998** name of the rowid column.
24999**
25000** The first regular column in the table is azCol[1]. The list is terminated
25001** by an entry with azCol[i]==0.
25002*/
25003static char **tableColumnList(ShellState *p, const char *zTab){
25004 char **azCol = 0;
25005 sqlite3_stmt *pStmt;
25006 char *zSql;
25007 int nCol = 0;
25008 int nAlloc = 0;
25009 int nPK = 0; /* Number of PRIMARY KEY columns seen */
25010 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
25011 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
25012 int rc;
25013
25014 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
25016 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25017 sqlite3_free(zSql);
25018 if( rc ) return 0;
25019 while( sqlite3_step(pStmt)==SQLITE_ROW ){
25020 if( nCol>=nAlloc-2 ){
25021 nAlloc = nAlloc*2 + nCol + 10;
25022 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
25023 shell_check_oom(azCol);
25024 }
25025 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
25026 shell_check_oom(azCol[nCol]);
25027 if( sqlite3_column_int(pStmt, 5) ){
25028 nPK++;
25029 if( nPK==1
25030 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
25031 "INTEGER")==0
25032 ){
25033 isIPK = 1;
25034 }else{
25035 isIPK = 0;
25036 }
25037 }
25038 }
25039 sqlite3_finalize(pStmt);
25040 if( azCol==0 ) return 0;
25041 azCol[0] = 0;
25042 azCol[nCol+1] = 0;
25043
25044 /* The decision of whether or not a rowid really needs to be preserved
25045 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
25046 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
25047 ** rowids on tables where the rowid is inaccessible because there are other
25048 ** columns in the table named "rowid", "_rowid_", and "oid".
25049 */
25050 if( preserveRowid && isIPK ){
25051 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
25052 ** might be an alias for the ROWID. But it might also be a WITHOUT ROWID
25053 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
25054 ** ROWID aliases. To distinguish these cases, check to see if
25055 ** there is a "pk" entry in "PRAGMA index_list". There will be
25056 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
25057 */
25058 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
25059 " WHERE origin='pk'", zTab);
25061 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25062 sqlite3_free(zSql);
25063 if( rc ){
25064 freeColumnList(azCol);
25065 return 0;
25066 }
25067 rc = sqlite3_step(pStmt);
25068 sqlite3_finalize(pStmt);
25069 preserveRowid = rc==SQLITE_ROW;
25070 }
25071 if( preserveRowid ){
25072 /* Only preserve the rowid if we can find a name to use for the
25073 ** rowid */
25074 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
25075 int i, j;
25076 for(j=0; j<3; j++){
25077 for(i=1; i<=nCol; i++){
25078 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
25079 }
25080 if( i>nCol ){
25081 /* At this point, we know that azRowid[j] is not the name of any
25082 ** ordinary column in the table. Verify that azRowid[j] is a valid
25083 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
25084 ** tables will fail this last check */
25085 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
25086 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
25087 break;
25088 }
25089 }
25090 }
25091 return azCol;
25092}
25093
25094/*
25095** Toggle the reverse_unordered_selects setting.
25096*/
25097static void toggleSelectOrder(sqlite3 *db){
25098 sqlite3_stmt *pStmt = 0;
25099 int iSetting = 0;
25100 char zStmt[100];
25101 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
25102 if( sqlite3_step(pStmt)==SQLITE_ROW ){
25103 iSetting = sqlite3_column_int(pStmt, 0);
25104 }
25105 sqlite3_finalize(pStmt);
25106 sqlite3_snprintf(sizeof(zStmt), zStmt,
25107 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
25108 sqlite3_exec(db, zStmt, 0, 0, 0);
25109}
25110
25111/*
25112** This is a different callback routine used for dumping the database.
25113** Each row received by this callback consists of a table name,
25114** the table type ("index" or "table") and SQL to create the table.
25115** This routine should print text sufficient to recreate the table.
25116*/
25117static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
25118 int rc;
25119 const char *zTable;
25120 const char *zType;
25121 const char *zSql;
25122 ShellState *p = (ShellState *)pArg;
25123 int dataOnly;
25124 int noSys;
25125
25126 UNUSED_PARAMETER(azNotUsed);
25127 if( nArg!=3 || azArg==0 ) return 0;
25128 zTable = azArg[0];
25129 zType = azArg[1];
25130 zSql = azArg[2];
25131 if( zTable==0 ) return 0;
25132 if( zType==0 ) return 0;
25133 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
25134 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
25135
25136 if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
25137 /* no-op */
25138 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
25139 if( !dataOnly ) sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
25140 }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
25141 return 0;
25142 }else if( dataOnly ){
25143 /* no-op */
25144 }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
25145 char *zIns;
25146 if( !p->writableSchema ){
25147 sqlite3_fputs("PRAGMA writable_schema=ON;\n", p->out);
25148 p->writableSchema = 1;
25149 }
25150 zIns = sqlite3_mprintf(
25151 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
25152 "VALUES('table','%q','%q',0,'%q');",
25153 zTable, zTable, zSql);
25155 sqlite3_fprintf(p->out, "%s\n", zIns);
25156 sqlite3_free(zIns);
25157 return 0;
25158 }else{
25159 printSchemaLine(p->out, zSql, ";\n");
25160 }
25161
25162 if( cli_strcmp(zType, "table")==0 ){
25163 ShellText sSelect;
25164 ShellText sTable;
25165 char **azCol;
25166 int i;
25167 char *savedDestTable;
25168 int savedMode;
25169
25170 azCol = tableColumnList(p, zTable);
25171 if( azCol==0 ){
25172 p->nErr++;
25173 return 0;
25174 }
25175
25176 /* Always quote the table name, even if it appears to be pure ascii,
25177 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
25178 initText(&sTable);
25179 appendText(&sTable, zTable, quoteChar(zTable));
25180 /* If preserving the rowid, add a column list after the table name.
25181 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
25182 ** instead of the usual "INSERT INTO tab VALUES(...)".
25183 */
25184 if( azCol[0] ){
25185 appendText(&sTable, "(", 0);
25186 appendText(&sTable, azCol[0], 0);
25187 for(i=1; azCol[i]; i++){
25188 appendText(&sTable, ",", 0);
25189 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
25190 }
25191 appendText(&sTable, ")", 0);
25192 }
25193
25194 /* Build an appropriate SELECT statement */
25195 initText(&sSelect);
25196 appendText(&sSelect, "SELECT ", 0);
25197 if( azCol[0] ){
25198 appendText(&sSelect, azCol[0], 0);
25199 appendText(&sSelect, ",", 0);
25200 }
25201 for(i=1; azCol[i]; i++){
25202 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
25203 if( azCol[i+1] ){
25204 appendText(&sSelect, ",", 0);
25205 }
25206 }
25207 freeColumnList(azCol);
25208 appendText(&sSelect, " FROM ", 0);
25209 appendText(&sSelect, zTable, quoteChar(zTable));
25210
25211 savedDestTable = p->zDestTable;
25212 savedMode = p->mode;
25213 p->zDestTable = sTable.z;
25215 rc = shell_exec(p, sSelect.z, 0);
25216 if( (rc&0xff)==SQLITE_CORRUPT ){
25217 sqlite3_fputs("/****** CORRUPTION ERROR *******/\n", p->out);
25218 toggleSelectOrder(p->db);
25219 shell_exec(p, sSelect.z, 0);
25220 toggleSelectOrder(p->db);
25221 }
25222 p->zDestTable = savedDestTable;
25223 p->mode = savedMode;
25224 freeText(&sTable);
25225 freeText(&sSelect);
25226 if( rc ) p->nErr++;
25227 }
25228 return 0;
25229}
25230
25231/*
25232** Run zQuery. Use dump_callback() as the callback routine so that
25233** the contents of the query are output as SQL statements.
25234**
25235** If we get a SQLITE_CORRUPT error, rerun the query after appending
25236** "ORDER BY rowid DESC" to the end.
25237*/
25238static int run_schema_dump_query(
25239 ShellState *p,
25240 const char *zQuery
25241){
25242 int rc;
25243 char *zErr = 0;
25244 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
25245 if( rc==SQLITE_CORRUPT ){
25246 char *zQ2;
25247 int len = strlen30(zQuery);
25248 sqlite3_fputs("/****** CORRUPTION ERROR *******/\n", p->out);
25249 if( zErr ){
25250 sqlite3_fprintf(p->out, "/****** %s ******/\n", zErr);
25251 sqlite3_free(zErr);
25252 zErr = 0;
25253 }
25254 zQ2 = malloc( len+100 );
25255 if( zQ2==0 ) return rc;
25256 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
25257 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
25258 if( rc ){
25259 sqlite3_fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
25260 }else{
25261 rc = SQLITE_CORRUPT;
25262 }
25263 free(zQ2);
25264 }
25265 sqlite3_free(zErr);
25266 return rc;
25267}
25268
25269/*
25270** Text of help messages.
25271**
25272** The help text for each individual command begins with a line that starts
25273** with ".". Subsequent lines are supplemental information.
25274**
25275** There must be two or more spaces between the end of the command and the
25276** start of the description of what that command does.
25277*/
25278static const char *(azHelp[]) = {
25279#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
25280 && !defined(SQLITE_SHELL_FIDDLE)
25281 ".archive ... Manage SQL archives",
25282 " Each command must have exactly one of the following options:",
25283 " -c, --create Create a new archive",
25284 " -u, --update Add or update files with changed mtime",
25285 " -i, --insert Like -u but always add even if unchanged",
25286 " -r, --remove Remove files from archive",
25287 " -t, --list List contents of archive",
25288 " -x, --extract Extract files from archive",
25289 " Optional arguments:",
25290 " -v, --verbose Print each filename as it is processed",
25291 " -f FILE, --file FILE Use archive FILE (default is current db)",
25292 " -a FILE, --append FILE Open FILE using the apndvfs VFS",
25293 " -C DIR, --directory DIR Read/extract files from directory DIR",
25294 " -g, --glob Use glob matching for names in archive",
25295 " -n, --dryrun Show the SQL that would have occurred",
25296 " Examples:",
25297 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar",
25298 " .ar -tf ARCHIVE # List members of ARCHIVE",
25299 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE",
25300 " See also:",
25301 " http://sqlite.org/cli.html#sqlite_archive_support",
25302#endif
25303#ifndef SQLITE_OMIT_AUTHORIZATION
25304 ".auth ON|OFF Show authorizer callbacks",
25305#endif
25306#ifndef SQLITE_SHELL_FIDDLE
25307 ".backup ?DB? FILE Backup DB (default \"main\") to FILE",
25308 " Options:",
25309 " --append Use the appendvfs",
25310 " --async Write to FILE without journal and fsync()",
25311#endif
25312 ".bail on|off Stop after hitting an error. Default OFF",
25313#ifndef SQLITE_SHELL_FIDDLE
25314 ".cd DIRECTORY Change the working directory to DIRECTORY",
25315#endif
25316 ".changes on|off Show number of rows changed by SQL",
25317#ifndef SQLITE_SHELL_FIDDLE
25318 ".check GLOB Fail if output since .testcase does not match",
25319 ".clone NEWDB Clone data into NEWDB from the existing database",
25320#endif
25321 ".connection [close] [#] Open or close an auxiliary database connection",
25322 ".crlf ?on|off? Whether or not to use \\r\\n line endings",
25323 ".databases List names and files of attached databases",
25324 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
25326 ".dbinfo ?DB? Show status information about the database",
25327#endif
25328 ".dbtotxt Hex dump of the database file",
25329 ".dump ?OBJECTS? Render database content as SQL",
25330 " Options:",
25331 " --data-only Output only INSERT statements",
25332 " --newlines Allow unescaped newline characters in output",
25333 " --nosys Omit system tables (ex: \"sqlite_stat1\")",
25334 " --preserve-rowids Include ROWID values in the output",
25335 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
25336 " Additional LIKE patterns can be given in subsequent arguments",
25337 ".echo on|off Turn command echo on or off",
25338 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN",
25339 " Other Modes:",
25340#ifdef SQLITE_DEBUG
25341 " test Show raw EXPLAIN QUERY PLAN output",
25342 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"",
25343#endif
25344 " trigger Like \"full\" but also show trigger bytecode",
25345#ifndef SQLITE_SHELL_FIDDLE
25346 ".excel Display the output of next command in spreadsheet",
25347 " --bom Put a UTF8 byte-order mark on intermediate file",
25348#endif
25349#ifndef SQLITE_SHELL_FIDDLE
25350 ".exit ?CODE? Exit this program with return-code CODE",
25351#endif
25352 ".expert EXPERIMENTAL. Suggest indexes for queries",
25353 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto",
25354 ".filectrl CMD ... Run various sqlite3_file_control() operations",
25355 " --schema SCHEMA Use SCHEMA instead of \"main\"",
25356 " --help Show CMD details",
25357 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables",
25358 ".headers on|off Turn display of headers on or off",
25359 ".help ?-all? ?PATTERN? Show help text for PATTERN",
25360#ifndef SQLITE_SHELL_FIDDLE
25361 ".import FILE TABLE Import data from FILE into TABLE",
25362 " Options:",
25363 " --ascii Use \\037 and \\036 as column and row separators",
25364 " --csv Use , and \\n as column and row separators",
25365 " --skip N Skip the first N rows of input",
25366 " --schema S Target table to be S.TABLE",
25367 " -v \"Verbose\" - increase auxiliary output",
25368 " Notes:",
25369 " * If TABLE does not exist, it is created. The first row of input",
25370 " determines the column names.",
25371 " * If neither --csv or --ascii are used, the input mode is derived",
25372 " from the \".mode\" output mode",
25373 " * If FILE begins with \"|\" then it is a command that generates the",
25374 " input text.",
25375#endif
25376#ifndef SQLITE_OMIT_TEST_CONTROL
25377 ",imposter INDEX TABLE Create imposter table TABLE on index INDEX",
25378#endif
25379 ".indexes ?TABLE? Show names of indexes",
25380 " If TABLE is specified, only show indexes for",
25381 " tables matching TABLE using the LIKE operator.",
25382 ".intck ?STEPS_PER_UNLOCK? Run an incremental integrity check on the db",
25383#ifdef SQLITE_ENABLE_IOTRACE
25384 ",iotrace FILE Enable I/O diagnostic logging to FILE",
25385#endif
25386 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT",
25387 ".lint OPTIONS Report potential schema issues.",
25388 " Options:",
25389 " fkey-indexes Find missing foreign key indexes",
25390#if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
25391 ".load FILE ?ENTRY? Load an extension library",
25392#endif
25393#if !defined(SQLITE_SHELL_FIDDLE)
25394 ".log FILE|on|off Turn logging on or off. FILE can be stderr/stdout",
25395#else
25396 ".log on|off Turn logging on or off.",
25397#endif
25398 ".mode ?MODE? ?OPTIONS? Set output mode",
25399 " MODE is one of:",
25400 " ascii Columns/rows delimited by 0x1F and 0x1E",
25401 " box Tables using unicode box-drawing characters",
25402 " csv Comma-separated values",
25403 " column Output in columns. (See .width)",
25404 " html HTML <table> code",
25405 " insert SQL insert statements for TABLE",
25406 " json Results in a JSON array",
25407 " line One value per line",
25408 " list Values delimited by \"|\"",
25409 " markdown Markdown table format",
25410 " qbox Shorthand for \"box --wrap 60 --quote\"",
25411 " quote Escape answers as for SQL",
25412 " table ASCII-art table",
25413 " tabs Tab-separated values",
25414 " tcl TCL list elements",
25415 " OPTIONS: (for columnar modes or insert mode):",
25416 " --escape T ctrl-char escape; T is one of: symbol, ascii, off",
25417 " --wrap N Wrap output lines to no longer than N characters",
25418 " --wordwrap B Wrap or not at word boundaries per B (on/off)",
25419 " --ww Shorthand for \"--wordwrap 1\"",
25420 " --quote Quote output text as SQL literals",
25421 " --noquote Do not quote output text",
25422 " TABLE The name of SQL table used for \"insert\" mode",
25423#ifndef SQLITE_SHELL_FIDDLE
25424 ".nonce STRING Suspend safe mode for one command if nonce matches",
25425#endif
25426 ".nullvalue STRING Use STRING in place of NULL values",
25427#ifndef SQLITE_SHELL_FIDDLE
25428 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE",
25429 " If FILE begins with '|' then open as a pipe",
25430 " --bom Put a UTF8 byte-order mark at the beginning",
25431 " -e Send output to the system text editor",
25432 " --plain Use text/plain output instead of HTML for -w option",
25433 " -w Send output as HTML to a web browser (same as \".www\")",
25434 " -x Send output as CSV to a spreadsheet (same as \".excel\")",
25435 /* Note that .open is (partially) available in WASM builds but is
25436 ** currently only intended to be used by the fiddle tool, not
25437 ** end users, so is "undocumented." */
25438 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE",
25439 " Options:",
25440 " --append Use appendvfs to append database to the end of FILE",
25441#endif
25442#ifndef SQLITE_OMIT_DESERIALIZE
25443 " --deserialize Load into memory using sqlite3_deserialize()",
25444 " --hexdb Load the output of \"dbtotxt\" as an in-memory db",
25445 " --maxsize N Maximum size for --hexdb or --deserialized database",
25446#endif
25447 " --new Initialize FILE to an empty database",
25448 " --nofollow Do not follow symbolic links",
25449 " --readonly Open FILE readonly",
25450 " --zip FILE is a ZIP archive",
25451#ifndef SQLITE_SHELL_FIDDLE
25452 ".output ?FILE? Send output to FILE or stdout if FILE is omitted",
25453 " If FILE begins with '|' then open it as a pipe.",
25454 " If FILE is 'off' then output is disabled.",
25455 " Options:",
25456 " --bom Prefix output with a UTF8 byte-order mark",
25457 " -e Send output to the system text editor",
25458 " --plain Use text/plain for -w option",
25459 " -w Send output to a web browser",
25460 " -x Send output as CSV to a spreadsheet",
25461#endif
25462 ".parameter CMD ... Manage SQL parameter bindings",
25463 " clear Erase all bindings",
25464 " init Initialize the TEMP table that holds bindings",
25465 " list List the current parameter bindings",
25466 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE",
25467 " PARAMETER should start with one of: $ : @ ?",
25468 " unset PARAMETER Remove PARAMETER from the binding table",
25469 ".print STRING... Print literal STRING",
25470#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
25471 ".progress N Invoke progress handler after every N opcodes",
25472 " --limit N Interrupt after N progress callbacks",
25473 " --once Do no more than one progress interrupt",
25474 " --quiet|-q No output except at interrupts",
25475 " --reset Reset the count for each input and interrupt",
25476#endif
25477 ".prompt MAIN CONTINUE Replace the standard prompts",
25478#ifndef SQLITE_SHELL_FIDDLE
25479 ".quit Stop interpreting input stream, exit if primary.",
25480 ".read FILE Read input from FILE or command output",
25481 " If FILE begins with \"|\", it is a command that generates the input.",
25482#endif
25484 ".recover Recover as much data as possible from corrupt db.",
25485 " --ignore-freelist Ignore pages that appear to be on db freelist",
25486 " --lost-and-found TABLE Alternative name for the lost-and-found table",
25487 " --no-rowids Do not attempt to recover rowid values",
25488 " that are not also INTEGER PRIMARY KEYs",
25489#endif
25490#ifndef SQLITE_SHELL_FIDDLE
25491 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE",
25492 ".save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)",
25493#endif
25494 ".scanstats on|off|est Turn sqlite3_stmt_scanstatus() metrics on or off",
25495 ".schema ?PATTERN? Show the CREATE statements matching PATTERN",
25496 " Options:",
25497 " --indent Try to pretty-print the schema",
25498 " --nosys Omit objects whose names start with \"sqlite_\"",
25499 ",selftest ?OPTIONS? Run tests defined in the SELFTEST table",
25500 " Options:",
25501 " --init Create a new SELFTEST table",
25502 " -v Verbose output",
25503 ".separator COL ?ROW? Change the column and row separators",
25504#if defined(SQLITE_ENABLE_SESSION)
25505 ".session ?NAME? CMD ... Create or control sessions",
25506 " Subcommands:",
25507 " attach TABLE Attach TABLE",
25508 " changeset FILE Write a changeset into FILE",
25509 " close Close one session",
25510 " enable ?BOOLEAN? Set or query the enable bit",
25511 " filter GLOB... Reject tables matching GLOBs",
25512 " indirect ?BOOLEAN? Mark or query the indirect status",
25513 " isempty Query whether the session is empty",
25514 " list List currently open session names",
25515 " open DB NAME Open a new session on DB",
25516 " patchset FILE Write a patchset into FILE",
25517 " If ?NAME? is omitted, the first defined session is used.",
25518#endif
25519 ".sha3sum ... Compute a SHA3 hash of database content",
25520 " Options:",
25521 " --schema Also hash the sqlite_schema table",
25522 " --sha3-224 Use the sha3-224 algorithm",
25523 " --sha3-256 Use the sha3-256 algorithm (default)",
25524 " --sha3-384 Use the sha3-384 algorithm",
25525 " --sha3-512 Use the sha3-512 algorithm",
25526 " Any other argument is a LIKE pattern for tables to hash",
25527#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
25528 ".shell CMD ARGS... Run CMD ARGS... in a system shell",
25529#endif
25530 ".show Show the current values for various settings",
25531 ".stats ?ARG? Show stats or turn stats on or off",
25532 " off Turn off automatic stat display",
25533 " on Turn on automatic stat display",
25534 " stmt Show statement stats",
25535 " vmstep Show the virtual machine step count only",
25536#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
25537 ".system CMD ARGS... Run CMD ARGS... in a system shell",
25538#endif
25539 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE",
25540#ifndef SQLITE_SHELL_FIDDLE
25541 ",testcase NAME Begin redirecting output to 'testcase-out.txt'",
25542#endif
25543 ",testctrl CMD ... Run various sqlite3_test_control() operations",
25544 " Run \".testctrl\" with no arguments for details",
25545 ".timeout MS Try opening locked tables for MS milliseconds",
25546 ".timer on|off Turn SQL timer on or off",
25547#ifndef SQLITE_OMIT_TRACE
25548 ".trace ?OPTIONS? Output each SQL statement as it is run",
25549 " FILE Send output to FILE",
25550 " stdout Send output to stdout",
25551 " stderr Send output to stderr",
25552 " off Disable tracing",
25553 " --expanded Expand query parameters",
25554#ifdef SQLITE_ENABLE_NORMALIZE
25555 " --normalized Normal the SQL statements",
25556#endif
25557 " --plain Show SQL as it is input",
25558 " --stmt Trace statement execution (SQLITE_TRACE_STMT)",
25559 " --profile Profile statements (SQLITE_TRACE_PROFILE)",
25560 " --row Trace each row (SQLITE_TRACE_ROW)",
25561 " --close Trace connection close (SQLITE_TRACE_CLOSE)",
25562#endif /* SQLITE_OMIT_TRACE */
25563#ifdef SQLITE_DEBUG
25564 ".unmodule NAME ... Unregister virtual table modules",
25565 " --allexcept Unregister everything except those named",
25566#endif
25567 ".version Show source, library and compiler versions",
25568 ".vfsinfo ?AUX? Information about the top-level VFS",
25569 ".vfslist List all available VFSes",
25570 ".vfsname ?AUX? Print the name of the VFS stack",
25571 ".width NUM1 NUM2 ... Set minimum column widths for columnar output",
25572 " Negative values right-justify",
25573#ifndef SQLITE_SHELL_FIDDLE
25574 ".www Display output of the next command in web browser",
25575 " --plain Show results as text/plain, not as HTML",
25576#endif
25577};
25578
25579/*
25580** Output help text for commands that match zPattern.
25581**
25582** * If zPattern is NULL, then show all documented commands, but
25583** only give a one-line summary of each.
25584**
25585** * If zPattern is "-a" or "-all" or "--all" then show all help text
25586** for all commands except undocumented commands.
25587**
25588** * If zPattern is "0" then show all help for undocumented commands.
25589** Undocumented commands begin with "," instead of "." in the azHelp[]
25590** array.
25591**
25592** * If zPattern is a prefix for one or more documented commands, then
25593** show help for those commands. If only a single command matches the
25594** prefix, show the full text of the help. If multiple commands match,
25595** Only show just the first line of each.
25596**
25597** * Otherwise, show the complete text of any documented command for which
25598** zPattern is a LIKE match for any text within that command help
25599** text.
25600**
25601** Return the number commands that match zPattern.
25602*/
25603static int showHelp(FILE *out, const char *zPattern){
25604 int i = 0;
25605 int j = 0;
25606 int n = 0;
25607 char *zPat;
25608 if( zPattern==0 ){
25609 /* Show just the first line for all help topics */
25610 zPattern = "[a-z]";
25611 }else if( cli_strcmp(zPattern,"-a")==0
25612 || cli_strcmp(zPattern,"-all")==0
25613 || cli_strcmp(zPattern,"--all")==0
25614 ){
25615 /* Show everything except undocumented commands */
25616 zPattern = ".";
25617 }else if( cli_strcmp(zPattern,"0")==0 ){
25618 /* Show complete help text of undocumented commands */
25619 int show = 0;
25620 for(i=0; i<ArraySize(azHelp); i++){
25621 if( azHelp[i][0]=='.' ){
25622 show = 0;
25623 }else if( azHelp[i][0]==',' ){
25624 show = 1;
25625 sqlite3_fprintf(out, ".%s\n", &azHelp[i][1]);
25626 n++;
25627 }else if( show ){
25628 sqlite3_fprintf(out, "%s\n", azHelp[i]);
25629 }
25630 }
25631 return n;
25632 }
25633
25634 /* Seek documented commands for which zPattern is an exact prefix */
25635 zPat = sqlite3_mprintf(".%s*", zPattern);
25637 for(i=0; i<ArraySize(azHelp); i++){
25638 if( sqlite3_strglob(zPat, azHelp[i])==0 ){
25639 sqlite3_fprintf(out, "%s\n", azHelp[i]);
25640 j = i+1;
25641 n++;
25642 }
25643 }
25644 sqlite3_free(zPat);
25645 if( n ){
25646 if( n==1 ){
25647 /* when zPattern is a prefix of exactly one command, then include
25648 ** the details of that command, which should begin at offset j */
25649 while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
25650 sqlite3_fprintf(out, "%s\n", azHelp[j]);
25651 j++;
25652 }
25653 }
25654 return n;
25655 }
25656
25657 /* Look for documented commands that contain zPattern anywhere.
25658 ** Show complete text of all documented commands that match. */
25659 zPat = sqlite3_mprintf("%%%s%%", zPattern);
25661 for(i=0; i<ArraySize(azHelp); i++){
25662 if( azHelp[i][0]==',' ){
25663 while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
25664 continue;
25665 }
25666 if( azHelp[i][0]=='.' ) j = i;
25667 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
25668 sqlite3_fprintf(out, "%s\n", azHelp[j]);
25669 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
25670 j++;
25671 sqlite3_fprintf(out, "%s\n", azHelp[j]);
25672 }
25673 i = j;
25674 n++;
25675 }
25676 }
25677 sqlite3_free(zPat);
25678 return n;
25679}
25680
25681/* Forward reference */
25682static int process_input(ShellState *p);
25683
25684/*
25685** Read the content of file zName into memory obtained from sqlite3_malloc64()
25686** and return a pointer to the buffer. The caller is responsible for freeing
25687** the memory.
25688**
25689** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
25690** read.
25691**
25692** For convenience, a nul-terminator byte is always appended to the data read
25693** from the file before the buffer is returned. This byte is not included in
25694** the final value of (*pnByte), if applicable.
25695**
25696** NULL is returned if any error is encountered. The final value of *pnByte
25697** is undefined in this case.
25698*/
25699static char *readFile(const char *zName, int *pnByte){
25700 FILE *in = sqlite3_fopen(zName, "rb");
25701 long nIn;
25702 size_t nRead;
25703 char *pBuf;
25704 int rc;
25705 if( in==0 ) return 0;
25706 rc = fseek(in, 0, SEEK_END);
25707 if( rc!=0 ){
25708 sqlite3_fprintf(stderr,"Error: '%s' not seekable\n", zName);
25709 fclose(in);
25710 return 0;
25711 }
25712 nIn = ftell(in);
25713 rewind(in);
25714 pBuf = sqlite3_malloc64( nIn+1 );
25715 if( pBuf==0 ){
25716 sqlite3_fputs("Error: out of memory\n", stderr);
25717 fclose(in);
25718 return 0;
25719 }
25720 nRead = fread(pBuf, nIn, 1, in);
25721 fclose(in);
25722 if( nRead!=1 ){
25723 sqlite3_free(pBuf);
25724 sqlite3_fprintf(stderr,"Error: cannot read '%s'\n", zName);
25725 return 0;
25726 }
25727 pBuf[nIn] = 0;
25728 if( pnByte ) *pnByte = nIn;
25729 return pBuf;
25730}
25731
25732#if defined(SQLITE_ENABLE_SESSION)
25733/*
25734** Close a single OpenSession object and release all of its associated
25735** resources.
25736*/
25737static void session_close(OpenSession *pSession){
25738 int i;
25739 sqlite3session_delete(pSession->p);
25740 sqlite3_free(pSession->zName);
25741 for(i=0; i<pSession->nFilter; i++){
25742 sqlite3_free(pSession->azFilter[i]);
25743 }
25744 sqlite3_free(pSession->azFilter);
25745 memset(pSession, 0, sizeof(OpenSession));
25746}
25747#endif
25748
25749/*
25750** Close all OpenSession objects and release all associated resources.
25751*/
25752#if defined(SQLITE_ENABLE_SESSION)
25753static void session_close_all(ShellState *p, int i){
25754 int j;
25755 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
25756 for(j=0; j<pAuxDb->nSession; j++){
25757 session_close(&pAuxDb->aSession[j]);
25758 }
25759 pAuxDb->nSession = 0;
25761#else
25762# define session_close_all(X,Y)
25763#endif
25764
25765/*
25766** Implementation of the xFilter function for an open session. Omit
25767** any tables named by ".session filter" but let all other table through.
25768*/
25769#if defined(SQLITE_ENABLE_SESSION)
25770static int session_filter(void *pCtx, const char *zTab){
25771 OpenSession *pSession = (OpenSession*)pCtx;
25772 int i;
25773 for(i=0; i<pSession->nFilter; i++){
25774 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
25775 }
25776 return 1;
25777}
25778#endif
25779
25780/*
25781** Try to deduce the type of file for zName based on its content. Return
25782** one of the SHELL_OPEN_* constants.
25783**
25784** If the file does not exist or is empty but its name looks like a ZIP
25785** archive and the dfltZip flag is true, then assume it is a ZIP archive.
25786** Otherwise, assume an ordinary database regardless of the filename if
25787** the type cannot be determined from content.
25788*/
25789int deduceDatabaseType(const char *zName, int dfltZip){
25790 FILE *f = sqlite3_fopen(zName, "rb");
25791 size_t n;
25792 int rc = SHELL_OPEN_UNSPEC;
25793 char zBuf[100];
25794 if( f==0 ){
25795 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
25796 return SHELL_OPEN_ZIPFILE;
25797 }else{
25798 return SHELL_OPEN_NORMAL;
25799 }
25800 }
25801 n = fread(zBuf, 16, 1, f);
25802 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
25803 fclose(f);
25804 return SHELL_OPEN_NORMAL;
25805 }
25806 fseek(f, -25, SEEK_END);
25807 n = fread(zBuf, 25, 1, f);
25808 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
25810 }else{
25811 fseek(f, -22, SEEK_END);
25812 n = fread(zBuf, 22, 1, f);
25813 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
25814 && zBuf[3]==0x06 ){
25815 rc = SHELL_OPEN_ZIPFILE;
25816 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
25817 rc = SHELL_OPEN_ZIPFILE;
25818 }
25819 }
25820 fclose(f);
25821 return rc;
25822}
25823
25824#ifndef SQLITE_OMIT_DESERIALIZE
25825/*
25826** Reconstruct an in-memory database using the output from the "dbtotxt"
25827** program. Read content from the file in p->aAuxDb[].zDbFilename.
25828** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
25829*/
25830static unsigned char *readHexDb(ShellState *p, int *pnData){
25831 unsigned char *a = 0;
25832 int nLine;
25833 int n = 0;
25834 int pgsz = 0;
25835 int iOffset = 0;
25836 int j, k;
25837 int rc;
25838 FILE *in;
25839 const char *zDbFilename = p->pAuxDb->zDbFilename;
25840 unsigned int x[16];
25841 char zLine[1000];
25842 if( zDbFilename ){
25843 in = sqlite3_fopen(zDbFilename, "r");
25844 if( in==0 ){
25845 sqlite3_fprintf(stderr,"cannot open \"%s\" for reading\n", zDbFilename);
25846 return 0;
25847 }
25848 nLine = 0;
25849 }else{
25850 in = p->in;
25851 nLine = p->lineno;
25852 if( in==0 ) in = stdin;
25853 }
25854 *pnData = 0;
25855 nLine++;
25856 if( sqlite3_fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
25857 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
25858 if( rc!=2 ) goto readHexDb_error;
25859 if( n<0 ) goto readHexDb_error;
25860 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
25861 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */
25862 a = sqlite3_malloc( n ? n : 1 );
25864 memset(a, 0, n);
25865 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
25866 sqlite3_fputs("invalid pagesize\n", stderr);
25867 goto readHexDb_error;
25868 }
25869 for(nLine++; sqlite3_fgets(zLine, sizeof(zLine), in)!=0; nLine++){
25870 rc = sscanf(zLine, "| page %d offset %d", &j, &k);
25871 if( rc==2 ){
25872 iOffset = k;
25873 continue;
25874 }
25875 if( cli_strncmp(zLine, "| end ", 6)==0 ){
25876 break;
25877 }
25878 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
25879 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
25880 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
25881 if( rc==17 ){
25882 k = iOffset+j;
25883 if( k+16<=n && k>=0 ){
25884 int ii;
25885 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
25886 }
25887 }
25888 }
25889 *pnData = n;
25890 if( in!=p->in ){
25891 fclose(in);
25892 }else{
25893 p->lineno = nLine;
25894 }
25895 return a;
25896
25897readHexDb_error:
25898 if( in!=p->in ){
25899 fclose(in);
25900 }else{
25901 while( sqlite3_fgets(zLine, sizeof(zLine), p->in)!=0 ){
25902 nLine++;
25903 if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
25904 }
25905 p->lineno = nLine;
25906 }
25908 sqlite3_fprintf(stderr,"Error on line %d of --hexdb input\n", nLine);
25909 return 0;
25910}
25911#endif /* SQLITE_OMIT_DESERIALIZE */
25912
25913/*
25914** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
25915*/
25916static void shellUSleepFunc(
25917 sqlite3_context *context,
25918 int argcUnused,
25919 sqlite3_value **argv
25920){
25921 int sleep = sqlite3_value_int(argv[0]);
25922 (void)argcUnused;
25923 sqlite3_sleep(sleep/1000);
25924 sqlite3_result_int(context, sleep);
25925}
25926
25927/*
25928** SQL function: shell_module_schema(X)
25929**
25930** Return a fake schema for the table-valued function or eponymous virtual
25931** table X.
25932*/
25933static void shellModuleSchema(
25934 sqlite3_context *pCtx,
25935 int nVal,
25936 sqlite3_value **apVal
25937){
25938 const char *zName;
25939 char *zFake;
25940 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
25941 FILE *pSavedLog = p->pLog;
25942 UNUSED_PARAMETER(nVal);
25943 zName = (const char*)sqlite3_value_text(apVal[0]);
25944
25945 /* Temporarily disable the ".log" when calling shellFakeSchema() because
25946 ** shellFakeSchema() might generate failures for some ephemeral virtual
25947 ** tables due to missing arguments. Example: fts4aux.
25948 ** https://sqlite.org/forum/forumpost/42fe6520b803be51 */
25949 p->pLog = 0;
25950 zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
25951 p->pLog = pSavedLog;
25952
25953 if( zFake ){
25954 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
25955 -1, sqlite3_free);
25956 free(zFake);
25957 }
25958}
25959
25960/* Flags for open_db().
25961**
25962** The default behavior of open_db() is to exit(1) if the database fails to
25963** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
25964** but still returns without calling exit.
25965**
25966** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
25967** ZIP archive if the file does not exist or is empty and its name matches
25968** the *.zip pattern.
25970#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */
25971#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */
25972
25973/*
25974** Make sure the database is open. If it is not, then open it. If
25975** the database fails to open, print an error message and exit.
25976*/
25977static void open_db(ShellState *p, int openFlags){
25978 if( p->db==0 ){
25979 const char *zDbFilename = p->pAuxDb->zDbFilename;
25981 if( zDbFilename==0 || zDbFilename[0]==0 ){
25983 }else{
25984 p->openMode = (u8)deduceDatabaseType(zDbFilename,
25985 (openFlags & OPEN_DB_ZIPFILE)!=0);
25986 }
25987 }
25988 switch( p->openMode ){
25989 case SHELL_OPEN_APPENDVFS: {
25990 sqlite3_open_v2(zDbFilename, &p->db,
25992 break;
25993 }
25994 case SHELL_OPEN_HEXDB:
25997 break;
25998 }
25999 case SHELL_OPEN_ZIPFILE: {
26000 sqlite3_open(":memory:", &p->db);
26001 break;
26002 }
26003 case SHELL_OPEN_READONLY: {
26004 sqlite3_open_v2(zDbFilename, &p->db,
26006 break;
26007 }
26008 case SHELL_OPEN_UNSPEC:
26009 case SHELL_OPEN_NORMAL: {
26010 sqlite3_open_v2(zDbFilename, &p->db,
26012 break;
26013 }
26014 }
26015 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
26016 sqlite3_fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
26017 zDbFilename, sqlite3_errmsg(p->db));
26018 if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
26019 exit(1);
26020 }
26022 sqlite3_open(":memory:", &p->db);
26023 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
26024 sqlite3_fputs("Also: unable to open substitute in-memory database.\n",
26025 stderr);
26026 exit(1);
26027 }else{
26028 sqlite3_fprintf(stderr,
26029 "Notice: using substitute in-memory database instead of \"%s\"\n",
26030 zDbFilename);
26031 }
26032 }
26033 globalDb = p->db;
26035
26036 /* Reflect the use or absence of --unsafe-testing invocation. */
26037 {
26038 int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
26041 }
26042
26043#ifndef SQLITE_OMIT_LOAD_EXTENSION
26045#endif
26052 sqlite3_base64_init(p->db, 0, 0);
26053 sqlite3_base85_init(p->db, 0, 0);
26057#ifndef SQLITE_SHELL_FIDDLE
26060#endif
26061#ifdef SQLITE_HAVE_ZLIB
26062 if( !p->bSafeModePersist ){
26063 sqlite3_zipfile_init(p->db, 0, 0);
26064 sqlite3_sqlar_init(p->db, 0, 0);
26065 }
26066#endif
26067#ifdef SQLITE_SHELL_EXTFUNCS
26068 /* Create a preprocessing mechanism for extensions to make
26069 * their own provisions for being built into the shell.
26070 * This is a short-span macro. See further below for usage.
26071 */
26072#define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
26073#define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
26074 /* Let custom-included extensions get their ..._init() called.
26075 * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
26076 * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
26077 * initialization routine to be called.
26078 */
26079 {
26080 int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
26081 /* Let custom-included extensions expose their functionality.
26082 * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
26083 * the SQL functions, virtual tables, collating sequences or
26084 * VFS's implemented by the extension to be registered.
26085 */
26086 if( irc==SQLITE_OK
26087 || irc==SQLITE_OK_LOAD_PERMANENTLY ){
26088 SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
26089 }
26090#undef SHELL_SUB_MACRO
26091#undef SHELL_SUBMACRO
26092 }
26093#endif
26094
26096 shellStrtod, 0, 0);
26098 shellDtostr, 0, 0);
26100 shellDtostr, 0, 0);
26101 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
26103 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, p,
26104 shellModuleSchema, 0, 0);
26106 shellPutsFunc, 0, 0);
26108 shellUSleepFunc, 0, 0);
26109#ifndef SQLITE_NOHAVE_SYSTEM
26111 editFunc, 0, 0);
26113 editFunc, 0, 0);
26114#endif
26115
26117 char *zSql = sqlite3_mprintf(
26118 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
26120 sqlite3_exec(p->db, zSql, 0, 0, 0);
26121 sqlite3_free(zSql);
26122 }
26123#ifndef SQLITE_OMIT_DESERIALIZE
26124 else
26126 int rc;
26127 int nData = 0;
26128 unsigned char *aData;
26130 aData = (unsigned char*)readFile(zDbFilename, &nData);
26131 }else{
26132 aData = readHexDb(p, &nData);
26133 }
26134 if( aData==0 ){
26135 return;
26136 }
26137 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
26140 if( rc ){
26141 sqlite3_fprintf(stderr,"Error: sqlite3_deserialize() returns %d\n", rc);
26142 }
26143 if( p->szMax>0 ){
26145 }
26146 }
26147#endif
26148 }
26149 if( p->db!=0 ){
26150 if( p->bSafeModePersist ){
26151 sqlite3_set_authorizer(p->db, safeModeAuth, p);
26152 }
26155 );
26156 }
26157}
26158
26159/*
26160** Attempt to close the database connection. Report errors.
26161*/
26162void close_db(sqlite3 *db){
26163 int rc = sqlite3_close(db);
26164 if( rc ){
26165 sqlite3_fprintf(stderr,
26166 "Error: sqlite3_close() returns %d: %s\n", rc, sqlite3_errmsg(db));
26167 }
26168}
26169
26170#if (HAVE_READLINE || HAVE_EDITLINE)
26171 && !defined(SQLITE_OMIT_READLINE_COMPLETION)
26172/*
26173** Readline completion callbacks
26174*/
26175static char *readline_completion_generator(const char *text, int state){
26176 static sqlite3_stmt *pStmt = 0;
26177 char *zRet;
26178 if( state==0 ){
26179 char *zSql;
26180 sqlite3_finalize(pStmt);
26181 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
26182 " FROM completion(%Q) ORDER BY 1", text);
26183 shell_check_oom(zSql);
26184 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
26185 sqlite3_free(zSql);
26186 }
26187 if( sqlite3_step(pStmt)==SQLITE_ROW ){
26188 const char *z = (const char*)sqlite3_column_text(pStmt,0);
26189 zRet = z ? strdup(z) : 0;
26190 }else{
26191 sqlite3_finalize(pStmt);
26192 pStmt = 0;
26193 zRet = 0;
26194 }
26195 return zRet;
26196}
26197static char **readline_completion(const char *zText, int iStart, int iEnd){
26198 (void)iStart;
26199 (void)iEnd;
26200 rl_attempted_completion_over = 1;
26201 return rl_completion_matches(zText, readline_completion_generator);
26202}
26203
26204#elif HAVE_LINENOISE
26205/*
26206** Linenoise completion callback. Note that the 3rd argument is from
26207** the "msteveb" version of linenoise, not the "antirez" version.
26208*/
26209static void linenoise_completion(
26210 const char *zLine,
26211 linenoiseCompletions *lc
26212#if HAVE_LINENOISE==2
26213 ,void *pUserData
26214#endif
26215){
26216 i64 nLine = strlen(zLine);
26217 i64 i, iStart;
26218 sqlite3_stmt *pStmt = 0;
26219 char *zSql;
26220 char zBuf[1000];
26221
26222#if HAVE_LINENOISE==2
26223 UNUSED_PARAMETER(pUserData);
26224#endif
26225 if( nLine>(i64)sizeof(zBuf)-30 ) return;
26226 if( zLine[0]=='.' || zLine[0]=='#') return;
26227 for(i=nLine-1; i>=0 && (IsAlnum(zLine[i]) || zLine[i]=='_'); i--){}
26228 if( i==nLine-1 ) return;
26229 iStart = i+1;
26230 memcpy(zBuf, zLine, iStart);
26231 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
26232 " FROM completion(%Q,%Q) ORDER BY 1",
26233 &zLine[iStart], zLine);
26234 shell_check_oom(zSql);
26235 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
26236 sqlite3_free(zSql);
26237 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
26238 while( sqlite3_step(pStmt)==SQLITE_ROW ){
26239 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
26240 int nCompletion = sqlite3_column_bytes(pStmt, 0);
26241 if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
26242 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
26243 linenoiseAddCompletion(lc, zBuf);
26244 }
26245 }
26246 sqlite3_finalize(pStmt);
26247}
26248#endif
26249
26250/*
26251** Do C-language style dequoting.
26252**
26253** \a -> alarm
26254** \b -> backspace
26255** \t -> tab
26256** \n -> newline
26257** \v -> vertical tab
26258** \f -> form feed
26259** \r -> carriage return
26260** \s -> space
26261** \" -> "
26262** \' -> '
26263** \\ -> backslash
26264** \NNN -> ascii character NNN in octal
26265** \xHH -> ascii character HH in hexadecimal
26266*/
26267static void resolve_backslashes(char *z){
26268 int i, j;
26269 char c;
26270 while( *z && *z!='\\' ) z++;
26271 for(i=j=0; (c = z[i])!=0; i++, j++){
26272 if( c=='\\' && z[i+1]!=0 ){
26273 c = z[++i];
26274 if( c=='a' ){
26275 c = '\a';
26276 }else if( c=='b' ){
26277 c = '\b';
26278 }else if( c=='t' ){
26279 c = '\t';
26280 }else if( c=='n' ){
26281 c = '\n';
26282 }else if( c=='v' ){
26283 c = '\v';
26284 }else if( c=='f' ){
26285 c = '\f';
26286 }else if( c=='r' ){
26287 c = '\r';
26288 }else if( c=='"' ){
26289 c = '"';
26290 }else if( c=='\'' ){
26291 c = '\'';
26292 }else if( c=='\\' ){
26293 c = '\\';
26294 }else if( c=='x' ){
26295 int nhd = 0, hdv;
26296 u8 hv = 0;
26297 while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
26298 hv = (u8)((hv<<4)|hdv);
26299 ++nhd;
26300 }
26301 i += nhd;
26302 c = (u8)hv;
26303 }else if( c>='0' && c<='7' ){
26304 c -= '0';
26305 if( z[i+1]>='0' && z[i+1]<='7' ){
26306 i++;
26307 c = (c<<3) + z[i] - '0';
26308 if( z[i+1]>='0' && z[i+1]<='7' ){
26309 i++;
26310 c = (c<<3) + z[i] - '0';
26311 }
26312 }
26313 }
26314 }
26315 z[j] = c;
26316 }
26317 if( j<i ) z[j] = 0;
26318}
26319
26320/*
26321** Interpret zArg as either an integer or a boolean value. Return 1 or 0
26322** for TRUE and FALSE. Return the integer value if appropriate.
26323*/
26324static int booleanValue(const char *zArg){
26325 int i;
26326 if( zArg[0]=='0' && zArg[1]=='x' ){
26327 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
26328 }else{
26329 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
26330 }
26331 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
26332 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
26333 return 1;
26334 }
26335 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
26336 return 0;
26337 }
26338 sqlite3_fprintf(stderr,
26339 "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", zArg);
26340 return 0;
26341}
26342
26343/*
26344** Set or clear a shell flag according to a boolean value.
26345*/
26346static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
26347 if( booleanValue(zArg) ){
26348 ShellSetFlag(p, mFlag);
26349 }else{
26350 ShellClearFlag(p, mFlag);
26351 }
26352}
26353
26354/*
26355** Close an output file, assuming it is not stderr or stdout
26356*/
26357static void output_file_close(FILE *f){
26358 if( f && f!=stdout && f!=stderr ) fclose(f);
26359}
26360
26361/*
26362** Try to open an output file. The names "stdout" and "stderr" are
26363** recognized and do the right thing. NULL is returned if the output
26364** filename is "off".
26365*/
26366static FILE *output_file_open(const char *zFile){
26367 FILE *f;
26368 if( cli_strcmp(zFile,"stdout")==0 ){
26369 f = stdout;
26370 }else if( cli_strcmp(zFile, "stderr")==0 ){
26371 f = stderr;
26372 }else if( cli_strcmp(zFile, "off")==0 ){
26373 f = 0;
26374 }else{
26375 f = sqlite3_fopen(zFile, "w");
26376 if( f==0 ){
26377 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zFile);
26378 }
26379 }
26380 return f;
26381}
26382
26383#ifndef SQLITE_OMIT_TRACE
26384/*
26385** A routine for handling output from sqlite3_trace().
26386*/
26387static int sql_trace_callback(
26388 unsigned mType, /* The trace type */
26389 void *pArg, /* The ShellState pointer */
26390 void *pP, /* Usually a pointer to sqlite_stmt */
26391 void *pX /* Auxiliary output */
26392){
26393 ShellState *p = (ShellState*)pArg;
26394 sqlite3_stmt *pStmt;
26395 const char *zSql;
26396 i64 nSql;
26397 if( p->traceOut==0 ) return 0;
26398 if( mType==SQLITE_TRACE_CLOSE ){
26399 sputz(p->traceOut, "-- closing database connection\n");
26400 return 0;
26401 }
26402 if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
26403 zSql = (const char*)pX;
26404 }else{
26405 pStmt = (sqlite3_stmt*)pP;
26406 switch( p->eTraceType ){
26407 case SHELL_TRACE_EXPANDED: {
26408 zSql = sqlite3_expanded_sql(pStmt);
26409 break;
26410 }
26411#ifdef SQLITE_ENABLE_NORMALIZE
26412 case SHELL_TRACE_NORMALIZED: {
26413 zSql = sqlite3_normalized_sql(pStmt);
26414 break;
26415 }
26416#endif
26417 default: {
26418 zSql = sqlite3_sql(pStmt);
26419 break;
26420 }
26421 }
26422 }
26423 if( zSql==0 ) return 0;
26424 nSql = strlen(zSql);
26425 if( nSql>1000000000 ) nSql = 1000000000;
26426 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
26427 switch( mType ){
26428 case SQLITE_TRACE_ROW:
26429 case SQLITE_TRACE_STMT: {
26430 sqlite3_fprintf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
26431 break;
26432 }
26433 case SQLITE_TRACE_PROFILE: {
26434 sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
26435 sqlite3_fprintf(p->traceOut,
26436 "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
26437 break;
26438 }
26439 }
26440 return 0;
26441}
26442#endif
26443
26444/*
26445** A no-op routine that runs with the ".breakpoint" doc-command. This is
26446** a useful spot to set a debugger breakpoint.
26447**
26448** This routine does not do anything practical. The code are there simply
26449** to prevent the compiler from optimizing this routine out.
26450*/
26451static void test_breakpoint(void){
26452 static unsigned int nCall = 0;
26453 if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
26454}
26455
26456/*
26457** An object used to read a CSV and other files for import.
26459typedef struct ImportCtx ImportCtx;
26460struct ImportCtx {
26461 const char *zFile; /* Name of the input file */
26462 FILE *in; /* Read the CSV text from this input stream */
26463 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */
26464 char *z; /* Accumulated text for a field */
26465 int n; /* Number of bytes in z */
26466 int nAlloc; /* Space allocated for z[] */
26467 int nLine; /* Current line number */
26468 int nRow; /* Number of rows imported */
26469 int nErr; /* Number of errors encountered */
26470 int bNotFirst; /* True if one or more bytes already read */
26471 int cTerm; /* Character that terminated the most recent field */
26472 int cColSep; /* The column separator character. (Usually ",") */
26473 int cRowSep; /* The row separator character. (Usually "\n") */
26474};
26476/* Clean up resourced used by an ImportCtx */
26477static void import_cleanup(ImportCtx *p){
26478 if( p->in!=0 && p->xCloser!=0 ){
26479 p->xCloser(p->in);
26480 p->in = 0;
26481 }
26482 sqlite3_free(p->z);
26483 p->z = 0;
26484}
26486/* Append a single byte to z[] */
26487static void import_append_char(ImportCtx *p, int c){
26488 if( p->n+1>=p->nAlloc ){
26489 p->nAlloc += p->nAlloc + 100;
26490 p->z = sqlite3_realloc64(p->z, p->nAlloc);
26492 }
26493 p->z[p->n++] = (char)c;
26494}
26495
26496/* Read a single field of CSV text. Compatible with rfc4180 and extended
26497** with the option of having a separator other than ",".
26498**
26499** + Input comes from p->in.
26500** + Store results in p->z of length p->n. Space to hold p->z comes
26501** from sqlite3_malloc64().
26502** + Use p->cSep as the column separator. The default is ",".
26503** + Use p->rSep as the row separator. The default is "\n".
26504** + Keep track of the line number in p->nLine.
26505** + Store the character that terminates the field in p->cTerm. Store
26506** EOF on end-of-file.
26507** + Report syntax errors on stderr
26508*/
26509static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
26510 int c;
26511 int cSep = (u8)p->cColSep;
26512 int rSep = (u8)p->cRowSep;
26513 p->n = 0;
26514 c = fgetc(p->in);
26515 if( c==EOF || seenInterrupt ){
26516 p->cTerm = EOF;
26517 return 0;
26518 }
26519 if( c=='"' ){
26520 int pc, ppc;
26521 int startLine = p->nLine;
26522 int cQuote = c;
26523 pc = ppc = 0;
26524 while( 1 ){
26525 c = fgetc(p->in);
26526 if( c==rSep ) p->nLine++;
26527 if( c==cQuote ){
26528 if( pc==cQuote ){
26529 pc = 0;
26530 continue;
26531 }
26532 }
26533 if( (c==cSep && pc==cQuote)
26534 || (c==rSep && pc==cQuote)
26535 || (c==rSep && pc=='\r' && ppc==cQuote)
26536 || (c==EOF && pc==cQuote)
26537 ){
26538 do{ p->n--; }while( p->z[p->n]!=cQuote );
26539 p->cTerm = c;
26540 break;
26541 }
26542 if( pc==cQuote && c!='\r' ){
26543 sqlite3_fprintf(stderr,"%s:%d: unescaped %c character\n",
26544 p->zFile, p->nLine, cQuote);
26545 }
26546 if( c==EOF ){
26547 sqlite3_fprintf(stderr,"%s:%d: unterminated %c-quoted field\n",
26548 p->zFile, startLine, cQuote);
26549 p->cTerm = c;
26550 break;
26551 }
26552 import_append_char(p, c);
26553 ppc = pc;
26554 pc = c;
26555 }
26556 }else{
26557 /* If this is the first field being parsed and it begins with the
26558 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
26559 if( (c&0xff)==0xef && p->bNotFirst==0 ){
26560 import_append_char(p, c);
26561 c = fgetc(p->in);
26562 if( (c&0xff)==0xbb ){
26563 import_append_char(p, c);
26564 c = fgetc(p->in);
26565 if( (c&0xff)==0xbf ){
26566 p->bNotFirst = 1;
26567 p->n = 0;
26568 return csv_read_one_field(p);
26569 }
26570 }
26571 }
26572 while( c!=EOF && c!=cSep && c!=rSep ){
26573 import_append_char(p, c);
26574 c = fgetc(p->in);
26575 }
26576 if( c==rSep ){
26577 p->nLine++;
26578 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
26579 }
26580 p->cTerm = c;
26581 }
26582 if( p->z ) p->z[p->n] = 0;
26583 p->bNotFirst = 1;
26584 return p->z;
26585}
26586
26587/* Read a single field of ASCII delimited text.
26588**
26589** + Input comes from p->in.
26590** + Store results in p->z of length p->n. Space to hold p->z comes
26591** from sqlite3_malloc64().
26592** + Use p->cSep as the column separator. The default is "\x1F".
26593** + Use p->rSep as the row separator. The default is "\x1E".
26594** + Keep track of the row number in p->nLine.
26595** + Store the character that terminates the field in p->cTerm. Store
26596** EOF on end-of-file.
26597** + Report syntax errors on stderr
26598*/
26599static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
26600 int c;
26601 int cSep = (u8)p->cColSep;
26602 int rSep = (u8)p->cRowSep;
26603 p->n = 0;
26604 c = fgetc(p->in);
26605 if( c==EOF || seenInterrupt ){
26606 p->cTerm = EOF;
26607 return 0;
26608 }
26609 while( c!=EOF && c!=cSep && c!=rSep ){
26610 import_append_char(p, c);
26611 c = fgetc(p->in);
26612 }
26613 if( c==rSep ){
26614 p->nLine++;
26615 }
26616 p->cTerm = c;
26617 if( p->z ) p->z[p->n] = 0;
26618 return p->z;
26619}
26620
26621/*
26622** Try to transfer data for table zTable. If an error is seen while
26623** moving forward, try to go backwards. The backwards movement won't
26624** work for WITHOUT ROWID tables.
26625*/
26626static void tryToCloneData(
26627 ShellState *p,
26628 sqlite3 *newDb,
26629 const char *zTable
26630){
26631 sqlite3_stmt *pQuery = 0;
26632 sqlite3_stmt *pInsert = 0;
26633 char *zQuery = 0;
26634 char *zInsert = 0;
26635 int rc;
26636 int i, j, n;
26637 int nTable = strlen30(zTable);
26638 int k = 0;
26639 int cnt = 0;
26640 const int spinRate = 10000;
26641
26642 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
26643 shell_check_oom(zQuery);
26644 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
26645 if( rc ){
26646 sqlite3_fprintf(stderr,"Error %d: %s on [%s]\n",
26648 goto end_data_xfer;
26649 }
26650 n = sqlite3_column_count(pQuery);
26651 zInsert = sqlite3_malloc64(200 + nTable + n*3);
26652 shell_check_oom(zInsert);
26653 sqlite3_snprintf(200+nTable,zInsert,
26654 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
26655 i = strlen30(zInsert);
26656 for(j=1; j<n; j++){
26657 memcpy(zInsert+i, ",?", 2);
26658 i += 2;
26659 }
26660 memcpy(zInsert+i, ");", 3);
26661 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
26662 if( rc ){
26663 sqlite3_fprintf(stderr,"Error %d: %s on [%s]\n",
26664 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), zInsert);
26665 goto end_data_xfer;
26666 }
26667 for(k=0; k<2; k++){
26668 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
26669 for(i=0; i<n; i++){
26670 switch( sqlite3_column_type(pQuery, i) ){
26671 case SQLITE_NULL: {
26672 sqlite3_bind_null(pInsert, i+1);
26673 break;
26674 }
26675 case SQLITE_INTEGER: {
26677 break;
26678 }
26679 case SQLITE_FLOAT: {
26681 break;
26682 }
26683 case SQLITE_TEXT: {
26684 sqlite3_bind_text(pInsert, i+1,
26685 (const char*)sqlite3_column_text(pQuery,i),
26686 -1, SQLITE_STATIC);
26687 break;
26688 }
26689 case SQLITE_BLOB: {
26693 break;
26694 }
26695 }
26696 } /* End for */
26697 rc = sqlite3_step(pInsert);
26698 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
26699 sqlite3_fprintf(stderr,"Error %d: %s\n",
26701 }
26702 sqlite3_reset(pInsert);
26703 cnt++;
26704 if( (cnt%spinRate)==0 ){
26705 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
26706 fflush(stdout);
26707 }
26708 } /* End while */
26709 if( rc==SQLITE_DONE ) break;
26710 sqlite3_finalize(pQuery);
26711 sqlite3_free(zQuery);
26712 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
26713 zTable);
26714 shell_check_oom(zQuery);
26715 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
26716 if( rc ){
26717 sqlite3_fprintf(stderr,"Warning: cannot step \"%s\" backwards", zTable);
26718 break;
26719 }
26720 } /* End for(k=0...) */
26721
26722end_data_xfer:
26723 sqlite3_finalize(pQuery);
26724 sqlite3_finalize(pInsert);
26725 sqlite3_free(zQuery);
26726 sqlite3_free(zInsert);
26727}
26728
26729
26730/*
26731** Try to transfer all rows of the schema that match zWhere. For
26732** each row, invoke xForEach() on the object defined by that row.
26733** If an error is encountered while moving forward through the
26734** sqlite_schema table, try again moving backwards.
26735*/
26736static void tryToCloneSchema(
26737 ShellState *p,
26738 sqlite3 *newDb,
26739 const char *zWhere,
26740 void (*xForEach)(ShellState*,sqlite3*,const char*)
26741){
26742 sqlite3_stmt *pQuery = 0;
26743 char *zQuery = 0;
26744 int rc;
26745 const unsigned char *zName;
26746 const unsigned char *zSql;
26747 char *zErrMsg = 0;
26748
26749 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
26750 " WHERE %s ORDER BY rowid ASC", zWhere);
26751 shell_check_oom(zQuery);
26752 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
26753 if( rc ){
26754 sqlite3_fprintf(stderr,
26755 "Error: (%d) %s on [%s]\n", sqlite3_extended_errcode(p->db),
26756 sqlite3_errmsg(p->db), zQuery);
26757 goto end_schema_xfer;
26758 }
26759 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
26760 zName = sqlite3_column_text(pQuery, 0);
26761 zSql = sqlite3_column_text(pQuery, 1);
26762 if( zName==0 || zSql==0 ) continue;
26763 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
26764 sqlite3_fprintf(stdout, "%s... ", zName); fflush(stdout);
26765 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
26766 if( zErrMsg ){
26767 sqlite3_fprintf(stderr,"Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
26768 sqlite3_free(zErrMsg);
26769 zErrMsg = 0;
26770 }
26771 }
26772 if( xForEach ){
26773 xForEach(p, newDb, (const char*)zName);
26774 }
26775 sputz(stdout, "done\n");
26776 }
26777 if( rc!=SQLITE_DONE ){
26778 sqlite3_finalize(pQuery);
26779 sqlite3_free(zQuery);
26780 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
26781 " WHERE %s ORDER BY rowid DESC", zWhere);
26782 shell_check_oom(zQuery);
26783 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
26784 if( rc ){
26785 sqlite3_fprintf(stderr,"Error: (%d) %s on [%s]\n",
26787 goto end_schema_xfer;
26788 }
26789 while( sqlite3_step(pQuery)==SQLITE_ROW ){
26790 zName = sqlite3_column_text(pQuery, 0);
26791 zSql = sqlite3_column_text(pQuery, 1);
26792 if( zName==0 || zSql==0 ) continue;
26793 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
26794 sqlite3_fprintf(stdout, "%s... ", zName); fflush(stdout);
26795 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
26796 if( zErrMsg ){
26797 sqlite3_fprintf(stderr,"Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
26798 sqlite3_free(zErrMsg);
26799 zErrMsg = 0;
26800 }
26801 if( xForEach ){
26802 xForEach(p, newDb, (const char*)zName);
26803 }
26804 sputz(stdout, "done\n");
26805 }
26806 }
26807end_schema_xfer:
26808 sqlite3_finalize(pQuery);
26809 sqlite3_free(zQuery);
26810}
26811
26812/*
26813** Open a new database file named "zNewDb". Try to recover as much information
26814** as possible out of the main database (which might be corrupt) and write it
26815** into zNewDb.
26816*/
26817static void tryToClone(ShellState *p, const char *zNewDb){
26818 int rc;
26819 sqlite3 *newDb = 0;
26820 if( access(zNewDb,0)==0 ){
26821 sqlite3_fprintf(stderr,"File \"%s\" already exists.\n", zNewDb);
26822 return;
26823 }
26824 rc = sqlite3_open(zNewDb, &newDb);
26825 if( rc ){
26826 sqlite3_fprintf(stderr,
26827 "Cannot create output database: %s\n", sqlite3_errmsg(newDb));
26828 }else{
26829 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
26830 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
26831 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
26832 tryToCloneSchema(p, newDb, "type!='table'", 0);
26833 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
26834 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
26835 }
26836 close_db(newDb);
26837}
26838
26839#ifndef SQLITE_SHELL_FIDDLE
26840/*
26841** Change the output stream (file or pipe or console) to something else.
26842*/
26843static void output_redir(ShellState *p, FILE *pfNew){
26844 if( p->out != stdout ){
26845 sqlite3_fputs("Output already redirected.\n", stderr);
26846 }else{
26847 p->out = pfNew;
26848 setCrlfMode(p);
26849 if( p->mode==MODE_Www ){
26850 sqlite3_fputs(
26851 "<!DOCTYPE html>\n"
26852 "<HTML><BODY><PRE>\n",
26853 p->out
26854 );
26855 }
26856 }
26857}
26858
26859/*
26860** Change the output file back to stdout.
26861**
26862** If the p->doXdgOpen flag is set, that means the output was being
26863** redirected to a temporary file named by p->zTempFile. In that case,
26864** launch start/open/xdg-open on that temporary file.
26865*/
26866static void output_reset(ShellState *p){
26867 if( p->outfile[0]=='|' ){
26868#ifndef SQLITE_OMIT_POPEN
26869 pclose(p->out);
26870#endif
26871 }else{
26872 if( p->mode==MODE_Www ){
26873 sqlite3_fputs("</PRE></BODY></HTML>\n", p->out);
26874 }
26875 output_file_close(p->out);
26876#ifndef SQLITE_NOHAVE_SYSTEM
26877 if( p->doXdgOpen ){
26878 const char *zXdgOpenCmd =
26879#if defined(_WIN32)
26880 "start";
26881#elif defined(__APPLE__)
26882 "open";
26883#else
26884 "xdg-open";
26885#endif
26886 char *zCmd;
26887 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
26888 if( system(zCmd) ){
26889 sqlite3_fprintf(stderr,"Failed: [%s]\n", zCmd);
26890 }else{
26891 /* Give the start/open/xdg-open command some time to get
26892 ** going before we continue, and potential delete the
26893 ** p->zTempFile data file out from under it */
26894 sqlite3_sleep(2000);
26895 }
26896 sqlite3_free(zCmd);
26897 outputModePop(p);
26898 p->doXdgOpen = 0;
26899 }
26900#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
26901 }
26902 p->outfile[0] = 0;
26903 p->out = stdout;
26904 setCrlfMode(p);
26905}
26906#else
26907# define output_redir(SS,pfO)
26908# define output_reset(SS)
26909#endif
26910
26911/*
26912** Run an SQL command and return the single integer result.
26913*/
26914static int db_int(sqlite3 *db, const char *zSql, ...){
26915 sqlite3_stmt *pStmt;
26916 int res = 0;
26917 char *z;
26918 va_list ap;
26919 va_start(ap, zSql);
26920 z = sqlite3_vmprintf(zSql, ap);
26921 va_end(ap);
26922 sqlite3_prepare_v2(db, z, -1, &pStmt, 0);
26923 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
26924 res = sqlite3_column_int(pStmt,0);
26925 }
26926 sqlite3_finalize(pStmt);
26928 return res;
26929}
26930
26932/*
26933** Convert a 2-byte or 4-byte big-endian integer into a native integer
26934*/
26935static unsigned int get2byteInt(unsigned char *a){
26936 return (a[0]<<8) + a[1];
26937}
26938static unsigned int get4byteInt(unsigned char *a){
26939 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
26940}
26941
26942/*
26943** Implementation of the ".dbinfo" command.
26944**
26945** Return 1 on error, 2 to exit, and 0 otherwise.
26946*/
26947static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
26948 static const struct { const char *zName; int ofst; } aField[] = {
26949 { "file change counter:", 24 },
26950 { "database page count:", 28 },
26951 { "freelist page count:", 36 },
26952 { "schema cookie:", 40 },
26953 { "schema format:", 44 },
26954 { "default cache size:", 48 },
26955 { "autovacuum top root:", 52 },
26956 { "incremental vacuum:", 64 },
26957 { "text encoding:", 56 },
26958 { "user version:", 60 },
26959 { "application id:", 68 },
26960 { "software version:", 96 },
26961 };
26962 static const struct { const char *zName; const char *zSql; } aQuery[] = {
26963 { "number of tables:",
26964 "SELECT count(*) FROM %s WHERE type='table'" },
26965 { "number of indexes:",
26966 "SELECT count(*) FROM %s WHERE type='index'" },
26967 { "number of triggers:",
26968 "SELECT count(*) FROM %s WHERE type='trigger'" },
26969 { "number of views:",
26970 "SELECT count(*) FROM %s WHERE type='view'" },
26971 { "schema size:",
26972 "SELECT total(length(sql)) FROM %s" },
26973 };
26974 int i, rc;
26975 unsigned iDataVersion;
26976 char *zSchemaTab;
26977 char *zDb = nArg>=2 ? azArg[1] : "main";
26978 sqlite3_stmt *pStmt = 0;
26979 unsigned char aHdr[100];
26980 open_db(p, 0);
26981 if( p->db==0 ) return 1;
26982 rc = sqlite3_prepare_v2(p->db,
26983 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
26984 -1, &pStmt, 0);
26985 if( rc ){
26986 sqlite3_fprintf(stderr,"error: %s\n", sqlite3_errmsg(p->db));
26987 sqlite3_finalize(pStmt);
26988 return 1;
26989 }
26990 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
26991 if( sqlite3_step(pStmt)==SQLITE_ROW
26992 && sqlite3_column_bytes(pStmt,0)>100
26993 ){
26994 const u8 *pb = sqlite3_column_blob(pStmt,0);
26995 shell_check_oom(pb);
26996 memcpy(aHdr, pb, 100);
26997 sqlite3_finalize(pStmt);
26998 }else{
26999 sqlite3_fputs("unable to read database header\n", stderr);
27000 sqlite3_finalize(pStmt);
27001 return 1;
27002 }
27003 i = get2byteInt(aHdr+16);
27004 if( i==1 ) i = 65536;
27005 sqlite3_fprintf(p->out, "%-20s %d\n", "database page size:", i);
27006 sqlite3_fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
27007 sqlite3_fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
27008 sqlite3_fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
27009 for(i=0; i<ArraySize(aField); i++){
27010 int ofst = aField[i].ofst;
27011 unsigned int val = get4byteInt(aHdr + ofst);
27012 sqlite3_fprintf(p->out, "%-20s %u", aField[i].zName, val);
27013 switch( ofst ){
27014 case 56: {
27015 if( val==1 ) sqlite3_fputs(" (utf8)", p->out);
27016 if( val==2 ) sqlite3_fputs(" (utf16le)", p->out);
27017 if( val==3 ) sqlite3_fputs(" (utf16be)", p->out);
27018 }
27019 }
27020 sqlite3_fputs("\n", p->out);
27021 }
27022 if( zDb==0 ){
27023 zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
27024 }else if( cli_strcmp(zDb,"temp")==0 ){
27025 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
27026 }else{
27027 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
27028 }
27029 for(i=0; i<ArraySize(aQuery); i++){
27030 int val = db_int(p->db, aQuery[i].zSql, zSchemaTab);
27031 sqlite3_fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
27032 }
27033 sqlite3_free(zSchemaTab);
27034 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
27035 sqlite3_fprintf(p->out, "%-20s %u\n", "data version", iDataVersion);
27036 return 0;
27037}
27038#endif /* SQLITE_SHELL_HAVE_RECOVER */
27039
27040/*
27041** Implementation of the ".dbtotxt" command.
27042**
27043** Return 1 on error, 2 to exit, and 0 otherwise.
27044*/
27045static int shell_dbtotxt_command(ShellState *p, int nArg, char **azArg){
27046 sqlite3_stmt *pStmt = 0;
27047 sqlite3_int64 nPage = 0;
27048 int pgSz = 0;
27049 const char *zTail;
27050 char *zName = 0;
27051 int rc, i, j;
27052 unsigned char bShow[256]; /* Characters ok to display */
27053
27054 UNUSED_PARAMETER(nArg);
27055 UNUSED_PARAMETER(azArg);
27056 memset(bShow, '.', sizeof(bShow));
27057 for(i=' '; i<='~'; i++){
27058 if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = (unsigned char)i;
27059 }
27060 rc = sqlite3_prepare_v2(p->db, "PRAGMA page_size", -1, &pStmt, 0);
27061 if( rc ) goto dbtotxt_error;
27062 rc = 0;
27063 if( sqlite3_step(pStmt)!=SQLITE_ROW ) goto dbtotxt_error;
27064 pgSz = sqlite3_column_int(pStmt, 0);
27065 sqlite3_finalize(pStmt);
27066 pStmt = 0;
27067 if( pgSz<512 || pgSz>65536 || (pgSz&(pgSz-1))!=0 ) goto dbtotxt_error;
27068 rc = sqlite3_prepare_v2(p->db, "PRAGMA page_count", -1, &pStmt, 0);
27069 if( rc ) goto dbtotxt_error;
27070 rc = 0;
27071 if( sqlite3_step(pStmt)!=SQLITE_ROW ) goto dbtotxt_error;
27072 nPage = sqlite3_column_int64(pStmt, 0);
27073 sqlite3_finalize(pStmt);
27074 pStmt = 0;
27075 if( nPage<1 ) goto dbtotxt_error;
27076 rc = sqlite3_prepare_v2(p->db, "PRAGMA databases", -1, &pStmt, 0);
27077 if( rc ) goto dbtotxt_error;
27078 if( sqlite3_step(pStmt)!=SQLITE_ROW ){
27079 zTail = "unk.db";
27080 }else{
27081 const char *zFilename = (const char*)sqlite3_column_text(pStmt, 2);
27082 if( zFilename==0 || zFilename[0]==0 ) zFilename = "unk.db";
27083 zTail = strrchr(zFilename, '/');
27084#if defined(_WIN32)
27085 if( zTail==0 ) zTail = strrchr(zFilename, '\\');
27086#endif
27087 }
27088 zName = strdup(zTail);
27089 shell_check_oom(zName);
27090 sqlite3_fprintf(p->out, "| size %lld pagesize %d filename %s\n",
27091 nPage*pgSz, pgSz, zName);
27092 sqlite3_finalize(pStmt);
27093 pStmt = 0;
27095 "SELECT pgno, data FROM sqlite_dbpage ORDER BY pgno", -1, &pStmt, 0);
27096 if( rc ) goto dbtotxt_error;
27097 while( sqlite3_step(pStmt)==SQLITE_ROW ){
27099 const u8 *aData = sqlite3_column_blob(pStmt, 1);
27100 int seenPageLabel = 0;
27101 for(i=0; i<pgSz; i+=16){
27102 const u8 *aLine = aData+i;
27103 for(j=0; j<16 && aLine[j]==0; j++){}
27104 if( j==16 ) continue;
27105 if( !seenPageLabel ){
27106 sqlite3_fprintf(p->out, "| page %lld offset %lld\n",pgno,(pgno-1)*pgSz);
27107 seenPageLabel = 1;
27108 }
27109 sqlite3_fprintf(p->out, "| %5d:", i);
27110 for(j=0; j<16; j++) sqlite3_fprintf(p->out, " %02x", aLine[j]);
27111 sqlite3_fprintf(p->out, " ");
27112 for(j=0; j<16; j++){
27113 unsigned char c = (unsigned char)aLine[j];
27114 sqlite3_fprintf(p->out, "%c", bShow[c]);
27115 }
27116 sqlite3_fprintf(p->out, "\n");
27117 }
27118 }
27119 sqlite3_finalize(pStmt);
27120 sqlite3_fprintf(p->out, "| end %s\n", zName);
27121 free(zName);
27122 return 0;
27123
27124dbtotxt_error:
27125 if( rc ){
27126 sqlite3_fprintf(stderr, "ERROR: %s\n", sqlite3_errmsg(p->db));
27127 }
27128 sqlite3_finalize(pStmt);
27129 free(zName);
27130 return 1;
27131}
27132
27133/*
27134** Print the given string as an error message.
27135*/
27136static void shellEmitError(const char *zErr){
27137 sqlite3_fprintf(stderr,"Error: %s\n", zErr);
27138}
27139/*
27140** Print the current sqlite3_errmsg() value to stderr and return 1.
27141*/
27142static int shellDatabaseError(sqlite3 *db){
27143 shellEmitError(sqlite3_errmsg(db));
27144 return 1;
27145}
27146
27147/*
27148** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
27149** if they match and FALSE (0) if they do not match.
27150**
27151** Globbing rules:
27152**
27153** '*' Matches any sequence of zero or more characters.
27154**
27155** '?' Matches exactly one character.
27156**
27157** [...] Matches one character from the enclosed list of
27158** characters.
27159**
27160** [^...] Matches one character not in the enclosed list.
27161**
27162** '#' Matches any sequence of one or more digits with an
27163** optional + or - sign in front
27164**
27165** ' ' Any span of whitespace matches any other span of
27166** whitespace.
27167**
27168** Extra whitespace at the end of z[] is ignored.
27169*/
27170static int testcase_glob(const char *zGlob, const char *z){
27171 int c, c2;
27172 int invert;
27173 int seen;
27174
27175 while( (c = (*(zGlob++)))!=0 ){
27176 if( IsSpace(c) ){
27177 if( !IsSpace(*z) ) return 0;
27178 while( IsSpace(*zGlob) ) zGlob++;
27179 while( IsSpace(*z) ) z++;
27180 }else if( c=='*' ){
27181 while( (c=(*(zGlob++))) == '*' || c=='?' ){
27182 if( c=='?' && (*(z++))==0 ) return 0;
27183 }
27184 if( c==0 ){
27185 return 1;
27186 }else if( c=='[' ){
27187 while( *z && testcase_glob(zGlob-1,z)==0 ){
27188 z++;
27189 }
27190 return (*z)!=0;
27191 }
27192 while( (c2 = (*(z++)))!=0 ){
27193 while( c2!=c ){
27194 c2 = *(z++);
27195 if( c2==0 ) return 0;
27196 }
27197 if( testcase_glob(zGlob,z) ) return 1;
27198 }
27199 return 0;
27200 }else if( c=='?' ){
27201 if( (*(z++))==0 ) return 0;
27202 }else if( c=='[' ){
27203 int prior_c = 0;
27204 seen = 0;
27205 invert = 0;
27206 c = *(z++);
27207 if( c==0 ) return 0;
27208 c2 = *(zGlob++);
27209 if( c2=='^' ){
27210 invert = 1;
27211 c2 = *(zGlob++);
27212 }
27213 if( c2==']' ){
27214 if( c==']' ) seen = 1;
27215 c2 = *(zGlob++);
27216 }
27217 while( c2 && c2!=']' ){
27218 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
27219 c2 = *(zGlob++);
27220 if( c>=prior_c && c<=c2 ) seen = 1;
27221 prior_c = 0;
27222 }else{
27223 if( c==c2 ){
27224 seen = 1;
27225 }
27226 prior_c = c2;
27227 }
27228 c2 = *(zGlob++);
27229 }
27230 if( c2==0 || (seen ^ invert)==0 ) return 0;
27231 }else if( c=='#' ){
27232 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
27233 if( !IsDigit(z[0]) ) return 0;
27234 z++;
27235 while( IsDigit(z[0]) ){ z++; }
27236 }else{
27237 if( c!=(*(z++)) ) return 0;
27238 }
27239 }
27240 while( IsSpace(*z) ){ z++; }
27241 return *z==0;
27242}
27243
27244
27245/*
27246** Compare the string as a command-line option with either one or two
27247** initial "-" characters.
27248*/
27249static int optionMatch(const char *zStr, const char *zOpt){
27250 if( zStr[0]!='-' ) return 0;
27251 zStr++;
27252 if( zStr[0]=='-' ) zStr++;
27253 return cli_strcmp(zStr, zOpt)==0;
27254}
27255
27256/*
27257** Delete a file.
27258*/
27259int shellDeleteFile(const char *zFilename){
27260 int rc;
27261#ifdef _WIN32
27262 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
27263 rc = _wunlink(z);
27265#else
27266 rc = unlink(zFilename);
27267#endif
27268 return rc;
27269}
27270
27271/*
27272** Try to delete the temporary file (if there is one) and free the
27273** memory used to hold the name of the temp file.
27274*/
27275static void clearTempFile(ShellState *p){
27276 if( p->zTempFile==0 ) return;
27277 if( p->doXdgOpen ) return;
27278 if( shellDeleteFile(p->zTempFile) ) return;
27280 p->zTempFile = 0;
27281}
27282
27283/*
27284** Create a new temp file name with the given suffix.
27285*/
27286static void newTempFile(ShellState *p, const char *zSuffix){
27287 clearTempFile(p);
27289 p->zTempFile = 0;
27290 if( p->db ){
27292 }
27293 if( p->zTempFile==0 ){
27294 /* If p->db is an in-memory database then the TEMPFILENAME file-control
27295 ** will not work and we will need to fallback to guessing */
27296 char *zTemp;
27298 sqlite3_randomness(sizeof(r), &r);
27299 zTemp = getenv("TEMP");
27300 if( zTemp==0 ) zTemp = getenv("TMP");
27301 if( zTemp==0 ){
27302#ifdef _WIN32
27303 zTemp = "\\tmp";
27304#else
27305 zTemp = "/tmp";
27306#endif
27307 }
27308 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
27309 }else{
27310 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
27311 }
27313}
27314
27315
27316/*
27317** The implementation of SQL scalar function fkey_collate_clause(), used
27318** by the ".lint fkey-indexes" command. This scalar function is always
27319** called with four arguments - the parent table name, the parent column name,
27320** the child table name and the child column name.
27321**
27322** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
27323**
27324** If either of the named tables or columns do not exist, this function
27325** returns an empty string. An empty string is also returned if both tables
27326** and columns exist but have the same default collation sequence. Or,
27327** if both exist but the default collation sequences are different, this
27328** function returns the string " COLLATE <parent-collation>", where
27329** <parent-collation> is the default collation sequence of the parent column.
27330*/
27331static void shellFkeyCollateClause(
27332 sqlite3_context *pCtx,
27333 int nVal,
27334 sqlite3_value **apVal
27335){
27336 sqlite3 *db = sqlite3_context_db_handle(pCtx);
27337 const char *zParent;
27338 const char *zParentCol;
27339 const char *zParentSeq;
27340 const char *zChild;
27341 const char *zChildCol;
27342 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
27343 int rc;
27344
27345 assert( nVal==4 );
27346 zParent = (const char*)sqlite3_value_text(apVal[0]);
27347 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
27348 zChild = (const char*)sqlite3_value_text(apVal[2]);
27349 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
27350
27353 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
27354 );
27355 if( rc==SQLITE_OK ){
27357 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
27358 );
27359 }
27360
27361 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
27362 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
27365 }
27366}
27367
27368
27369/*
27370** The implementation of dot-command ".lint fkey-indexes".
27371*/
27372static int lintFkeyIndexes(
27373 ShellState *pState, /* Current shell tool state */
27374 char **azArg, /* Array of arguments passed to dot command */
27375 int nArg /* Number of entries in azArg[] */
27376){
27377 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
27378 int bVerbose = 0; /* If -verbose is present */
27379 int bGroupByParent = 0; /* If -groupbyparent is present */
27380 int i; /* To iterate through azArg[] */
27381 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
27382 int rc; /* Return code */
27383 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
27384 FILE *out = pState->out; /* Send output here */
27385
27386 /*
27387 ** This SELECT statement returns one row for each foreign key constraint
27388 ** in the schema of the main database. The column values are:
27389 **
27390 ** 0. The text of an SQL statement similar to:
27391 **
27392 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
27393 **
27394 ** This SELECT is similar to the one that the foreign keys implementation
27395 ** needs to run internally on child tables. If there is an index that can
27396 ** be used to optimize this query, then it can also be used by the FK
27397 ** implementation to optimize DELETE or UPDATE statements on the parent
27398 ** table.
27399 **
27400 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
27401 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
27402 ** contains an index that can be used to optimize the query.
27403 **
27404 ** 2. Human readable text that describes the child table and columns. e.g.
27405 **
27406 ** "child_table(child_key1, child_key2)"
27407 **
27408 ** 3. Human readable text that describes the parent table and columns. e.g.
27409 **
27410 ** "parent_table(parent_key1, parent_key2)"
27411 **
27412 ** 4. A full CREATE INDEX statement for an index that could be used to
27413 ** optimize DELETE or UPDATE statements on the parent table. e.g.
27414 **
27415 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
27416 **
27417 ** 5. The name of the parent table.
27418 **
27419 ** These six values are used by the C logic below to generate the report.
27420 */
27421 const char *zSql =
27422 "SELECT "
27423 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
27424 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
27425 " || fkey_collate_clause("
27426 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
27427 ", "
27428 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('"
27429 " || group_concat('*=?', ' AND ') || ')'"
27430 ", "
27431 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
27432 ", "
27433 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
27434 ", "
27435 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
27436 " || ' ON ' || quote(s.name) || '('"
27437 " || group_concat(quote(f.[from]) ||"
27438 " fkey_collate_clause("
27439 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
27440 " || ');'"
27441 ", "
27442 " f.[table] "
27443 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
27444 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
27445 "GROUP BY s.name, f.id "
27446 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
27447 ;
27448 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
27449
27450 for(i=2; i<nArg; i++){
27451 int n = strlen30(azArg[i]);
27452 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
27453 bVerbose = 1;
27454 }
27455 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
27456 bGroupByParent = 1;
27457 zIndent = " ";
27458 }
27459 else{
27460 sqlite3_fprintf(stderr,
27461 "Usage: %s %s ?-verbose? ?-groupbyparent?\n", azArg[0], azArg[1]);
27462 return SQLITE_ERROR;
27463 }
27464 }
27465
27466 /* Register the fkey_collate_clause() SQL function */
27467 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
27468 0, shellFkeyCollateClause, 0, 0
27469 );
27470
27471
27472 if( rc==SQLITE_OK ){
27473 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
27474 }
27475 if( rc==SQLITE_OK ){
27476 sqlite3_bind_int(pSql, 1, bGroupByParent);
27477 }
27478
27479 if( rc==SQLITE_OK ){
27480 int rc2;
27481 char *zPrev = 0;
27482 while( SQLITE_ROW==sqlite3_step(pSql) ){
27483 int res = -1;
27484 sqlite3_stmt *pExplain = 0;
27485 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
27486 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
27487 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
27488 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
27489 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
27490 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
27491
27492 if( zEQP==0 ) continue;
27493 if( zGlob==0 ) continue;
27494 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
27495 if( rc!=SQLITE_OK ) break;
27496 if( SQLITE_ROW==sqlite3_step(pExplain) ){
27497 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
27498 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan)
27499 || 0==sqlite3_strglob(zGlobIPK, zPlan));
27500 }
27501 rc = sqlite3_finalize(pExplain);
27502 if( rc!=SQLITE_OK ) break;
27503
27504 if( res<0 ){
27505 sqlite3_fputs("Error: internal error", stderr);
27506 break;
27507 }else{
27508 if( bGroupByParent
27509 && (bVerbose || res==0)
27510 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
27511 ){
27512 sqlite3_fprintf(out, "-- Parent table %s\n", zParent);
27513 sqlite3_free(zPrev);
27514 zPrev = sqlite3_mprintf("%s", zParent);
27515 }
27516
27517 if( res==0 ){
27518 sqlite3_fprintf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
27519 }else if( bVerbose ){
27520 sqlite3_fprintf(out,
27521 "%s/* no extra indexes required for %s -> %s */\n",
27522 zIndent, zFrom, zTarget
27523 );
27524 }
27525 }
27526 }
27527 sqlite3_free(zPrev);
27528
27529 if( rc!=SQLITE_OK ){
27530 sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
27531 }
27532
27533 rc2 = sqlite3_finalize(pSql);
27534 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
27535 rc = rc2;
27536 sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
27537 }
27538 }else{
27539 sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
27540 }
27541
27542 return rc;
27543}
27544
27545/*
27546** Implementation of ".lint" dot command.
27547*/
27548static int lintDotCommand(
27549 ShellState *pState, /* Current shell tool state */
27550 char **azArg, /* Array of arguments passed to dot command */
27551 int nArg /* Number of entries in azArg[] */
27552){
27553 int n;
27554 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
27555 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
27556 return lintFkeyIndexes(pState, azArg, nArg);
27557
27558 usage:
27559 sqlite3_fprintf(stderr,"Usage %s sub-command ?switches...?\n", azArg[0]);
27560 sqlite3_fprintf(stderr, "Where sub-commands are:\n");
27561 sqlite3_fprintf(stderr, " fkey-indexes\n");
27562 return SQLITE_ERROR;
27564
27565static void shellPrepare(
27566 sqlite3 *db,
27567 int *pRc,
27568 const char *zSql,
27569 sqlite3_stmt **ppStmt
27570){
27571 *ppStmt = 0;
27572 if( *pRc==SQLITE_OK ){
27573 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
27574 if( rc!=SQLITE_OK ){
27575 sqlite3_fprintf(stderr,
27576 "sql error: %s (%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db));
27577 *pRc = rc;
27578 }
27579 }
27580}
27581
27582/*
27583** Create a prepared statement using printf-style arguments for the SQL.
27584*/
27585static void shellPreparePrintf(
27586 sqlite3 *db,
27587 int *pRc,
27588 sqlite3_stmt **ppStmt,
27589 const char *zFmt,
27590 ...
27591){
27592 *ppStmt = 0;
27593 if( *pRc==SQLITE_OK ){
27594 va_list ap;
27595 char *z;
27596 va_start(ap, zFmt);
27597 z = sqlite3_vmprintf(zFmt, ap);
27598 va_end(ap);
27599 if( z==0 ){
27600 *pRc = SQLITE_NOMEM;
27601 }else{
27602 shellPrepare(db, pRc, z, ppStmt);
27604 }
27605 }
27606}
27607
27608/*
27609** Finalize the prepared statement created using shellPreparePrintf().
27610*/
27611static void shellFinalize(
27612 int *pRc,
27613 sqlite3_stmt *pStmt
27614){
27615 if( pStmt ){
27616 sqlite3 *db = sqlite3_db_handle(pStmt);
27617 int rc = sqlite3_finalize(pStmt);
27618 if( *pRc==SQLITE_OK ){
27619 if( rc!=SQLITE_OK ){
27620 sqlite3_fprintf(stderr,"SQL error: %s\n", sqlite3_errmsg(db));
27621 }
27622 *pRc = rc;
27623 }
27624 }
27625}
27626
27627#if !defined SQLITE_OMIT_VIRTUALTABLE
27628/* Reset the prepared statement created using shellPreparePrintf().
27629**
27630** This routine is could be marked "static". But it is not always used,
27631** depending on compile-time options. By omitting the "static", we avoid
27632** nuisance compiler warnings about "defined but not used".
27633*/
27634void shellReset(
27635 int *pRc,
27636 sqlite3_stmt *pStmt
27637){
27638 int rc = sqlite3_reset(pStmt);
27639 if( *pRc==SQLITE_OK ){
27640 if( rc!=SQLITE_OK ){
27641 sqlite3 *db = sqlite3_db_handle(pStmt);
27642 sqlite3_fprintf(stderr,"SQL error: %s\n", sqlite3_errmsg(db));
27643 }
27644 *pRc = rc;
27645 }
27646}
27647#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
27648
27649#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
27650/******************************************************************************
27651** The ".archive" or ".ar" command.
27652*/
27653/*
27654** Structure representing a single ".ar" command.
27655*/
27656typedef struct ArCommand ArCommand;
27657struct ArCommand {
27658 u8 eCmd; /* An AR_CMD_* value */
27659 u8 bVerbose; /* True if --verbose */
27660 u8 bZip; /* True if the archive is a ZIP */
27661 u8 bDryRun; /* True if --dry-run */
27662 u8 bAppend; /* True if --append */
27663 u8 bGlob; /* True if --glob */
27664 u8 fromCmdLine; /* Run from -A instead of .archive */
27665 int nArg; /* Number of command arguments */
27666 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
27667 const char *zFile; /* --file argument, or NULL */
27668 const char *zDir; /* --directory argument, or NULL */
27669 char **azArg; /* Array of command arguments */
27670 ShellState *p; /* Shell state */
27671 FILE *out; /* Output to this stream */
27672 sqlite3 *db; /* Database containing the archive */
27673};
27674
27675/*
27676** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
27677*/
27678static int arUsage(FILE *f){
27679 showHelp(f,"archive");
27680 return SQLITE_ERROR;
27681}
27682
27683/*
27684** Print an error message for the .ar command to stderr and return
27685** SQLITE_ERROR.
27686*/
27687static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
27688 va_list ap;
27689 char *z;
27690 va_start(ap, zFmt);
27691 z = sqlite3_vmprintf(zFmt, ap);
27692 va_end(ap);
27693 shellEmitError(z);
27694 if( pAr->fromCmdLine ){
27695 sqlite3_fputs("Use \"-A\" for more help\n", stderr);
27696 }else{
27697 sqlite3_fputs("Use \".archive --help\" for more help\n", stderr);
27698 }
27699 sqlite3_free(z);
27700 return SQLITE_ERROR;
27701}
27702
27703/*
27704** Values for ArCommand.eCmd.
27705*/
27706#define AR_CMD_CREATE 1
27707#define AR_CMD_UPDATE 2
27708#define AR_CMD_INSERT 3
27709#define AR_CMD_EXTRACT 4
27710#define AR_CMD_LIST 5
27711#define AR_CMD_HELP 6
27712#define AR_CMD_REMOVE 7
27713
27714/*
27715** Other (non-command) switches.
27716*/
27717#define AR_SWITCH_VERBOSE 8
27718#define AR_SWITCH_FILE 9
27719#define AR_SWITCH_DIRECTORY 10
27720#define AR_SWITCH_APPEND 11
27721#define AR_SWITCH_DRYRUN 12
27722#define AR_SWITCH_GLOB 13
27723
27724static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
27725 switch( eSwitch ){
27726 case AR_CMD_CREATE:
27727 case AR_CMD_EXTRACT:
27728 case AR_CMD_LIST:
27729 case AR_CMD_REMOVE:
27730 case AR_CMD_UPDATE:
27731 case AR_CMD_INSERT:
27732 case AR_CMD_HELP:
27733 if( pAr->eCmd ){
27734 return arErrorMsg(pAr, "multiple command options");
27735 }
27736 pAr->eCmd = eSwitch;
27737 break;
27738
27739 case AR_SWITCH_DRYRUN:
27740 pAr->bDryRun = 1;
27741 break;
27742 case AR_SWITCH_GLOB:
27743 pAr->bGlob = 1;
27744 break;
27745 case AR_SWITCH_VERBOSE:
27746 pAr->bVerbose = 1;
27747 break;
27748 case AR_SWITCH_APPEND:
27749 pAr->bAppend = 1;
27750 deliberate_fall_through; /* FALLTHRU */
27751 case AR_SWITCH_FILE:
27752 pAr->zFile = zArg;
27753 break;
27754 case AR_SWITCH_DIRECTORY:
27755 pAr->zDir = zArg;
27756 break;
27757 }
27758
27759 return SQLITE_OK;
27760}
27761
27762/*
27763** Parse the command line for an ".ar" command. The results are written into
27764** structure (*pAr). SQLITE_OK is returned if the command line is parsed
27765** successfully, otherwise an error message is written to stderr and
27766** SQLITE_ERROR returned.
27767*/
27768static int arParseCommand(
27769 char **azArg, /* Array of arguments passed to dot command */
27770 int nArg, /* Number of entries in azArg[] */
27771 ArCommand *pAr /* Populate this object */
27772){
27773 struct ArSwitch {
27774 const char *zLong;
27775 char cShort;
27776 u8 eSwitch;
27777 u8 bArg;
27778 } aSwitch[] = {
27779 { "create", 'c', AR_CMD_CREATE, 0 },
27780 { "extract", 'x', AR_CMD_EXTRACT, 0 },
27781 { "insert", 'i', AR_CMD_INSERT, 0 },
27782 { "list", 't', AR_CMD_LIST, 0 },
27783 { "remove", 'r', AR_CMD_REMOVE, 0 },
27784 { "update", 'u', AR_CMD_UPDATE, 0 },
27785 { "help", 'h', AR_CMD_HELP, 0 },
27786 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
27787 { "file", 'f', AR_SWITCH_FILE, 1 },
27788 { "append", 'a', AR_SWITCH_APPEND, 1 },
27789 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
27790 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
27791 { "glob", 'g', AR_SWITCH_GLOB, 0 },
27792 };
27793 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
27794 struct ArSwitch *pEnd = &aSwitch[nSwitch];
27795
27796 if( nArg<=1 ){
27797 sqlite3_fprintf(stderr, "Wrong number of arguments. Usage:\n");
27798 return arUsage(stderr);
27799 }else{
27800 char *z = azArg[1];
27801 if( z[0]!='-' ){
27802 /* Traditional style [tar] invocation */
27803 int i;
27804 int iArg = 2;
27805 for(i=0; z[i]; i++){
27806 const char *zArg = 0;
27807 struct ArSwitch *pOpt;
27808 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
27809 if( z[i]==pOpt->cShort ) break;
27810 }
27811 if( pOpt==pEnd ){
27812 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
27813 }
27814 if( pOpt->bArg ){
27815 if( iArg>=nArg ){
27816 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
27817 }
27818 zArg = azArg[iArg++];
27819 }
27820 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
27821 }
27822 pAr->nArg = nArg-iArg;
27823 if( pAr->nArg>0 ){
27824 pAr->azArg = &azArg[iArg];
27825 }
27826 }else{
27827 /* Non-traditional invocation */
27828 int iArg;
27829 for(iArg=1; iArg<nArg; iArg++){
27830 int n;
27831 z = azArg[iArg];
27832 if( z[0]!='-' ){
27833 /* All remaining command line words are command arguments. */
27834 pAr->azArg = &azArg[iArg];
27835 pAr->nArg = nArg-iArg;
27836 break;
27837 }
27838 n = strlen30(z);
27839
27840 if( z[1]!='-' ){
27841 int i;
27842 /* One or more short options */
27843 for(i=1; i<n; i++){
27844 const char *zArg = 0;
27845 struct ArSwitch *pOpt;
27846 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
27847 if( z[i]==pOpt->cShort ) break;
27848 }
27849 if( pOpt==pEnd ){
27850 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
27851 }
27852 if( pOpt->bArg ){
27853 if( i<(n-1) ){
27854 zArg = &z[i+1];
27855 i = n;
27856 }else{
27857 if( iArg>=(nArg-1) ){
27858 return arErrorMsg(pAr, "option requires an argument: %c",
27859 z[i]);
27860 }
27861 zArg = azArg[++iArg];
27862 }
27863 }
27864 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
27865 }
27866 }else if( z[2]=='\0' ){
27867 /* A -- option, indicating that all remaining command line words
27868 ** are command arguments. */
27869 pAr->azArg = &azArg[iArg+1];
27870 pAr->nArg = nArg-iArg-1;
27871 break;
27872 }else{
27873 /* A long option */
27874 const char *zArg = 0; /* Argument for option, if any */
27875 struct ArSwitch *pMatch = 0; /* Matching option */
27876 struct ArSwitch *pOpt; /* Iterator */
27877 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
27878 const char *zLong = pOpt->zLong;
27879 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
27880 if( pMatch ){
27881 return arErrorMsg(pAr, "ambiguous option: %s",z);
27882 }else{
27883 pMatch = pOpt;
27884 }
27885 }
27886 }
27887
27888 if( pMatch==0 ){
27889 return arErrorMsg(pAr, "unrecognized option: %s", z);
27890 }
27891 if( pMatch->bArg ){
27892 if( iArg>=(nArg-1) ){
27893 return arErrorMsg(pAr, "option requires an argument: %s", z);
27894 }
27895 zArg = azArg[++iArg];
27896 }
27897 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
27898 }
27899 }
27900 }
27901 }
27902 if( pAr->eCmd==0 ){
27903 sqlite3_fprintf(stderr, "Required argument missing. Usage:\n");
27904 return arUsage(stderr);
27905 }
27906 return SQLITE_OK;
27907}
27908
27909/*
27910** This function assumes that all arguments within the ArCommand.azArg[]
27911** array refer to archive members, as for the --extract, --list or --remove
27912** commands. It checks that each of them are "present". If any specified
27913** file is not present in the archive, an error is printed to stderr and an
27914** error code returned. Otherwise, if all specified arguments are present
27915** in the archive, SQLITE_OK is returned. Here, "present" means either an
27916** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
27917** when pAr->bGlob is true.
27918**
27919** This function strips any trailing '/' characters from each argument.
27920** This is consistent with the way the [tar] command seems to work on
27921** Linux.
27922*/
27923static int arCheckEntries(ArCommand *pAr){
27924 int rc = SQLITE_OK;
27925 if( pAr->nArg ){
27926 int i, j;
27927 sqlite3_stmt *pTest = 0;
27928 const char *zSel = (pAr->bGlob)
27929 ? "SELECT name FROM %s WHERE glob($name,name)"
27930 : "SELECT name FROM %s WHERE name=$name";
27931
27932 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
27933 j = sqlite3_bind_parameter_index(pTest, "$name");
27934 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
27935 char *z = pAr->azArg[i];
27936 int n = strlen30(z);
27937 int bOk = 0;
27938 while( n>0 && z[n-1]=='/' ) n--;
27939 z[n] = '\0';
27940 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
27941 if( SQLITE_ROW==sqlite3_step(pTest) ){
27942 bOk = 1;
27943 }
27944 shellReset(&rc, pTest);
27945 if( rc==SQLITE_OK && bOk==0 ){
27946 sqlite3_fprintf(stderr,"not found in archive: %s\n", z);
27947 rc = SQLITE_ERROR;
27948 }
27949 }
27950 shellFinalize(&rc, pTest);
27951 }
27952 return rc;
27953}
27954
27955/*
27956** Format a WHERE clause that can be used against the "sqlar" table to
27957** identify all archive members that match the command arguments held
27958** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
27959** The caller is responsible for eventually calling sqlite3_free() on
27960** any non-NULL (*pzWhere) value. Here, "match" means strict equality
27961** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
27962*/
27963static void arWhereClause(
27964 int *pRc,
27965 ArCommand *pAr,
27966 char **pzWhere /* OUT: New WHERE clause */
27967){
27968 char *zWhere = 0;
27969 const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
27970 if( *pRc==SQLITE_OK ){
27971 if( pAr->nArg==0 ){
27972 zWhere = sqlite3_mprintf("1");
27973 }else{
27974 int i;
27975 const char *zSep = "";
27976 for(i=0; i<pAr->nArg; i++){
27977 const char *z = pAr->azArg[i];
27978 zWhere = sqlite3_mprintf(
27979 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
27980 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
27981 );
27982 if( zWhere==0 ){
27983 *pRc = SQLITE_NOMEM;
27984 break;
27985 }
27986 zSep = " OR ";
27987 }
27988 }
27989 }
27990 *pzWhere = zWhere;
27991}
27992
27993/*
27994** Implementation of .ar "lisT" command.
27995*/
27996static int arListCommand(ArCommand *pAr){
27997 const char *zSql = "SELECT %s FROM %s WHERE %s";
27998 const char *azCols[] = {
27999 "name",
28000 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
28001 };
28002
28003 char *zWhere = 0;
28004 sqlite3_stmt *pSql = 0;
28005 int rc;
28006
28007 rc = arCheckEntries(pAr);
28008 arWhereClause(&rc, pAr, &zWhere);
28009
28010 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
28011 pAr->zSrcTable, zWhere);
28012 if( pAr->bDryRun ){
28013 sqlite3_fprintf(pAr->out, "%s\n", sqlite3_sql(pSql));
28014 }else{
28015 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
28016 if( pAr->bVerbose ){
28017 sqlite3_fprintf(pAr->out, "%s % 10d %s %s\n",
28018 sqlite3_column_text(pSql, 0), sqlite3_column_int(pSql, 1),
28019 sqlite3_column_text(pSql, 2),sqlite3_column_text(pSql, 3));
28020 }else{
28021 sqlite3_fprintf(pAr->out, "%s\n", sqlite3_column_text(pSql, 0));
28022 }
28023 }
28024 }
28025 shellFinalize(&rc, pSql);
28026 sqlite3_free(zWhere);
28027 return rc;
28028}
28029
28030/*
28031** Implementation of .ar "Remove" command.
28032*/
28033static int arRemoveCommand(ArCommand *pAr){
28034 int rc = 0;
28035 char *zSql = 0;
28036 char *zWhere = 0;
28037
28038 if( pAr->nArg ){
28039 /* Verify that args actually exist within the archive before proceeding.
28040 ** And formulate a WHERE clause to match them. */
28041 rc = arCheckEntries(pAr);
28042 arWhereClause(&rc, pAr, &zWhere);
28043 }
28044 if( rc==SQLITE_OK ){
28045 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
28046 pAr->zSrcTable, zWhere);
28047 if( pAr->bDryRun ){
28048 sqlite3_fprintf(pAr->out, "%s\n", zSql);
28049 }else{
28050 char *zErr = 0;
28051 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
28052 if( rc==SQLITE_OK ){
28053 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
28054 if( rc!=SQLITE_OK ){
28055 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
28056 }else{
28057 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
28058 }
28059 }
28060 if( zErr ){
28061 sqlite3_fprintf(stdout, "ERROR: %s\n", zErr); /* stdout? */
28062 sqlite3_free(zErr);
28063 }
28064 }
28065 }
28066 sqlite3_free(zWhere);
28067 sqlite3_free(zSql);
28068 return rc;
28069}
28070
28071/*
28072** Implementation of .ar "eXtract" command.
28073*/
28074static int arExtractCommand(ArCommand *pAr){
28075 const char *zSql1 =
28076 "SELECT "
28077 " ($dir || name),"
28078 " writefile(($dir || name), %s, mode, mtime) "
28079 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
28080 " AND name NOT GLOB '*..[/\\]*'";
28081
28082 const char *azExtraArg[] = {
28083 "sqlar_uncompress(data, sz)",
28084 "data"
28085 };
28086
28087 sqlite3_stmt *pSql = 0;
28088 int rc = SQLITE_OK;
28089 char *zDir = 0;
28090 char *zWhere = 0;
28091 int i, j;
28092
28093 /* If arguments are specified, check that they actually exist within
28094 ** the archive before proceeding. And formulate a WHERE clause to
28095 ** match them. */
28096 rc = arCheckEntries(pAr);
28097 arWhereClause(&rc, pAr, &zWhere);
28098
28099 if( rc==SQLITE_OK ){
28100 if( pAr->zDir ){
28101 zDir = sqlite3_mprintf("%s/", pAr->zDir);
28102 }else{
28103 zDir = sqlite3_mprintf("");
28104 }
28105 if( zDir==0 ) rc = SQLITE_NOMEM;
28106 }
28107
28108 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
28109 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
28110 );
28111
28112 if( rc==SQLITE_OK ){
28113 j = sqlite3_bind_parameter_index(pSql, "$dir");
28114 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
28115
28116 /* Run the SELECT statement twice. The first time, writefile() is called
28117 ** for all archive members that should be extracted. The second time,
28118 ** only for the directories. This is because the timestamps for
28119 ** extracted directories must be reset after they are populated (as
28120 ** populating them changes the timestamp). */
28121 for(i=0; i<2; i++){
28122 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
28123 sqlite3_bind_int(pSql, j, i);
28124 if( pAr->bDryRun ){
28125 sqlite3_fprintf(pAr->out, "%s\n", sqlite3_sql(pSql));
28126 }else{
28127 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
28128 if( i==0 && pAr->bVerbose ){
28129 sqlite3_fprintf(pAr->out, "%s\n", sqlite3_column_text(pSql, 0));
28130 }
28131 }
28132 }
28133 shellReset(&rc, pSql);
28134 }
28135 shellFinalize(&rc, pSql);
28136 }
28137
28138 sqlite3_free(zDir);
28139 sqlite3_free(zWhere);
28140 return rc;
28141}
28142
28143/*
28144** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
28145*/
28146static int arExecSql(ArCommand *pAr, const char *zSql){
28147 int rc;
28148 if( pAr->bDryRun ){
28149 sqlite3_fprintf(pAr->out, "%s\n", zSql);
28150 rc = SQLITE_OK;
28151 }else{
28152 char *zErr = 0;
28153 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
28154 if( zErr ){
28155 sqlite3_fprintf(stdout, "ERROR: %s\n", zErr);
28156 sqlite3_free(zErr);
28157 }
28158 }
28159 return rc;
28160}
28161
28162
28163/*
28164** Implementation of .ar "create", "insert", and "update" commands.
28165**
28166** create -> Create a new SQL archive
28167** insert -> Insert or reinsert all files listed
28168** update -> Insert files that have changed or that were not
28169** previously in the archive
28170**
28171** Create the "sqlar" table in the database if it does not already exist.
28172** Then add each file in the azFile[] array to the archive. Directories
28173** are added recursively. If argument bVerbose is non-zero, a message is
28174** printed on stdout for each file archived.
28175**
28176** The create command is the same as update, except that it drops
28177** any existing "sqlar" table before beginning. The "insert" command
28178** always overwrites every file named on the command-line, where as
28179** "update" only overwrites if the size or mtime or mode has changed.
28180*/
28181static int arCreateOrUpdateCommand(
28182 ArCommand *pAr, /* Command arguments and options */
28183 int bUpdate, /* true for a --create. */
28184 int bOnlyIfChanged /* Only update if file has changed */
28185){
28186 const char *zCreate =
28187 "CREATE TABLE IF NOT EXISTS sqlar(\n"
28188 " name TEXT PRIMARY KEY, -- name of the file\n"
28189 " mode INT, -- access permissions\n"
28190 " mtime INT, -- last modification time\n"
28191 " sz INT, -- original file size\n"
28192 " data BLOB -- compressed content\n"
28193 ")";
28194 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
28195 const char *zInsertFmt[2] = {
28196 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
28197 " SELECT\n"
28198 " %s,\n"
28199 " mode,\n"
28200 " mtime,\n"
28201 " CASE substr(lsmode(mode),1,1)\n"
28202 " WHEN '-' THEN length(data)\n"
28203 " WHEN 'd' THEN 0\n"
28204 " ELSE -1 END,\n"
28205 " sqlar_compress(data)\n"
28206 " FROM fsdir(%Q,%Q) AS disk\n"
28207 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
28208 ,
28209 "REPLACE INTO %s(name,mode,mtime,data)\n"
28210 " SELECT\n"
28211 " %s,\n"
28212 " mode,\n"
28213 " mtime,\n"
28214 " data\n"
28215 " FROM fsdir(%Q,%Q) AS disk\n"
28216 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
28217 };
28218 int i; /* For iterating through azFile[] */
28219 int rc; /* Return code */
28220 const char *zTab = 0; /* SQL table into which to insert */
28221 char *zSql;
28222 char zTemp[50];
28223 char *zExists = 0;
28224
28225 arExecSql(pAr, "PRAGMA page_size=512");
28226 rc = arExecSql(pAr, "SAVEPOINT ar;");
28227 if( rc!=SQLITE_OK ) return rc;
28228 zTemp[0] = 0;
28229 if( pAr->bZip ){
28230 /* Initialize the zipfile virtual table, if necessary */
28231 if( pAr->zFile ){
28232 sqlite3_uint64 r;
28233 sqlite3_randomness(sizeof(r),&r);
28234 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
28235 zTab = zTemp;
28236 zSql = sqlite3_mprintf(
28237 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
28238 zTab, pAr->zFile
28239 );
28240 rc = arExecSql(pAr, zSql);
28241 sqlite3_free(zSql);
28242 }else{
28243 zTab = "zip";
28244 }
28245 }else{
28246 /* Initialize the table for an SQLAR */
28247 zTab = "sqlar";
28248 if( bUpdate==0 ){
28249 rc = arExecSql(pAr, zDrop);
28250 if( rc!=SQLITE_OK ) goto end_ar_transaction;
28251 }
28252 rc = arExecSql(pAr, zCreate);
28253 }
28254 if( bOnlyIfChanged ){
28255 zExists = sqlite3_mprintf(
28256 " AND NOT EXISTS("
28257 "SELECT 1 FROM %s AS mem"
28258 " WHERE mem.name=disk.name"
28259 " AND mem.mtime=disk.mtime"
28260 " AND mem.mode=disk.mode)", zTab);
28261 }else{
28262 zExists = sqlite3_mprintf("");
28263 }
28264 if( zExists==0 ) rc = SQLITE_NOMEM;
28265 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
28266 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
28267 pAr->bVerbose ? "shell_putsnl(name)" : "name",
28268 pAr->azArg[i], pAr->zDir, zExists);
28269 rc = arExecSql(pAr, zSql2);
28270 sqlite3_free(zSql2);
28271 }
28272end_ar_transaction:
28273 if( rc!=SQLITE_OK ){
28274 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
28275 }else{
28276 rc = arExecSql(pAr, "RELEASE ar;");
28277 if( pAr->bZip && pAr->zFile ){
28278 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
28279 arExecSql(pAr, zSql);
28280 sqlite3_free(zSql);
28281 }
28282 }
28283 sqlite3_free(zExists);
28284 return rc;
28285}
28286
28287/*
28288** Implementation of ".ar" dot command.
28289*/
28290static int arDotCommand(
28291 ShellState *pState, /* Current shell tool state */
28292 int fromCmdLine, /* True if -A command-line option, not .ar cmd */
28293 char **azArg, /* Array of arguments passed to dot command */
28294 int nArg /* Number of entries in azArg[] */
28295){
28296 ArCommand cmd;
28297 int rc;
28298 memset(&cmd, 0, sizeof(cmd));
28299 cmd.fromCmdLine = fromCmdLine;
28300 rc = arParseCommand(azArg, nArg, &cmd);
28301 if( rc==SQLITE_OK ){
28302 int eDbType = SHELL_OPEN_UNSPEC;
28303 cmd.p = pState;
28304 cmd.out = pState->out;
28305 cmd.db = pState->db;
28306 if( cmd.zFile ){
28307 eDbType = deduceDatabaseType(cmd.zFile, 1);
28308 }else{
28309 eDbType = pState->openMode;
28310 }
28311 if( eDbType==SHELL_OPEN_ZIPFILE ){
28312 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
28313 if( cmd.zFile==0 ){
28314 cmd.zSrcTable = sqlite3_mprintf("zip");
28315 }else{
28316 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
28317 }
28318 }
28319 cmd.bZip = 1;
28320 }else if( cmd.zFile ){
28321 int flags;
28322 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
28323 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
28324 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
28325 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
28326 }else{
28327 flags = SQLITE_OPEN_READONLY;
28328 }
28329 cmd.db = 0;
28330 if( cmd.bDryRun ){
28331 sqlite3_fprintf(cmd.out, "-- open database '%s'%s\n", cmd.zFile,
28332 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
28333 }
28334 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
28335 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
28336 if( rc!=SQLITE_OK ){
28337 sqlite3_fprintf(stderr, "cannot open file: %s (%s)\n",
28338 cmd.zFile, sqlite3_errmsg(cmd.db));
28339 goto end_ar_command;
28340 }
28341 sqlite3_fileio_init(cmd.db, 0, 0);
28342 sqlite3_sqlar_init(cmd.db, 0, 0);
28343 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
28344 shellPutsFunc, 0, 0);
28345
28346 }
28347 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
28348 if( cmd.eCmd!=AR_CMD_CREATE
28349 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
28350 ){
28351 sqlite3_fprintf(stderr, "database does not contain an 'sqlar' table\n");
28352 rc = SQLITE_ERROR;
28353 goto end_ar_command;
28354 }
28355 cmd.zSrcTable = sqlite3_mprintf("sqlar");
28356 }
28357
28358 switch( cmd.eCmd ){
28359 case AR_CMD_CREATE:
28360 rc = arCreateOrUpdateCommand(&cmd, 0, 0);
28361 break;
28362
28363 case AR_CMD_EXTRACT:
28364 rc = arExtractCommand(&cmd);
28365 break;
28366
28367 case AR_CMD_LIST:
28368 rc = arListCommand(&cmd);
28369 break;
28370
28371 case AR_CMD_HELP:
28372 arUsage(pState->out);
28373 break;
28374
28375 case AR_CMD_INSERT:
28376 rc = arCreateOrUpdateCommand(&cmd, 1, 0);
28377 break;
28378
28379 case AR_CMD_REMOVE:
28380 rc = arRemoveCommand(&cmd);
28381 break;
28382
28383 default:
28384 assert( cmd.eCmd==AR_CMD_UPDATE );
28385 rc = arCreateOrUpdateCommand(&cmd, 1, 1);
28386 break;
28387 }
28388 }
28389end_ar_command:
28390 if( cmd.db!=pState->db ){
28391 close_db(cmd.db);
28392 }
28393 sqlite3_free(cmd.zSrcTable);
28394
28395 return rc;
28396}
28397/* End of the ".archive" or ".ar" command logic
28398*******************************************************************************/
28399#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
28400
28402
28403/*
28404** This function is used as a callback by the recover extension. Simply
28405** print the supplied SQL statement to stdout.
28406*/
28407static int recoverSqlCb(void *pCtx, const char *zSql){
28408 ShellState *pState = (ShellState*)pCtx;
28409 sqlite3_fprintf(pState->out, "%s;\n", zSql);
28410 return SQLITE_OK;
28411}
28412
28413/*
28414** This function is called to recover data from the database. A script
28415** to construct a new database containing all recovered data is output
28416** on stream pState->out.
28417*/
28418static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
28419 int rc = SQLITE_OK;
28420 const char *zRecoveryDb = ""; /* Name of "recovery" database. Debug only */
28421 const char *zLAF = "lost_and_found";
28422 int bFreelist = 1; /* 0 if --ignore-freelist is specified */
28423 int bRowids = 1; /* 0 if --no-rowids */
28424 sqlite3_recover *p = 0;
28425 int i = 0;
28426
28427 for(i=1; i<nArg; i++){
28428 char *z = azArg[i];
28429 int n;
28430 if( z[0]=='-' && z[1]=='-' ) z++;
28431 n = strlen30(z);
28432 if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
28433 bFreelist = 0;
28434 }else
28435 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
28436 /* This option determines the name of the ATTACH-ed database used
28437 ** internally by the recovery extension. The default is "" which
28438 ** means to use a temporary database that is automatically deleted
28439 ** when closed. This option is undocumented and might disappear at
28440 ** any moment. */
28441 i++;
28442 zRecoveryDb = azArg[i];
28443 }else
28444 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
28445 i++;
28446 zLAF = azArg[i];
28447 }else
28448 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
28449 bRowids = 0;
28450 }
28451 else{
28452 sqlite3_fprintf(stderr,"unexpected option: %s\n", azArg[i]);
28453 showHelp(pState->out, azArg[0]);
28454 return 1;
28455 }
28456 }
28457
28458 p = sqlite3_recover_init_sql(
28459 pState->db, "main", recoverSqlCb, (void*)pState
28460 );
28461
28462 sqlite3_recover_config(p, 789, (void*)zRecoveryDb); /* Debug use only */
28463 sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
28464 sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
28465 sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
28466
28467 sqlite3_fprintf(pState->out, ".dbconfig defensive off\n");
28468 sqlite3_recover_run(p);
28469 if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
28470 const char *zErr = sqlite3_recover_errmsg(p);
28471 int errCode = sqlite3_recover_errcode(p);
28472 sqlite3_fprintf(stderr,"sql error: %s (%d)\n", zErr, errCode);
28473 }
28474 rc = sqlite3_recover_finish(p);
28475 return rc;
28476}
28477#endif /* SQLITE_SHELL_HAVE_RECOVER */
28478
28479/*
28480** Implementation of ".intck STEPS_PER_UNLOCK" command.
28481*/
28482static int intckDatabaseCmd(ShellState *pState, i64 nStepPerUnlock){
28483 sqlite3_intck *p = 0;
28484 int rc = SQLITE_OK;
28485
28486 rc = sqlite3_intck_open(pState->db, "main", &p);
28487 if( rc==SQLITE_OK ){
28488 i64 nStep = 0;
28489 i64 nError = 0;
28490 const char *zErr = 0;
28492 const char *zMsg = sqlite3_intck_message(p);
28493 if( zMsg ){
28494 sqlite3_fprintf(pState->out, "%s\n", zMsg);
28495 nError++;
28496 }
28497 nStep++;
28498 if( nStepPerUnlock && (nStep % nStepPerUnlock)==0 ){
28500 }
28501 }
28502 rc = sqlite3_intck_error(p, &zErr);
28503 if( zErr ){
28504 sqlite3_fprintf(stderr,"%s\n", zErr);
28505 }
28507
28508 sqlite3_fprintf(pState->out, "%lld steps, %lld errors\n", nStep, nError);
28509 }
28510
28511 return rc;
28512}
28513
28514/*
28515 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
28516 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
28517 * close db and set it to 0, and return the columns spec, to later
28518 * be sqlite3_free()'ed by the caller.
28519 * The return is 0 when either:
28520 * (a) The db was not initialized and zCol==0 (There are no columns.)
28521 * (b) zCol!=0 (Column was added, db initialized as needed.)
28522 * The 3rd argument, pRenamed, references an out parameter. If the
28523 * pointer is non-zero, its referent will be set to a summary of renames
28524 * done if renaming was necessary, or set to 0 if none was done. The out
28525 * string (if any) must be sqlite3_free()'ed by the caller.
28526 */
28527#ifdef SHELL_DEBUG
28528#define rc_err_oom_die(rc)
28529 if( rc==SQLITE_NOMEM ) shell_check_oom(0);
28530 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE))
28531 sqlite3_fprintf(stderr,"E:%d\n",rc), assert(0)
28532#else
28533static void rc_err_oom_die(int rc){
28535 assert(rc==SQLITE_OK||rc==SQLITE_DONE);
28536}
28537#endif
28538
28539#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
28540static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
28541#else /* Otherwise, memory is faster/better for the transient DB. */
28542static const char *zCOL_DB = ":memory:";
28543#endif
28544
28545/* Define character (as C string) to separate generated column ordinal
28546 * from protected part of incoming column names. This defaults to "_"
28547 * so that incoming column identifiers that did not need not be quoted
28548 * remain usable without being quoted. It must be one character.
28550#ifndef SHELL_AUTOCOLUMN_SEP
28551# define AUTOCOLUMN_SEP "_"
28552#else
28553# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
28554#endif
28555
28556static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
28557 /* Queries and D{D,M}L used here */
28558 static const char * const zTabMake = "\
28559CREATE TABLE ColNames(\
28560 cpos INTEGER PRIMARY KEY,\
28561 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
28562CREATE VIEW RepeatedNames AS \
28563SELECT DISTINCT t.name FROM ColNames t \
28564WHERE t.name COLLATE NOCASE IN (\
28565 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
28566);\
28567";
28568 static const char * const zTabFill = "\
28569INSERT INTO ColNames(name,nlen,chop,reps,suff)\
28570 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
28571";
28572 static const char * const zHasDupes = "\
28573SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
28574 <count(name) FROM ColNames\
28575";
28576#ifdef SHELL_COLUMN_RENAME_CLEAN
28577 static const char * const zDedoctor = "\
28578UPDATE ColNames SET chop=iif(\
28579 (substring(name,nlen,1) BETWEEN '0' AND '9')\
28580 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
28581 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
28582 0\
28583)\
28584";
28585#endif
28586 static const char * const zSetReps = "\
28587UPDATE ColNames AS t SET reps=\
28588(SELECT count(*) FROM ColNames d \
28589 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
28590 COLLATE NOCASE\
28591)\
28592";
28593#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
28594 static const char * const zColDigits = "\
28595SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
28596";
28597#else
28598 /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
28599 static const char * const zColDigits = "\
28600SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
28601 WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
28602 ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
28603";
28604#endif
28605 static const char * const zRenameRank =
28606#ifdef SHELL_COLUMN_RENAME_CLEAN
28607 "UPDATE ColNames AS t SET suff="
28608 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
28609#else /* ...RENAME_MINIMAL_ONE_PASS */
28610"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
28611" SELECT 0 AS nlz"
28612" UNION"
28613" SELECT nlz+1 AS nlz FROM Lzn"
28614" WHERE EXISTS("
28615" SELECT 1"
28616" FROM ColNames t, ColNames o"
28617" WHERE"
28618" iif(t.name IN (SELECT * FROM RepeatedNames),"
28619" printf('%s"AUTOCOLUMN_SEP"%s',"
28620" t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
28621" t.name"
28622" )"
28623" ="
28624" iif(o.name IN (SELECT * FROM RepeatedNames),"
28625" printf('%s"AUTOCOLUMN_SEP"%s',"
28626" o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
28627" o.name"
28628" )"
28629" COLLATE NOCASE"
28630" AND o.cpos<>t.cpos"
28631" GROUP BY t.cpos"
28632" )"
28633") UPDATE Colnames AS t SET"
28634" chop = 0," /* No chopping, never touch incoming names. */
28635" suff = iif(name IN (SELECT * FROM RepeatedNames),"
28636" printf('"AUTOCOLUMN_SEP"%s', substring("
28637" printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
28638" ''"
28639" )"
28640#endif
28641 ;
28642 static const char * const zCollectVar = "\
28643SELECT\
28644 '('||x'0a'\
28645 || group_concat(\
28646 cname||' TEXT',\
28647 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
28648 ||')' AS ColsSpec \
28649FROM (\
28650 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
28651 FROM ColNames ORDER BY cpos\
28652)";
28653 static const char * const zRenamesDone =
28654 "SELECT group_concat("
28655 " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
28656 " ','||x'0a')"
28657 "FROM ColNames WHERE suff<>'' OR chop!=0"
28658 ;
28659 int rc;
28660 sqlite3_stmt *pStmt = 0;
28661 assert(pDb!=0);
28662 if( zColNew ){
28663 /* Add initial or additional column. Init db if necessary. */
28664 if( *pDb==0 ){
28665 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
28666#ifdef SHELL_COLFIX_DB
28667 if(*zCOL_DB!=':')
28668 sqlite3_exec(*pDb,"drop table if exists ColNames;"
28669 "drop view if exists RepeatedNames;",0,0,0);
28670#endif
28671#undef SHELL_COLFIX_DB
28672 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
28673 rc_err_oom_die(rc);
28674 }
28675 assert(*pDb!=0);
28676 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
28677 rc_err_oom_die(rc);
28678 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
28679 rc_err_oom_die(rc);
28680 rc = sqlite3_step(pStmt);
28681 rc_err_oom_die(rc);
28682 sqlite3_finalize(pStmt);
28683 return 0;
28684 }else if( *pDb==0 ){
28685 return 0;
28686 }else{
28687 /* Formulate the columns spec, close the DB, zero *pDb. */
28688 char *zColsSpec = 0;
28689 int hasDupes = db_int(*pDb, "%s", zHasDupes);
28690 int nDigits = (hasDupes)? db_int(*pDb, "%s", zColDigits) : 0;
28691 if( hasDupes ){
28692#ifdef SHELL_COLUMN_RENAME_CLEAN
28693 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
28694 rc_err_oom_die(rc);
28695#endif
28696 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
28697 rc_err_oom_die(rc);
28698 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
28699 rc_err_oom_die(rc);
28700 sqlite3_bind_int(pStmt, 1, nDigits);
28701 rc = sqlite3_step(pStmt);
28702 sqlite3_finalize(pStmt);
28703 if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
28704 }
28705 assert(db_int(*pDb, "%s", zHasDupes)==0); /* Consider: remove this */
28706 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
28707 rc_err_oom_die(rc);
28708 rc = sqlite3_step(pStmt);
28709 if( rc==SQLITE_ROW ){
28710 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
28711 }else{
28712 zColsSpec = 0;
28713 }
28714 if( pzRenamed!=0 ){
28715 if( !hasDupes ) *pzRenamed = 0;
28716 else{
28717 sqlite3_finalize(pStmt);
28718 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
28719 && SQLITE_ROW==sqlite3_step(pStmt) ){
28720 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
28721 }else
28722 *pzRenamed = 0;
28723 }
28724 }
28725 sqlite3_finalize(pStmt);
28726 sqlite3_close(*pDb);
28727 *pDb = 0;
28728 return zColsSpec;
28729 }
28730}
28731
28732/*
28733** Check if the sqlite_schema table contains one or more virtual tables. If
28734** parameter zLike is not NULL, then it is an SQL expression that the
28735** sqlite_schema row must also match. If one or more such rows are found,
28736** print the following warning to the output:
28737**
28738** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled
28739*/
28740static int outputDumpWarning(ShellState *p, const char *zLike){
28741 int rc = SQLITE_OK;
28742 sqlite3_stmt *pStmt = 0;
28743 shellPreparePrintf(p->db, &rc, &pStmt,
28744 "SELECT 1 FROM sqlite_schema o WHERE "
28745 "sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true"
28746 );
28747 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
28748 sqlite3_fputs("/* WARNING: "
28749 "Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n",
28750 p->out
28751 );
28752 }
28753 shellFinalize(&rc, pStmt);
28754 return rc;
28755}
28756
28757/*
28758** Fault-Simulator state and logic.
28760static struct {
28761 int iId; /* ID that triggers a simulated fault. -1 means "any" */
28762 int iErr; /* The error code to return on a fault */
28763 int iCnt; /* Trigger the fault only if iCnt is already zero */
28764 int iInterval; /* Reset iCnt to this value after each fault */
28765 int eVerbose; /* When to print output */
28766 int nHit; /* Number of hits seen so far */
28767 int nRepeat; /* Turn off after this many hits. 0 for never */
28768 int nSkip; /* Skip this many before first fault */
28769} faultsim_state = {-1, 0, 0, 0, 0, 0, 0, 0};
28770
28771/*
28772** This is the fault-sim callback
28773*/
28774static int faultsim_callback(int iArg){
28775 if( faultsim_state.iId>0 && faultsim_state.iId!=iArg ){
28776 return SQLITE_OK;
28777 }
28778 if( faultsim_state.iCnt ){
28779 if( faultsim_state.iCnt>0 ) faultsim_state.iCnt--;
28780 if( faultsim_state.eVerbose>=2 ){
28781 sqlite3_fprintf(stdout,
28782 "FAULT-SIM id=%d no-fault (cnt=%d)\n", iArg, faultsim_state.iCnt);
28783 }
28784 return SQLITE_OK;
28785 }
28786 if( faultsim_state.eVerbose>=1 ){
28787 sqlite3_fprintf(stdout,
28788 "FAULT-SIM id=%d returns %d\n", iArg, faultsim_state.iErr);
28789 }
28790 faultsim_state.iCnt = faultsim_state.iInterval;
28791 faultsim_state.nHit++;
28792 if( faultsim_state.nRepeat>0 && faultsim_state.nRepeat<=faultsim_state.nHit ){
28793 faultsim_state.iCnt = -1;
28794 }
28795 return faultsim_state.iErr;
28796}
28797
28798/*
28799** If an input line begins with "." then invoke this routine to
28800** process that line.
28801**
28802** Return 1 on error, 2 to exit, and 0 otherwise.
28803*/
28804static int do_meta_command(char *zLine, ShellState *p){
28805 int h = 1;
28806 int nArg = 0;
28807 int n, c;
28808 int rc = 0;
28809 char *azArg[52];
28810
28811#ifndef SQLITE_OMIT_VIRTUALTABLE
28812 if( p->expert.pExpert ){
28813 expertFinish(p, 1, 0);
28814 }
28815#endif
28816
28817 /* Parse the input line into tokens.
28818 */
28819 while( zLine[h] && nArg<ArraySize(azArg)-1 ){
28820 while( IsSpace(zLine[h]) ){ h++; }
28821 if( zLine[h]==0 ) break;
28822 if( zLine[h]=='\'' || zLine[h]=='"' ){
28823 int delim = zLine[h++];
28824 azArg[nArg++] = &zLine[h];
28825 while( zLine[h] && zLine[h]!=delim ){
28826 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
28827 h++;
28828 }
28829 if( zLine[h]==delim ){
28830 zLine[h++] = 0;
28831 }
28832 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
28833 }else{
28834 azArg[nArg++] = &zLine[h];
28835 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
28836 if( zLine[h] ) zLine[h++] = 0;
28837 }
28838 }
28839 azArg[nArg] = 0;
28840
28841 /* Process the input line.
28842 */
28843 if( nArg==0 ) return 0; /* no tokens, no error */
28844 n = strlen30(azArg[0]);
28845 c = azArg[0][0];
28846 clearTempFile(p);
28847
28848#ifndef SQLITE_OMIT_AUTHORIZATION
28849 if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
28850 if( nArg!=2 ){
28851 sqlite3_fprintf(stderr, "Usage: .auth ON|OFF\n");
28852 rc = 1;
28853 goto meta_command_exit;
28854 }
28855 open_db(p, 0);
28856 if( booleanValue(azArg[1]) ){
28857 sqlite3_set_authorizer(p->db, shellAuth, p);
28858 }else if( p->bSafeModePersist ){
28859 sqlite3_set_authorizer(p->db, safeModeAuth, p);
28860 }else{
28862 }
28863 }else
28864#endif
28865
28866#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
28867 && !defined(SQLITE_SHELL_FIDDLE)
28868 if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
28869 open_db(p, 0);
28870 failIfSafeMode(p, "cannot run .archive in safe mode");
28871 rc = arDotCommand(p, 0, azArg, nArg);
28872 }else
28873#endif
28874
28875#ifndef SQLITE_SHELL_FIDDLE
28876 if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
28877 || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
28878 ){
28879 const char *zDestFile = 0;
28880 const char *zDb = 0;
28881 sqlite3 *pDest;
28882 sqlite3_backup *pBackup;
28883 int j;
28884 int bAsync = 0;
28885 const char *zVfs = 0;
28886 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
28887 for(j=1; j<nArg; j++){
28888 const char *z = azArg[j];
28889 if( z[0]=='-' ){
28890 if( z[1]=='-' ) z++;
28891 if( cli_strcmp(z, "-append")==0 ){
28892 zVfs = "apndvfs";
28893 }else
28894 if( cli_strcmp(z, "-async")==0 ){
28895 bAsync = 1;
28896 }else
28897 {
28898 sqlite3_fprintf(stderr,"unknown option: %s\n", azArg[j]);
28899 return 1;
28900 }
28901 }else if( zDestFile==0 ){
28902 zDestFile = azArg[j];
28903 }else if( zDb==0 ){
28904 zDb = zDestFile;
28905 zDestFile = azArg[j];
28906 }else{
28907 sqlite3_fprintf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
28908 return 1;
28909 }
28910 }
28911 if( zDestFile==0 ){
28912 sqlite3_fprintf(stderr, "missing FILENAME argument on .backup\n");
28913 return 1;
28914 }
28915 if( zDb==0 ) zDb = "main";
28916 rc = sqlite3_open_v2(zDestFile, &pDest,
28918 if( rc!=SQLITE_OK ){
28919 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zDestFile);
28920 close_db(pDest);
28921 return 1;
28922 }
28923 if( bAsync ){
28924 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
28925 0, 0, 0);
28926 }
28927 open_db(p, 0);
28928 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
28929 if( pBackup==0 ){
28930 shellDatabaseError(pDest);
28931 close_db(pDest);
28932 return 1;
28933 }
28934 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
28936 if( rc==SQLITE_DONE ){
28937 rc = 0;
28938 }else{
28939 shellDatabaseError(pDest);
28940 rc = 1;
28941 }
28942 close_db(pDest);
28943 }else
28944#endif /* !defined(SQLITE_SHELL_FIDDLE) */
28945
28946 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
28947 if( nArg==2 ){
28948 bail_on_error = booleanValue(azArg[1]);
28949 }else{
28950 eputz("Usage: .bail on|off\n");
28951 rc = 1;
28952 }
28953 }else
28954
28955 /* Undocumented. Legacy only. See "crlf" below */
28956 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
28957 eputz("The \".binary\" command is deprecated.\n");
28958 rc = 1;
28959 }else
28960
28961 /* The undocumented ".breakpoint" command causes a call to the no-op
28962 ** routine named test_breakpoint().
28963 */
28964 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
28965 test_breakpoint();
28966 }else
28967
28968#ifndef SQLITE_SHELL_FIDDLE
28969 if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
28970 failIfSafeMode(p, "cannot run .cd in safe mode");
28971 if( nArg==2 ){
28972#if defined(_WIN32) || defined(WIN32)
28973 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
28974 rc = !SetCurrentDirectoryW(z);
28976#else
28977 rc = chdir(azArg[1]);
28978#endif
28979 if( rc ){
28980 sqlite3_fprintf(stderr,"Cannot change to directory \"%s\"\n", azArg[1]);
28981 rc = 1;
28982 }
28983 }else{
28984 eputz("Usage: .cd DIRECTORY\n");
28985 rc = 1;
28986 }
28987 }else
28988#endif /* !defined(SQLITE_SHELL_FIDDLE) */
28989
28990 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
28991 if( nArg==2 ){
28992 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
28993 }else{
28994 eputz("Usage: .changes on|off\n");
28995 rc = 1;
28996 }
28997 }else
28998
28999#ifndef SQLITE_SHELL_FIDDLE
29000 /* Cancel output redirection, if it is currently set (by .testcase)
29001 ** Then read the content of the testcase-out.txt file and compare against
29002 ** azArg[1]. If there are differences, report an error and exit.
29003 */
29004 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
29005 char *zRes = 0;
29006 output_reset(p);
29007 if( nArg!=2 ){
29008 eputz("Usage: .check GLOB-PATTERN\n");
29009 rc = 2;
29010 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
29011 rc = 2;
29012 }else if( testcase_glob(azArg[1],zRes)==0 ){
29013 sqlite3_fprintf(stderr,
29014 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
29015 p->zTestcase, azArg[1], zRes);
29016 rc = 1;
29017 }else{
29018 sqlite3_fprintf(p->out, "testcase-%s ok\n", p->zTestcase);
29019 p->nCheck++;
29020 }
29021 sqlite3_free(zRes);
29022 }else
29023#endif /* !defined(SQLITE_SHELL_FIDDLE) */
29024
29025#ifndef SQLITE_SHELL_FIDDLE
29026 if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
29027 failIfSafeMode(p, "cannot run .clone in safe mode");
29028 if( nArg==2 ){
29029 tryToClone(p, azArg[1]);
29030 }else{
29031 eputz("Usage: .clone FILENAME\n");
29032 rc = 1;
29033 }
29034 }else
29035#endif /* !defined(SQLITE_SHELL_FIDDLE) */
29036
29037 if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
29038 if( nArg==1 ){
29039 /* List available connections */
29040 int i;
29041 for(i=0; i<ArraySize(p->aAuxDb); i++){
29042 const char *zFile = p->aAuxDb[i].zDbFilename;
29043 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
29044 zFile = "(not open)";
29045 }else if( zFile==0 ){
29046 zFile = "(memory)";
29047 }else if( zFile[0]==0 ){
29048 zFile = "(temporary-file)";
29049 }
29050 if( p->pAuxDb == &p->aAuxDb[i] ){
29051 sqlite3_fprintf(stdout, "ACTIVE %d: %s\n", i, zFile);
29052 }else if( p->aAuxDb[i].db!=0 ){
29053 sqlite3_fprintf(stdout, " %d: %s\n", i, zFile);
29054 }
29055 }
29056 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
29057 int i = azArg[1][0] - '0';
29058 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
29059 p->pAuxDb->db = p->db;
29060 p->pAuxDb = &p->aAuxDb[i];
29061 globalDb = p->db = p->pAuxDb->db;
29062 p->pAuxDb->db = 0;
29063 }
29064 }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
29065 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
29066 int i = azArg[2][0] - '0';
29067 if( i<0 || i>=ArraySize(p->aAuxDb) ){
29068 /* No-op */
29069 }else if( p->pAuxDb == &p->aAuxDb[i] ){
29070 eputz("cannot close the active database connection\n");
29071 rc = 1;
29072 }else if( p->aAuxDb[i].db ){
29073 session_close_all(p, i);
29074 close_db(p->aAuxDb[i].db);
29075 p->aAuxDb[i].db = 0;
29076 }
29077 }else{
29078 eputz("Usage: .connection [close] [CONNECTION-NUMBER]\n");
29079 rc = 1;
29080 }
29081 }else
29082
29083 if( c=='c' && n==4
29084 && (cli_strncmp(azArg[0], "crlf", n)==0
29085 || cli_strncmp(azArg[0], "crnl",n)==0)
29086 ){
29087 if( nArg==2 ){
29088#ifdef _WIN32
29089 p->crlfMode = booleanValue(azArg[1]);
29090#else
29091 p->crlfMode = 0;
29092#endif
29093 }
29094 sqlite3_fprintf(stderr, "crlf is %s\n", p->crlfMode ? "ON" : "OFF");
29095 }else
29096
29097 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
29098 char **azName = 0;
29099 int nName = 0;
29100 sqlite3_stmt *pStmt;
29101 int i;
29102 open_db(p, 0);
29103 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
29104 if( rc ){
29105 shellDatabaseError(p->db);
29106 rc = 1;
29107 }else{
29108 while( sqlite3_step(pStmt)==SQLITE_ROW ){
29109 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
29110 const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
29111 if( zSchema==0 || zFile==0 ) continue;
29112 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
29113 shell_check_oom(azName);
29114 azName[nName*2] = strdup(zSchema);
29115 azName[nName*2+1] = strdup(zFile);
29116 nName++;
29117 }
29118 }
29119 sqlite3_finalize(pStmt);
29120 for(i=0; i<nName; i++){
29121 int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
29122 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
29123 const char *z = azName[i*2+1];
29124 sqlite3_fprintf(p->out, "%s: %s %s%s\n",
29125 azName[i*2], z && z[0] ? z : "\"\"", bRdonly ? "r/o" : "r/w",
29126 eTxn==SQLITE_TXN_NONE ? "" :
29127 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
29128 free(azName[i*2]);
29129 free(azName[i*2+1]);
29130 }
29131 sqlite3_free(azName);
29132 }else
29133
29134 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
29135 static const struct DbConfigChoices {
29136 const char *zName;
29137 int op;
29138 } aDbConfig[] = {
29139 { "attach_create", SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE },
29140 { "attach_write", SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE },
29141 { "comments", SQLITE_DBCONFIG_ENABLE_COMMENTS },
29142 { "defensive", SQLITE_DBCONFIG_DEFENSIVE },
29143 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
29144 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
29145 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
29146 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
29147 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
29148 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
29149 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
29150 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
29151 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
29152 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
29153 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
29154 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
29155 { "reverse_scanorder", SQLITE_DBCONFIG_REVERSE_SCANORDER },
29156 { "stmt_scanstatus", SQLITE_DBCONFIG_STMT_SCANSTATUS },
29157 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
29158 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
29159 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
29160 };
29161 int ii, v;
29162 open_db(p, 0);
29163 for(ii=0; ii<ArraySize(aDbConfig); ii++){
29164 if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
29165 if( nArg>=3 ){
29166 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
29167 }
29168 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
29169 sqlite3_fprintf(p->out, "%19s %s\n",
29170 aDbConfig[ii].zName, v ? "on" : "off");
29171 if( nArg>1 ) break;
29172 }
29173 if( nArg>1 && ii==ArraySize(aDbConfig) ){
29174 sqlite3_fprintf(stderr,"Error: unknown dbconfig \"%s\"\n", azArg[1]);
29175 eputz("Enter \".dbconfig\" with no arguments for a list\n");
29176 }
29177 }else
29178
29180 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
29181 rc = shell_dbinfo_command(p, nArg, azArg);
29182 }else
29183
29184 if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
29185 open_db(p, 0);
29186 rc = recoverDatabaseCmd(p, nArg, azArg);
29187 }else
29188#endif /* SQLITE_SHELL_HAVE_RECOVER */
29189
29190 if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
29191 char *zLike = 0;
29192 char *zSql;
29193 int i;
29194 int savedShowHeader = p->showHeader;
29195 int savedShellFlags = p->shellFlgs;
29199 for(i=1; i<nArg; i++){
29200 if( azArg[i][0]=='-' ){
29201 const char *z = azArg[i]+1;
29202 if( z[0]=='-' ) z++;
29203 if( cli_strcmp(z,"preserve-rowids")==0 ){
29204#ifdef SQLITE_OMIT_VIRTUALTABLE
29205 eputz("The --preserve-rowids option is not compatible"
29206 " with SQLITE_OMIT_VIRTUALTABLE\n");
29207 rc = 1;
29208 sqlite3_free(zLike);
29209 goto meta_command_exit;
29210#else
29212#endif
29213 }else
29214 if( cli_strcmp(z,"newlines")==0 ){
29216 }else
29217 if( cli_strcmp(z,"data-only")==0 ){
29219 }else
29220 if( cli_strcmp(z,"nosys")==0 ){
29222 }else
29223 {
29224 sqlite3_fprintf(stderr,
29225 "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
29226 rc = 1;
29227 sqlite3_free(zLike);
29228 goto meta_command_exit;
29229 }
29230 }else{
29231 /* azArg[i] contains a LIKE pattern. This ".dump" request should
29232 ** only dump data for tables for which either the table name matches
29233 ** the LIKE pattern, or the table appears to be a shadow table of
29234 ** a virtual table for which the name matches the LIKE pattern.
29235 */
29236 char *zExpr = sqlite3_mprintf(
29237 "name LIKE %Q ESCAPE '\\' OR EXISTS ("
29238 " SELECT 1 FROM sqlite_schema WHERE "
29239 " name LIKE %Q ESCAPE '\\' AND"
29240 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
29241 " substr(o.name, 1, length(name)+1) == (name||'_')"
29242 ")", azArg[i], azArg[i]
29243 );
29244
29245 if( zLike ){
29246 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
29247 }else{
29248 zLike = zExpr;
29249 }
29250 }
29251 }
29252
29253 open_db(p, 0);
29254
29255 outputDumpWarning(p, zLike);
29256 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
29257 /* When playing back a "dump", the content might appear in an order
29258 ** which causes immediate foreign key constraints to be violated.
29259 ** So disable foreign-key constraint enforcement to prevent problems. */
29260 sqlite3_fputs("PRAGMA foreign_keys=OFF;\n", p->out);
29261 sqlite3_fputs("BEGIN TRANSACTION;\n", p->out);
29262 }
29263 p->writableSchema = 0;
29264 p->showHeader = 0;
29265 /* Set writable_schema=ON since doing so forces SQLite to initialize
29266 ** as much of the schema as it can even if the sqlite_schema table is
29267 ** corrupt. */
29268 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
29269 p->nErr = 0;
29270 if( zLike==0 ) zLike = sqlite3_mprintf("true");
29271 zSql = sqlite3_mprintf(
29272 "SELECT name, type, sql FROM sqlite_schema AS o "
29273 "WHERE (%s) AND type=='table'"
29274 " AND sql NOT NULL"
29275 " ORDER BY tbl_name='sqlite_sequence', rowid",
29276 zLike
29277 );
29278 run_schema_dump_query(p,zSql);
29279 sqlite3_free(zSql);
29280 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
29281 zSql = sqlite3_mprintf(
29282 "SELECT sql FROM sqlite_schema AS o "
29283 "WHERE (%s) AND sql NOT NULL"
29284 " AND type IN ('index','trigger','view') "
29285 "ORDER BY type COLLATE NOCASE DESC",
29286 zLike
29287 );
29288 run_table_dump_query(p, zSql);
29289 sqlite3_free(zSql);
29290 }
29291 sqlite3_free(zLike);
29292 if( p->writableSchema ){
29293 sqlite3_fputs("PRAGMA writable_schema=OFF;\n", p->out);
29294 p->writableSchema = 0;
29295 }
29296 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
29297 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
29298 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
29299 sqlite3_fputs(p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n", p->out);
29300 }
29301 p->showHeader = savedShowHeader;
29302 p->shellFlgs = savedShellFlags;
29303 }else
29304
29305 if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
29306 if( nArg==2 ){
29307 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
29308 }else{
29309 eputz("Usage: .echo on|off\n");
29310 rc = 1;
29311 }
29312 }else
29313
29314 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbtotxt", n)==0 ){
29315 rc = shell_dbtotxt_command(p, nArg, azArg);
29316 }else
29317
29318 if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
29319 if( nArg==2 ){
29320 p->autoEQPtest = 0;
29321 if( p->autoEQPtrace ){
29322 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
29323 p->autoEQPtrace = 0;
29324 }
29325 if( cli_strcmp(azArg[1],"full")==0 ){
29327 }else if( cli_strcmp(azArg[1],"trigger")==0 ){
29329#ifdef SQLITE_DEBUG
29330 }else if( cli_strcmp(azArg[1],"test")==0 ){
29331 p->autoEQP = AUTOEQP_on;
29332 p->autoEQPtest = 1;
29333 }else if( cli_strcmp(azArg[1],"trace")==0 ){
29334 p->autoEQP = AUTOEQP_full;
29335 p->autoEQPtrace = 1;
29336 open_db(p, 0);
29337 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
29338 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
29339#endif
29340 }else{
29341 p->autoEQP = (u8)booleanValue(azArg[1]);
29342 }
29343 }else{
29344 eputz("Usage: .eqp off|on|trace|trigger|full\n");
29345 rc = 1;
29346 }
29347 }else
29348
29349#ifndef SQLITE_SHELL_FIDDLE
29350 if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
29351 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
29352 rc = 2;
29353 }else
29354#endif
29355
29356 /* The ".explain" command is automatic now. It is largely pointless. It
29357 ** retained purely for backwards compatibility */
29358 if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
29359 int val = 1;
29360 if( nArg>=2 ){
29361 if( cli_strcmp(azArg[1],"auto")==0 ){
29362 val = 99;
29363 }else{
29364 val = booleanValue(azArg[1]);
29365 }
29366 }
29367 if( val==1 && p->mode!=MODE_Explain ){
29368 p->normalMode = p->mode;
29370 p->autoExplain = 0;
29371 }else if( val==0 ){
29373 p->autoExplain = 0;
29374 }else if( val==99 ){
29376 p->autoExplain = 1;
29377 }
29378 }else
29379
29380#ifndef SQLITE_OMIT_VIRTUALTABLE
29381 if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
29382 if( p->bSafeMode ){
29383 sqlite3_fprintf(stderr,
29384 "Cannot run experimental commands such as \"%s\" in safe mode\n",
29385 azArg[0]);
29386 rc = 1;
29387 }else{
29388 open_db(p, 0);
29389 expertDotCommand(p, azArg, nArg);
29390 }
29391 }else
29392#endif
29393
29394 if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
29395 static const struct {
29396 const char *zCtrlName; /* Name of a test-control option */
29397 int ctrlCode; /* Integer code for that option */
29398 const char *zUsage; /* Usage notes */
29399 } aCtrl[] = {
29400 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" },
29401 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" },
29402 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" },
29403 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" },
29404 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" },
29405 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/
29406 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" },
29407 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" },
29408 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" },
29409 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" },
29410 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/
29411 };
29412 int filectrl = -1;
29413 int iCtrl = -1;
29414 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */
29415 int isOk = 0; /* 0: usage 1: %lld 2: no-result */
29416 int n2, i;
29417 const char *zCmd = 0;
29418 const char *zSchema = 0;
29419
29420 open_db(p, 0);
29421 zCmd = nArg>=2 ? azArg[1] : "help";
29422
29423 if( zCmd[0]=='-'
29424 && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
29425 && nArg>=4
29426 ){
29427 zSchema = azArg[2];
29428 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
29429 nArg -= 2;
29430 zCmd = azArg[1];
29431 }
29432
29433 /* The argument can optionally begin with "-" or "--" */
29434 if( zCmd[0]=='-' && zCmd[1] ){
29435 zCmd++;
29436 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
29437 }
29438
29439 /* --help lists all file-controls */
29440 if( cli_strcmp(zCmd,"help")==0 ){
29441 sqlite3_fputs("Available file-controls:\n", p->out);
29442 for(i=0; i<ArraySize(aCtrl); i++){
29443 sqlite3_fprintf(p->out,
29444 " .filectrl %s %s\n", aCtrl[i].zCtrlName, aCtrl[i].zUsage);
29445 }
29446 rc = 1;
29447 goto meta_command_exit;
29448 }
29449
29450 /* convert filectrl text option to value. allow any unique prefix
29451 ** of the option name, or a numerical value. */
29452 n2 = strlen30(zCmd);
29453 for(i=0; i<ArraySize(aCtrl); i++){
29454 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
29455 if( filectrl<0 ){
29456 filectrl = aCtrl[i].ctrlCode;
29457 iCtrl = i;
29458 }else{
29459 sqlite3_fprintf(stderr,"Error: ambiguous file-control: \"%s\"\n"
29460 "Use \".filectrl --help\" for help\n", zCmd);
29461 rc = 1;
29462 goto meta_command_exit;
29463 }
29464 }
29465 }
29466 if( filectrl<0 ){
29467 sqlite3_fprintf(stderr,"Error: unknown file-control: %s\n"
29468 "Use \".filectrl --help\" for help\n", zCmd);
29469 }else{
29470 switch(filectrl){
29472 if( nArg!=2 && nArg!=3 ) break;
29473 iRes = nArg==3 ? integerValue(azArg[2]) : -1;
29475 isOk = 1;
29476 break;
29477 }
29480 int x;
29481 if( nArg!=3 ) break;
29482 x = (int)integerValue(azArg[2]);
29483 sqlite3_file_control(p->db, zSchema, filectrl, &x);
29484 isOk = 2;
29485 break;
29486 }
29489 int x;
29490 if( nArg!=2 && nArg!=3 ) break;
29491 x = nArg==3 ? booleanValue(azArg[2]) : -1;
29492 sqlite3_file_control(p->db, zSchema, filectrl, &x);
29493 iRes = x;
29494 isOk = 1;
29495 break;
29496 }
29499 int x;
29500 if( nArg!=2 ) break;
29501 sqlite3_file_control(p->db, zSchema, filectrl, &x);
29502 iRes = x;
29503 isOk = 1;
29504 break;
29505 }
29507 char *z = 0;
29508 if( nArg!=2 ) break;
29509 sqlite3_file_control(p->db, zSchema, filectrl, &z);
29510 if( z ){
29511 sqlite3_fprintf(p->out, "%s\n", z);
29513 }
29514 isOk = 2;
29515 break;
29516 }
29518 int x;
29519 if( nArg>=3 ){
29520 x = atoi(azArg[2]);
29521 sqlite3_file_control(p->db, zSchema, filectrl, &x);
29522 }
29523 x = -1;
29524 sqlite3_file_control(p->db, zSchema, filectrl, &x);
29525 sqlite3_fprintf(p->out, "%d\n", x);
29526 isOk = 2;
29527 break;
29528 }
29529 }
29530 }
29531 if( isOk==0 && iCtrl>=0 ){
29532 sqlite3_fprintf(p->out, "Usage: .filectrl %s %s\n",
29533 zCmd, aCtrl[iCtrl].zUsage);
29534 rc = 1;
29535 }else if( isOk==1 ){
29536 char zBuf[100];
29537 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
29538 sqlite3_fprintf(p->out, "%s\n", zBuf);
29539 }
29540 }else
29541
29542 if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
29543 ShellState data;
29544 int doStats = 0;
29545 memcpy(&data, p, sizeof(data));
29546 data.showHeader = 0;
29547 data.cMode = data.mode = MODE_Semi;
29548 if( nArg==2 && optionMatch(azArg[1], "indent") ){
29549 data.cMode = data.mode = MODE_Pretty;
29550 nArg = 1;
29551 }
29552 if( nArg!=1 ){
29553 eputz("Usage: .fullschema ?--indent?\n");
29554 rc = 1;
29555 goto meta_command_exit;
29556 }
29557 open_db(p, 0);
29558 rc = sqlite3_exec(p->db,
29559 "SELECT sql FROM"
29560 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
29561 " FROM sqlite_schema UNION ALL"
29562 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
29563 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
29564 "ORDER BY x",
29565 callback, &data, 0
29566 );
29567 if( rc==SQLITE_OK ){
29568 sqlite3_stmt *pStmt;
29570 "SELECT rowid FROM sqlite_schema"
29571 " WHERE name GLOB 'sqlite_stat[134]'",
29572 -1, &pStmt, 0);
29573 if( rc==SQLITE_OK ){
29574 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
29575 sqlite3_finalize(pStmt);
29576 }
29577 }
29578 if( doStats==0 ){
29579 sqlite3_fputs("/* No STAT tables available */\n", p->out);
29580 }else{
29581 sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
29582 data.cMode = data.mode = MODE_Insert;
29583 data.zDestTable = "sqlite_stat1";
29584 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
29585 data.zDestTable = "sqlite_stat4";
29586 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
29587 sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
29588 }
29589 }else
29590
29591 if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
29592 if( nArg==2 ){
29593 p->showHeader = booleanValue(azArg[1]);
29595 }else{
29596 eputz("Usage: .headers on|off\n");
29597 rc = 1;
29598 }
29599 }else
29600
29601 if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
29602 if( nArg>=2 ){
29603 n = showHelp(p->out, azArg[1]);
29604 if( n==0 ){
29605 sqlite3_fprintf(p->out, "Nothing matches '%s'\n", azArg[1]);
29606 }
29607 }else{
29608 showHelp(p->out, 0);
29609 }
29610 }else
29611
29612#ifndef SQLITE_SHELL_FIDDLE
29613 if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
29614 char *zTable = 0; /* Insert data into this table */
29615 char *zSchema = 0; /* Schema of zTable */
29616 char *zFile = 0; /* Name of file to extra content from */
29617 sqlite3_stmt *pStmt = NULL; /* A statement */
29618 int nCol; /* Number of columns in the table */
29619 i64 nByte; /* Number of bytes in an SQL string */
29620 int i, j; /* Loop counters */
29621 int needCommit; /* True to COMMIT or ROLLBACK at end */
29622 int nSep; /* Number of bytes in p->colSeparator[] */
29623 char *zSql = 0; /* An SQL statement */
29624 ImportCtx sCtx; /* Reader context */
29625 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
29626 int eVerbose = 0; /* Larger for more console output */
29627 int nSkip = 0; /* Initial lines to skip */
29628 int useOutputMode = 1; /* Use output mode to determine separators */
29629 char *zCreate = 0; /* CREATE TABLE statement text */
29630
29631 failIfSafeMode(p, "cannot run .import in safe mode");
29632 memset(&sCtx, 0, sizeof(sCtx));
29633 if( p->mode==MODE_Ascii ){
29634 xRead = ascii_read_one_field;
29635 }else{
29636 xRead = csv_read_one_field;
29637 }
29638 rc = 1;
29639 for(i=1; i<nArg; i++){
29640 char *z = azArg[i];
29641 if( z[0]=='-' && z[1]=='-' ) z++;
29642 if( z[0]!='-' ){
29643 if( zFile==0 ){
29644 zFile = z;
29645 }else if( zTable==0 ){
29646 zTable = z;
29647 }else{
29648 sqlite3_fprintf(p->out, "ERROR: extra argument: \"%s\". Usage:\n",z);
29649 showHelp(p->out, "import");
29650 goto meta_command_exit;
29651 }
29652 }else if( cli_strcmp(z,"-v")==0 ){
29653 eVerbose++;
29654 }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
29655 zSchema = azArg[++i];
29656 }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
29657 nSkip = integerValue(azArg[++i]);
29658 }else if( cli_strcmp(z,"-ascii")==0 ){
29659 sCtx.cColSep = SEP_Unit[0];
29660 sCtx.cRowSep = SEP_Record[0];
29661 xRead = ascii_read_one_field;
29662 useOutputMode = 0;
29663 }else if( cli_strcmp(z,"-csv")==0 ){
29664 sCtx.cColSep = ',';
29665 sCtx.cRowSep = '\n';
29666 xRead = csv_read_one_field;
29667 useOutputMode = 0;
29668 }else{
29669 sqlite3_fprintf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z);
29670 showHelp(p->out, "import");
29671 goto meta_command_exit;
29672 }
29673 }
29674 if( zTable==0 ){
29675 sqlite3_fprintf(p->out, "ERROR: missing %s argument. Usage:\n",
29676 zFile==0 ? "FILE" : "TABLE");
29677 showHelp(p->out, "import");
29678 goto meta_command_exit;
29679 }
29680 seenInterrupt = 0;
29681 open_db(p, 0);
29682 if( useOutputMode ){
29683 /* If neither the --csv or --ascii options are specified, then set
29684 ** the column and row separator characters from the output mode. */
29686 if( nSep==0 ){
29687 eputz("Error: non-null column separator required for import\n");
29688 goto meta_command_exit;
29689 }
29690 if( nSep>1 ){
29691 eputz("Error: multi-character column separators not allowed"
29692 " for import\n");
29693 goto meta_command_exit;
29694 }
29696 if( nSep==0 ){
29697 eputz("Error: non-null row separator required for import\n");
29698 goto meta_command_exit;
29699 }
29700 if( nSep==2 && p->mode==MODE_Csv
29702 ){
29703 /* When importing CSV (only), if the row separator is set to the
29704 ** default output row separator, change it to the default input
29705 ** row separator. This avoids having to maintain different input
29706 ** and output row separators. */
29709 }
29710 if( nSep>1 ){
29711 eputz("Error: multi-character row separators not allowed"
29712 " for import\n");
29713 goto meta_command_exit;
29714 }
29715 sCtx.cColSep = (u8)p->colSeparator[0];
29716 sCtx.cRowSep = (u8)p->rowSeparator[0];
29717 }
29718 sCtx.zFile = zFile;
29719 sCtx.nLine = 1;
29720 if( sCtx.zFile[0]=='|' ){
29721#ifdef SQLITE_OMIT_POPEN
29722 eputz("Error: pipes are not supported in this OS\n");
29723 goto meta_command_exit;
29724#else
29725 sCtx.in = sqlite3_popen(sCtx.zFile+1, "r");
29726 sCtx.zFile = "<pipe>";
29727 sCtx.xCloser = pclose;
29728#endif
29729 }else{
29730 sCtx.in = sqlite3_fopen(sCtx.zFile, "rb");
29731 sCtx.xCloser = fclose;
29732 }
29733 if( sCtx.in==0 ){
29734 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zFile);
29735 goto meta_command_exit;
29736 }
29737 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
29738 char zSep[2];
29739 zSep[1] = 0;
29740 zSep[0] = sCtx.cColSep;
29741 sqlite3_fputs("Column separator ", p->out);
29742 output_c_string(p->out, zSep);
29743 sqlite3_fputs(", row separator ", p->out);
29744 zSep[0] = sCtx.cRowSep;
29745 output_c_string(p->out, zSep);
29746 sqlite3_fputs("\n", p->out);
29747 }
29748 sCtx.z = sqlite3_malloc64(120);
29749 if( sCtx.z==0 ){
29750 import_cleanup(&sCtx);
29752 }
29753 /* Below, resources must be freed before exit. */
29754 while( (nSkip--)>0 ){
29755 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
29756 }
29757 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
29758 if( sqlite3_table_column_metadata(p->db, zSchema, zTable,0,0,0,0,0,0)
29759 && 0==db_int(p->db, "SELECT count(*) FROM \"%w\".sqlite_schema"
29760 " WHERE name=%Q AND type='view'",
29761 zSchema ? zSchema : "main", zTable)
29762 ){
29763 /* Table does not exist. Create it. */
29764 sqlite3 *dbCols = 0;
29765 char *zRenames = 0;
29766 char *zColDefs;
29767 zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"",
29768 zSchema ? zSchema : "main", zTable);
29769 while( xRead(&sCtx) ){
29770 zAutoColumn(sCtx.z, &dbCols, 0);
29771 if( sCtx.cTerm!=sCtx.cColSep ) break;
29772 }
29773 zColDefs = zAutoColumn(0, &dbCols, &zRenames);
29774 if( zRenames!=0 ){
29775 sqlite3_fprintf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
29776 "Columns renamed during .import %s due to duplicates:\n"
29777 "%s\n", sCtx.zFile, zRenames);
29778 sqlite3_free(zRenames);
29779 }
29780 assert(dbCols==0);
29781 if( zColDefs==0 ){
29782 sqlite3_fprintf(stderr,"%s: empty file\n", sCtx.zFile);
29783 import_cleanup(&sCtx);
29784 rc = 1;
29785 sqlite3_free(zCreate);
29786 goto meta_command_exit;
29787 }
29788 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
29789 if( zCreate==0 ){
29790 import_cleanup(&sCtx);
29792 }
29793 if( eVerbose>=1 ){
29794 sqlite3_fprintf(p->out, "%s\n", zCreate);
29795 }
29796 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
29797 if( rc ){
29798 sqlite3_fprintf(stderr,
29799 "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
29800 }
29801 sqlite3_free(zCreate);
29802 zCreate = 0;
29803 if( rc ){
29804 import_cleanup(&sCtx);
29805 rc = 1;
29806 goto meta_command_exit;
29807 }
29808 }
29809 zSql = sqlite3_mprintf("SELECT count(*) FROM pragma_table_info(%Q,%Q);",
29810 zTable, zSchema);
29811 if( zSql==0 ){
29812 import_cleanup(&sCtx);
29814 }
29815 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
29816 sqlite3_free(zSql);
29817 zSql = 0;
29818 if( rc ){
29819 if (pStmt) sqlite3_finalize(pStmt);
29820 shellDatabaseError(p->db);
29821 import_cleanup(&sCtx);
29822 rc = 1;
29823 goto meta_command_exit;
29824 }
29825 if( sqlite3_step(pStmt)==SQLITE_ROW ){
29826 nCol = sqlite3_column_int(pStmt, 0);
29827 }else{
29828 nCol = 0;
29829 }
29830 sqlite3_finalize(pStmt);
29831 pStmt = 0;
29832 if( nCol==0 ) return 0; /* no columns, no error */
29833
29834 nByte = 64 /* space for "INSERT INTO", "VALUES(", ")\0" */
29835 + (zSchema ? strlen(zSchema)*2 + 2: 0) /* Quoted schema name */
29836 + strlen(zTable)*2 + 2 /* Quoted table name */
29837 + nCol*2; /* Space for ",?" for each column */
29838 zSql = sqlite3_malloc64( nByte );
29839 if( zSql==0 ){
29840 import_cleanup(&sCtx);
29842 }
29843 if( zSchema ){
29844 sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?",
29845 zSchema, zTable);
29846 }else{
29847 sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
29848 }
29849 j = strlen30(zSql);
29850 for(i=1; i<nCol; i++){
29851 zSql[j++] = ',';
29852 zSql[j++] = '?';
29853 }
29854 zSql[j++] = ')';
29855 zSql[j] = 0;
29856 assert( j<nByte );
29857 if( eVerbose>=2 ){
29858 sqlite3_fprintf(p->out, "Insert using: %s\n", zSql);
29859 }
29860 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
29861 sqlite3_free(zSql);
29862 zSql = 0;
29863 if( rc ){
29864 shellDatabaseError(p->db);
29865 if (pStmt) sqlite3_finalize(pStmt);
29866 import_cleanup(&sCtx);
29867 rc = 1;
29868 goto meta_command_exit;
29869 }
29870 needCommit = sqlite3_get_autocommit(p->db);
29871 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
29872 do{
29873 int startLine = sCtx.nLine;
29874 for(i=0; i<nCol; i++){
29875 char *z = xRead(&sCtx);
29876 /*
29877 ** Did we reach end-of-file before finding any columns?
29878 ** If so, stop instead of NULL filling the remaining columns.
29879 */
29880 if( z==0 && i==0 ) break;
29881 /*
29882 ** Did we reach end-of-file OR end-of-line before finding any
29883 ** columns in ASCII mode? If so, stop instead of NULL filling
29884 ** the remaining columns.
29885 */
29886 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
29887 /*
29888 ** For CSV mode, per RFC 4180, accept EOF in lieu of final
29889 ** record terminator but only for last field of multi-field row.
29890 ** (If there are too few fields, it's not valid CSV anyway.)
29891 */
29892 if( z==0 && (xRead==csv_read_one_field) && i==nCol-1 && i>0 ){
29893 z = "";
29894 }
29896 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
29897 sqlite3_fprintf(stderr,"%s:%d: expected %d columns but found %d"
29898 " - filling the rest with NULL\n",
29899 sCtx.zFile, startLine, nCol, i+1);
29900 i += 2;
29901 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
29902 }
29903 }
29904 if( sCtx.cTerm==sCtx.cColSep ){
29905 do{
29906 xRead(&sCtx);
29907 i++;
29908 }while( sCtx.cTerm==sCtx.cColSep );
29909 sqlite3_fprintf(stderr,
29910 "%s:%d: expected %d columns but found %d - extras ignored\n",
29911 sCtx.zFile, startLine, nCol, i);
29912 }
29913 if( i>=nCol ){
29914 sqlite3_step(pStmt);
29915 rc = sqlite3_reset(pStmt);
29916 if( rc!=SQLITE_OK ){
29917 sqlite3_fprintf(stderr,"%s:%d: INSERT failed: %s\n",
29918 sCtx.zFile, startLine, sqlite3_errmsg(p->db));
29919 sCtx.nErr++;
29920 }else{
29921 sCtx.nRow++;
29922 }
29923 }
29924 }while( sCtx.cTerm!=EOF );
29925
29926 import_cleanup(&sCtx);
29927 sqlite3_finalize(pStmt);
29928 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
29929 if( eVerbose>0 ){
29930 sqlite3_fprintf(p->out,
29931 "Added %d rows with %d errors using %d lines of input\n",
29932 sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
29933 }
29934 }else
29935#endif /* !defined(SQLITE_SHELL_FIDDLE) */
29936
29937#ifndef SQLITE_UNTESTABLE
29938 if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
29939 char *zSql;
29940 char *zCollist = 0;
29941 sqlite3_stmt *pStmt;
29942 int tnum = 0;
29943 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */
29944 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
29945 int i;
29947 sqlite3_fprintf(stderr,".%s unavailable without --unsafe-testing\n",
29948 "imposter");
29949 rc = 1;
29950 goto meta_command_exit;
29951 }
29952 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
29953 eputz("Usage: .imposter INDEX IMPOSTER\n"
29954 " .imposter off\n");
29955 /* Also allowed, but not documented:
29956 **
29957 ** .imposter TABLE IMPOSTER
29958 **
29959 ** where TABLE is a WITHOUT ROWID table. In that case, the
29960 ** imposter is another WITHOUT ROWID table with the columns in
29961 ** storage order. */
29962 rc = 1;
29963 goto meta_command_exit;
29964 }
29965 open_db(p, 0);
29966 if( nArg==2 ){
29968 goto meta_command_exit;
29969 }
29970 zSql = sqlite3_mprintf(
29971 "SELECT rootpage, 0 FROM sqlite_schema"
29972 " WHERE name='%q' AND type='index'"
29973 "UNION ALL "
29974 "SELECT rootpage, 1 FROM sqlite_schema"
29975 " WHERE name='%q' AND type='table'"
29976 " AND sql LIKE '%%without%%rowid%%'",
29977 azArg[1], azArg[1]
29978 );
29979 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
29980 sqlite3_free(zSql);
29981 if( sqlite3_step(pStmt)==SQLITE_ROW ){
29982 tnum = sqlite3_column_int(pStmt, 0);
29983 isWO = sqlite3_column_int(pStmt, 1);
29984 }
29985 sqlite3_finalize(pStmt);
29986 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
29987 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
29988 sqlite3_free(zSql);
29989 i = 0;
29990 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
29991 char zLabel[20];
29992 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
29993 i++;
29994 if( zCol==0 ){
29995 if( sqlite3_column_int(pStmt,1)==-1 ){
29996 zCol = "_ROWID_";
29997 }else{
29998 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
29999 zCol = zLabel;
30000 }
30001 }
30002 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
30003 lenPK = (int)strlen(zCollist);
30004 }
30005 if( zCollist==0 ){
30006 zCollist = sqlite3_mprintf("\"%w\"", zCol);
30007 }else{
30008 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
30009 }
30010 }
30011 sqlite3_finalize(pStmt);
30012 if( i==0 || tnum==0 ){
30013 sqlite3_fprintf(stderr,"no such index: \"%s\"\n", azArg[1]);
30014 rc = 1;
30015 sqlite3_free(zCollist);
30016 goto meta_command_exit;
30017 }
30018 if( lenPK==0 ) lenPK = 100000;
30019 zSql = sqlite3_mprintf(
30020 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
30021 azArg[2], zCollist, lenPK, zCollist);
30022 sqlite3_free(zCollist);
30024 if( rc==SQLITE_OK ){
30025 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
30027 if( rc ){
30028 sqlite3_fprintf(stderr,
30029 "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
30030 }else{
30031 sqlite3_fprintf(stdout, "%s;\n", zSql);
30032 sqlite3_fprintf(stdout,
30033 "WARNING: writing to an imposter table will corrupt"
30034 " the \"%s\" %s!\n", azArg[1], isWO ? "table" : "index");
30035 }
30036 }else{
30037 sqlite3_fprintf(stderr,"SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
30038 rc = 1;
30039 }
30040 sqlite3_free(zSql);
30041 }else
30042#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
30043
30044 if( c=='i' && cli_strncmp(azArg[0], "intck", n)==0 ){
30045 i64 iArg = 0;
30046 if( nArg==2 ){
30047 iArg = integerValue(azArg[1]);
30048 if( iArg==0 ) iArg = -1;
30049 }
30050 if( (nArg!=1 && nArg!=2) || iArg<0 ){
30051 sqlite3_fprintf(stderr,"%s","Usage: .intck STEPS_PER_UNLOCK\n");
30052 rc = 1;
30053 goto meta_command_exit;
30054 }
30055 open_db(p, 0);
30056 rc = intckDatabaseCmd(p, iArg);
30057 }else
30058
30059#ifdef SQLITE_ENABLE_IOTRACE
30060 if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
30061 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
30062 if( iotrace && iotrace!=stdout ) fclose(iotrace);
30063 iotrace = 0;
30064 if( nArg<2 ){
30065 sqlite3IoTrace = 0;
30066 }else if( cli_strcmp(azArg[1], "-")==0 ){
30067 sqlite3IoTrace = iotracePrintf;
30068 iotrace = stdout;
30069 }else{
30070 iotrace = sqlite3_fopen(azArg[1], "w");
30071 if( iotrace==0 ){
30072 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
30073 sqlite3IoTrace = 0;
30074 rc = 1;
30075 }else{
30076 sqlite3IoTrace = iotracePrintf;
30077 }
30078 }
30079 }else
30080#endif
30081
30082 if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
30083 static const struct {
30084 const char *zLimitName; /* Name of a limit */
30085 int limitCode; /* Integer code for that limit */
30086 } aLimit[] = {
30087 { "length", SQLITE_LIMIT_LENGTH },
30088 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
30089 { "column", SQLITE_LIMIT_COLUMN },
30090 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
30091 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
30092 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
30093 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
30094 { "attached", SQLITE_LIMIT_ATTACHED },
30095 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
30096 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
30097 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
30098 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
30099 };
30100 int i, n2;
30101 open_db(p, 0);
30102 if( nArg==1 ){
30103 for(i=0; i<ArraySize(aLimit); i++){
30104 sqlite3_fprintf(stdout, "%20s %d\n", aLimit[i].zLimitName,
30105 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
30106 }
30107 }else if( nArg>3 ){
30108 eputz("Usage: .limit NAME ?NEW-VALUE?\n");
30109 rc = 1;
30110 goto meta_command_exit;
30111 }else{
30112 int iLimit = -1;
30113 n2 = strlen30(azArg[1]);
30114 for(i=0; i<ArraySize(aLimit); i++){
30115 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
30116 if( iLimit<0 ){
30117 iLimit = i;
30118 }else{
30119 sqlite3_fprintf(stderr,"ambiguous limit: \"%s\"\n", azArg[1]);
30120 rc = 1;
30121 goto meta_command_exit;
30122 }
30123 }
30124 }
30125 if( iLimit<0 ){
30126 sqlite3_fprintf(stderr,"unknown limit: \"%s\"\n"
30127 "enter \".limits\" with no arguments for a list.\n",
30128 azArg[1]);
30129 rc = 1;
30130 goto meta_command_exit;
30131 }
30132 if( nArg==3 ){
30133 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
30134 (int)integerValue(azArg[2]));
30135 }
30136 sqlite3_fprintf(stdout, "%20s %d\n", aLimit[iLimit].zLimitName,
30137 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
30138 }
30139 }else
30140
30141 if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
30142 open_db(p, 0);
30143 lintDotCommand(p, azArg, nArg);
30144 }else
30145
30146#if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
30147 if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
30148 const char *zFile, *zProc;
30149 char *zErrMsg = 0;
30150 failIfSafeMode(p, "cannot run .load in safe mode");
30151 if( nArg<2 || azArg[1][0]==0 ){
30152 /* Must have a non-empty FILE. (Will not load self.) */
30153 eputz("Usage: .load FILE ?ENTRYPOINT?\n");
30154 rc = 1;
30155 goto meta_command_exit;
30156 }
30157 zFile = azArg[1];
30158 zProc = nArg>=3 ? azArg[2] : 0;
30159 open_db(p, 0);
30160 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
30161 if( rc!=SQLITE_OK ){
30162 shellEmitError(zErrMsg);
30163 sqlite3_free(zErrMsg);
30164 rc = 1;
30165 }
30166 }else
30167#endif
30168
30169 if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
30170 if( nArg!=2 ){
30171 eputz("Usage: .log FILENAME\n");
30172 rc = 1;
30173 }else{
30174 const char *zFile = azArg[1];
30175 if( p->bSafeMode
30176 && cli_strcmp(zFile,"on")!=0
30177 && cli_strcmp(zFile,"off")!=0
30178 ){
30179 sputz(stdout, "cannot set .log to anything other"
30180 " than \"on\" or \"off\"\n");
30181 zFile = "off";
30182 }
30183 output_file_close(p->pLog);
30184 if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
30185 p->pLog = output_file_open(zFile);
30186 }
30187 }else
30188
30189 if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
30190 const char *zMode = 0;
30191 const char *zTabname = 0;
30192 int i, n2;
30193 int chng = 0; /* 0x01: change to cmopts. 0x02: Any other change */
30194 ColModeOpts cmOpts = ColModeOpts_default;
30195 for(i=1; i<nArg; i++){
30196 const char *z = azArg[i];
30197 if( optionMatch(z,"wrap") && i+1<nArg ){
30198 cmOpts.iWrap = integerValue(azArg[++i]);
30199 chng |= 1;
30200 }else if( optionMatch(z,"ww") ){
30201 cmOpts.bWordWrap = 1;
30202 chng |= 1;
30203 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
30204 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
30205 chng |= 1;
30206 }else if( optionMatch(z,"quote") ){
30207 cmOpts.bQuote = 1;
30208 chng |= 1;
30209 }else if( optionMatch(z,"noquote") ){
30210 cmOpts.bQuote = 0;
30211 chng |= 1;
30212 }else if( optionMatch(z,"escape") && i+1<nArg ){
30213 /* See similar code at tag-20250224-1 */
30214 const char *zEsc = azArg[++i];
30215 int k;
30216 for(k=0; k<ArraySize(shell_EscModeNames); k++){
30217 if( sqlite3_stricmp(zEsc,shell_EscModeNames[k])==0 ){
30218 p->eEscMode = k;
30219 chng |= 2;
30220 break;
30221 }
30222 }
30223 if( k>=ArraySize(shell_EscModeNames) ){
30224 sqlite3_fprintf(stderr, "unknown control character escape mode \"%s\""
30225 " - choices:", zEsc);
30226 for(k=0; k<ArraySize(shell_EscModeNames); k++){
30227 sqlite3_fprintf(stderr, " %s", shell_EscModeNames[k]);
30228 }
30229 sqlite3_fprintf(stderr, "\n");
30230 rc = 1;
30231 goto meta_command_exit;
30232 }
30233 }else if( zMode==0 ){
30234 zMode = z;
30235 /* Apply defaults for qbox pseudo-mode. If that
30236 * overwrites already-set values, user was informed of this.
30237 */
30238 chng |= 1;
30239 if( cli_strcmp(z, "qbox")==0 ){
30240 ColModeOpts cmo = ColModeOpts_default_qbox;
30241 zMode = "box";
30242 cmOpts = cmo;
30243 }
30244 }else if( zTabname==0 ){
30245 zTabname = z;
30246 }else if( z[0]=='-' ){
30247 sqlite3_fprintf(stderr,"unknown option: %s\n", z);
30248 eputz("options:\n"
30249 " --escape MODE\n"
30250 " --noquote\n"
30251 " --quote\n"
30252 " --wordwrap on/off\n"
30253 " --wrap N\n"
30254 " --ww\n");
30255 rc = 1;
30256 goto meta_command_exit;
30257 }else{
30258 sqlite3_fprintf(stderr,"extra argument: \"%s\"\n", z);
30259 rc = 1;
30260 goto meta_command_exit;
30261 }
30262 }
30263 if( !chng ){
30264 if( p->mode==MODE_Column
30266 ){
30267 sqlite3_fprintf(p->out,
30268 "current output mode: %s --wrap %d --wordwrap %s "
30269 "--%squote --escape %s\n",
30270 modeDescr[p->mode], p->cmOpts.iWrap,
30271 p->cmOpts.bWordWrap ? "on" : "off",
30272 p->cmOpts.bQuote ? "" : "no",
30273 shell_EscModeNames[p->eEscMode]
30274 );
30275 }else{
30276 sqlite3_fprintf(p->out,
30277 "current output mode: %s --escape %s\n",
30278 modeDescr[p->mode],
30279 shell_EscModeNames[p->eEscMode]
30280 );
30281 }
30282 }
30283 if( zMode==0 ){
30284 zMode = modeDescr[p->mode];
30285 if( (chng&1)==0 ) cmOpts = p->cmOpts;
30286 }
30287 n2 = strlen30(zMode);
30288 if( cli_strncmp(zMode,"lines",n2)==0 ){
30289 p->mode = MODE_Line;
30291 }else if( cli_strncmp(zMode,"columns",n2)==0 ){
30293 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
30294 p->showHeader = 1;
30295 }
30297 p->cmOpts = cmOpts;
30298 }else if( cli_strncmp(zMode,"list",n2)==0 ){
30299 p->mode = MODE_List;
30302 }else if( cli_strncmp(zMode,"html",n2)==0 ){
30303 p->mode = MODE_Html;
30304 }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
30305 p->mode = MODE_Tcl;
30308 }else if( cli_strncmp(zMode,"csv",n2)==0 ){
30309 p->mode = MODE_Csv;
30312 }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
30313 p->mode = MODE_List;
30315 }else if( cli_strncmp(zMode,"insert",n2)==0 ){
30317 set_table_name(p, zTabname ? zTabname : "table");
30318 if( p->eEscMode==SHELL_ESC_OFF ){
30320 }else{
30322 }
30323 }else if( cli_strncmp(zMode,"quote",n2)==0 ){
30324 p->mode = MODE_Quote;
30327 }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
30328 p->mode = MODE_Ascii;
30331 }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
30333 p->cmOpts = cmOpts;
30334 }else if( cli_strncmp(zMode,"table",n2)==0 ){
30335 p->mode = MODE_Table;
30336 p->cmOpts = cmOpts;
30337 }else if( cli_strncmp(zMode,"box",n2)==0 ){
30338 p->mode = MODE_Box;
30339 p->cmOpts = cmOpts;
30340 }else if( cli_strncmp(zMode,"count",n2)==0 ){
30341 p->mode = MODE_Count;
30342 }else if( cli_strncmp(zMode,"off",n2)==0 ){
30343 p->mode = MODE_Off;
30344 }else if( cli_strncmp(zMode,"json",n2)==0 ){
30345 p->mode = MODE_Json;
30346 }else{
30347 eputz("Error: mode should be one of: "
30348 "ascii box column csv html insert json line list markdown "
30349 "qbox quote table tabs tcl\n");
30350 rc = 1;
30351 }
30352 p->cMode = p->mode;
30353 }else
30354
30355#ifndef SQLITE_SHELL_FIDDLE
30356 if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
30357 if( nArg!=2 ){
30358 eputz("Usage: .nonce NONCE\n");
30359 rc = 1;
30360 }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
30361 sqlite3_fprintf(stderr,"line %d: incorrect nonce: \"%s\"\n",
30362 p->lineno, azArg[1]);
30363 exit(1);
30364 }else{
30365 p->bSafeMode = 0;
30366 return 0; /* Return immediately to bypass the safe mode reset
30367 ** at the end of this procedure */
30368 }
30369 }else
30370#endif /* !defined(SQLITE_SHELL_FIDDLE) */
30371
30372 if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
30373 if( nArg==2 ){
30375 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
30376 }else{
30377 eputz("Usage: .nullvalue STRING\n");
30378 rc = 1;
30379 }
30380 }else
30381
30382 if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
30383 const char *zFN = 0; /* Pointer to constant filename */
30384 char *zNewFilename = 0; /* Name of the database file to open */
30385 int iName = 1; /* Index in azArg[] of the filename */
30386 int newFlag = 0; /* True to delete file before opening */
30387 int openMode = SHELL_OPEN_UNSPEC;
30388
30389 /* Check for command-line arguments */
30390 for(iName=1; iName<nArg; iName++){
30391 const char *z = azArg[iName];
30392#ifndef SQLITE_SHELL_FIDDLE
30393 if( optionMatch(z,"new") ){
30394 newFlag = 1;
30395#ifdef SQLITE_HAVE_ZLIB
30396 }else if( optionMatch(z, "zip") ){
30397 openMode = SHELL_OPEN_ZIPFILE;
30398#endif
30399 }else if( optionMatch(z, "append") ){
30400 openMode = SHELL_OPEN_APPENDVFS;
30401 }else if( optionMatch(z, "readonly") ){
30402 openMode = SHELL_OPEN_READONLY;
30403 }else if( optionMatch(z, "nofollow") ){
30405#ifndef SQLITE_OMIT_DESERIALIZE
30406 }else if( optionMatch(z, "deserialize") ){
30407 openMode = SHELL_OPEN_DESERIALIZE;
30408 }else if( optionMatch(z, "hexdb") ){
30409 openMode = SHELL_OPEN_HEXDB;
30410 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
30411 p->szMax = integerValue(azArg[++iName]);
30412#endif /* SQLITE_OMIT_DESERIALIZE */
30413 }else
30414#endif /* !SQLITE_SHELL_FIDDLE */
30415 if( z[0]=='-' ){
30416 sqlite3_fprintf(stderr,"unknown option: %s\n", z);
30417 rc = 1;
30418 goto meta_command_exit;
30419 }else if( zFN ){
30420 sqlite3_fprintf(stderr,"extra argument: \"%s\"\n", z);
30421 rc = 1;
30422 goto meta_command_exit;
30423 }else{
30424 zFN = z;
30425 }
30426 }
30427
30428 /* Close the existing database */
30429 session_close_all(p, -1);
30430 close_db(p->db);
30431 p->db = 0;
30432 p->pAuxDb->zDbFilename = 0;
30434 p->pAuxDb->zFreeOnClose = 0;
30435 p->openMode = openMode;
30436 p->openFlags = 0;
30437 p->szMax = 0;
30438
30439 /* If a filename is specified, try to open it first */
30440 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
30441 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
30442#ifndef SQLITE_SHELL_FIDDLE
30443 if( p->bSafeMode
30445 && zFN
30446 && cli_strcmp(zFN,":memory:")!=0
30447 ){
30448 failIfSafeMode(p, "cannot open disk-based database files in safe mode");
30449 }
30450#else
30451 /* WASM mode has its own sandboxed pseudo-filesystem. */
30452#endif
30453 if( zFN ){
30454 zNewFilename = sqlite3_mprintf("%s", zFN);
30455 shell_check_oom(zNewFilename);
30456 }else{
30457 zNewFilename = 0;
30458 }
30459 p->pAuxDb->zDbFilename = zNewFilename;
30460 open_db(p, OPEN_DB_KEEPALIVE);
30461 if( p->db==0 ){
30462 sqlite3_fprintf(stderr,"Error: cannot open '%s'\n", zNewFilename);
30463 sqlite3_free(zNewFilename);
30464 }else{
30465 p->pAuxDb->zFreeOnClose = zNewFilename;
30466 }
30467 }
30468 if( p->db==0 ){
30469 /* As a fall-back open a TEMP database */
30470 p->pAuxDb->zDbFilename = 0;
30471 open_db(p, 0);
30472 }
30473 }else
30474
30475#ifndef SQLITE_SHELL_FIDDLE
30476 if( (c=='o'
30477 && (cli_strncmp(azArg[0], "output", n)==0
30478 || cli_strncmp(azArg[0], "once", n)==0))
30479 || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
30480 || (c=='w' && n==3 && cli_strcmp(azArg[0],"www")==0)
30481 ){
30482 char *zFile = 0;
30483 int i;
30484 int eMode = 0; /* 0: .outout/.once, 'x'=.excel, 'w'=.www */
30485 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel/.www */
30486 int bPlain = 0; /* --plain option */
30487 static const char *zBomUtf8 = "\357\273\277";
30488 const char *zBom = 0;
30489
30490 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
30491 if( c=='e' ){
30492 eMode = 'x';
30493 bOnce = 2;
30494 }else if( c=='w' ){
30495 eMode = 'w';
30496 bOnce = 2;
30497 }else if( cli_strncmp(azArg[0],"once",n)==0 ){
30498 bOnce = 1;
30499 }
30500 for(i=1; i<nArg; i++){
30501 char *z = azArg[i];
30502 if( z[0]=='-' ){
30503 if( z[1]=='-' ) z++;
30504 if( cli_strcmp(z,"-bom")==0 ){
30505 zBom = zBomUtf8;
30506 }else if( cli_strcmp(z,"-plain")==0 ){
30507 bPlain = 1;
30508 }else if( c=='o' && cli_strcmp(z,"-x")==0 ){
30509 eMode = 'x'; /* spreadsheet */
30510 }else if( c=='o' && cli_strcmp(z,"-e")==0 ){
30511 eMode = 'e'; /* text editor */
30512 }else if( c=='o' && cli_strcmp(z,"-w")==0 ){
30513 eMode = 'w'; /* Web browser */
30514 }else{
30515 sqlite3_fprintf(p->out,
30516 "ERROR: unknown option: \"%s\". Usage:\n", azArg[i]);
30517 showHelp(p->out, azArg[0]);
30518 rc = 1;
30519 goto meta_command_exit;
30520 }
30521 }else if( zFile==0 && eMode==0 ){
30522 if( cli_strcmp(z, "off")==0 ){
30523#ifdef _WIN32
30524 zFile = sqlite3_mprintf("nul");
30525#else
30526 zFile = sqlite3_mprintf("/dev/null");
30527#endif
30528 }else{
30529 zFile = sqlite3_mprintf("%s", z);
30530 }
30531 if( zFile && zFile[0]=='|' ){
30532 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
30533 break;
30534 }
30535 }else{
30536 sqlite3_fprintf(p->out,
30537 "ERROR: extra parameter: \"%s\". Usage:\n", azArg[i]);
30538 showHelp(p->out, azArg[0]);
30539 rc = 1;
30540 sqlite3_free(zFile);
30541 goto meta_command_exit;
30542 }
30543 }
30544 if( zFile==0 ){
30545 zFile = sqlite3_mprintf("stdout");
30546 }
30547 shell_check_oom(zFile);
30548 if( bOnce ){
30549 p->outCount = 2;
30550 }else{
30551 p->outCount = 0;
30552 }
30553 output_reset(p);
30554#ifndef SQLITE_NOHAVE_SYSTEM
30555 if( eMode=='e' || eMode=='x' || eMode=='w' ){
30556 p->doXdgOpen = 1;
30557 outputModePush(p);
30558 if( eMode=='x' ){
30559 /* spreadsheet mode. Output as CSV. */
30560 newTempFile(p, "csv");
30562 p->mode = MODE_Csv;
30565#ifdef _WIN32
30566 zBom = zBomUtf8; /* Always include the BOM on Windows, as Excel does
30567 ** not work without it. */
30568#endif
30569 }else if( eMode=='w' ){
30570 /* web-browser mode. */
30571 newTempFile(p, "html");
30572 if( !bPlain ) p->mode = MODE_Www;
30573 }else{
30574 /* text editor mode */
30575 newTempFile(p, "txt");
30576 }
30577 sqlite3_free(zFile);
30578 zFile = sqlite3_mprintf("%s", p->zTempFile);
30579 }
30580#endif /* SQLITE_NOHAVE_SYSTEM */
30581 shell_check_oom(zFile);
30582 if( zFile[0]=='|' ){
30583#ifdef SQLITE_OMIT_POPEN
30584 eputz("Error: pipes are not supported in this OS\n");
30585 rc = 1;
30586 output_redir(p, stdout);
30587#else
30588 FILE *pfPipe = sqlite3_popen(zFile + 1, "w");
30589 if( pfPipe==0 ){
30590 assert( stderr!=NULL );
30591 sqlite3_fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
30592 rc = 1;
30593 }else{
30594 output_redir(p, pfPipe);
30595 if( zBom ) sqlite3_fputs(zBom, pfPipe);
30596 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
30597 }
30598#endif
30599 }else{
30600 FILE *pfFile = output_file_open(zFile);
30601 if( pfFile==0 ){
30602 if( cli_strcmp(zFile,"off")!=0 ){
30603 assert( stderr!=NULL );
30604 sqlite3_fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
30605 }
30606 rc = 1;
30607 } else {
30608 output_redir(p, pfFile);
30609 if( zBom ) sqlite3_fputs(zBom, pfFile);
30610 if( bPlain && eMode=='w' ){
30611 sqlite3_fputs(
30612 "<!DOCTYPE html>\n<BODY>\n<PLAINTEXT>\n",
30613 pfFile
30614 );
30615 }
30616 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
30617 }
30618 }
30619 sqlite3_free(zFile);
30620 }else
30621#endif /* !defined(SQLITE_SHELL_FIDDLE) */
30622
30623 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
30624 open_db(p,0);
30625 if( nArg<=1 ) goto parameter_syntax_error;
30626
30627 /* .parameter clear
30628 ** Clear all bind parameters by dropping the TEMP table that holds them.
30629 */
30630 if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
30631 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
30632 0, 0, 0);
30633 }else
30634
30635 /* .parameter list
30636 ** List all bind parameters.
30637 */
30638 if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
30639 sqlite3_stmt *pStmt = 0;
30640 int rx;
30641 int len = 0;
30643 "SELECT max(length(key)) "
30644 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
30645 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
30646 len = sqlite3_column_int(pStmt, 0);
30647 if( len>40 ) len = 40;
30648 }
30649 sqlite3_finalize(pStmt);
30650 pStmt = 0;
30651 if( len ){
30653 "SELECT key, quote(value) "
30654 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
30655 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
30656 sqlite3_fprintf(p->out,
30657 "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
30659 }
30660 sqlite3_finalize(pStmt);
30661 }
30662 }else
30663
30664 /* .parameter init
30665 ** Make sure the TEMP table used to hold bind parameters exists.
30666 ** Create it if necessary.
30667 */
30668 if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
30669 bind_table_init(p);
30670 }else
30671
30672 /* .parameter set NAME VALUE
30673 ** Set or reset a bind parameter. NAME should be the full parameter
30674 ** name exactly as it appears in the query. (ex: $abc, @def). The
30675 ** VALUE can be in either SQL literal notation, or if not it will be
30676 ** understood to be a text string.
30677 */
30678 if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
30679 int rx;
30680 char *zSql;
30681 sqlite3_stmt *pStmt;
30682 const char *zKey = azArg[2];
30683 const char *zValue = azArg[3];
30684 bind_table_init(p);
30685 zSql = sqlite3_mprintf(
30686 "REPLACE INTO temp.sqlite_parameters(key,value)"
30687 "VALUES(%Q,%s);", zKey, zValue);
30689 pStmt = 0;
30690 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
30691 sqlite3_free(zSql);
30692 if( rx!=SQLITE_OK ){
30693 sqlite3_finalize(pStmt);
30694 pStmt = 0;
30695 zSql = sqlite3_mprintf(
30696 "REPLACE INTO temp.sqlite_parameters(key,value)"
30697 "VALUES(%Q,%Q);", zKey, zValue);
30699 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
30700 sqlite3_free(zSql);
30701 if( rx!=SQLITE_OK ){
30702 sqlite3_fprintf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
30703 sqlite3_finalize(pStmt);
30704 pStmt = 0;
30705 rc = 1;
30706 }
30707 }
30708 bind_prepared_stmt(p, pStmt);
30709 sqlite3_step(pStmt);
30710 sqlite3_finalize(pStmt);
30711 }else
30712
30713 /* .parameter unset NAME
30714 ** Remove the NAME binding from the parameter binding table, if it
30715 ** exists.
30716 */
30717 if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
30718 char *zSql = sqlite3_mprintf(
30719 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
30721 sqlite3_exec(p->db, zSql, 0, 0, 0);
30722 sqlite3_free(zSql);
30723 }else
30724 /* If no command name matches, show a syntax error */
30725 parameter_syntax_error:
30726 showHelp(p->out, "parameter");
30727 }else
30728
30729 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
30730 int i;
30731 for(i=1; i<nArg; i++){
30732 if( i>1 ) sqlite3_fputs(" ", p->out);
30733 sqlite3_fputs(azArg[i], p->out);
30734 }
30735 sqlite3_fputs("\n", p->out);
30736 }else
30737
30738#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
30739 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
30740 int i;
30741 int nn = 0;
30742 p->flgProgress = 0;
30743 p->mxProgress = 0;
30744 p->nProgress = 0;
30745 for(i=1; i<nArg; i++){
30746 const char *z = azArg[i];
30747 if( z[0]=='-' ){
30748 z++;
30749 if( z[0]=='-' ) z++;
30750 if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
30752 continue;
30753 }
30754 if( cli_strcmp(z,"reset")==0 ){
30756 continue;
30757 }
30758 if( cli_strcmp(z,"once")==0 ){
30760 continue;
30761 }
30762 if( cli_strcmp(z,"limit")==0 ){
30763 if( i+1>=nArg ){
30764 eputz("Error: missing argument on --limit\n");
30765 rc = 1;
30766 goto meta_command_exit;
30767 }else{
30768 p->mxProgress = (int)integerValue(azArg[++i]);
30769 }
30770 continue;
30771 }
30772 sqlite3_fprintf(stderr,"Error: unknown option: \"%s\"\n", azArg[i]);
30773 rc = 1;
30774 goto meta_command_exit;
30775 }else{
30776 nn = (int)integerValue(z);
30777 }
30778 }
30779 open_db(p, 0);
30780 sqlite3_progress_handler(p->db, nn, progress_handler, p);
30781 }else
30782#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
30783
30784 if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
30785 if( nArg >= 2) {
30787 }
30788 if( nArg >= 3) {
30790 }
30791 }else
30792
30793#ifndef SQLITE_SHELL_FIDDLE
30794 if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
30795 rc = 2;
30796 }else
30797#endif
30798
30799#ifndef SQLITE_SHELL_FIDDLE
30800 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
30801 FILE *inSaved = p->in;
30802 int savedLineno = p->lineno;
30803 failIfSafeMode(p, "cannot run .read in safe mode");
30804 if( nArg!=2 ){
30805 eputz("Usage: .read FILE\n");
30806 rc = 1;
30807 goto meta_command_exit;
30808 }
30809 if( azArg[1][0]=='|' ){
30810#ifdef SQLITE_OMIT_POPEN
30811 eputz("Error: pipes are not supported in this OS\n");
30812 rc = 1;
30813#else
30814 p->in = sqlite3_popen(azArg[1]+1, "r");
30815 if( p->in==0 ){
30816 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
30817 rc = 1;
30818 }else{
30819 rc = process_input(p);
30820 pclose(p->in);
30821 }
30822#endif
30823 }else if( (p->in = openChrSource(azArg[1]))==0 ){
30824 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
30825 rc = 1;
30826 }else{
30827 rc = process_input(p);
30828 fclose(p->in);
30829 }
30830 p->in = inSaved;
30831 p->lineno = savedLineno;
30832 }else
30833#endif /* !defined(SQLITE_SHELL_FIDDLE) */
30834
30835#ifndef SQLITE_SHELL_FIDDLE
30836 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
30837 const char *zSrcFile;
30838 const char *zDb;
30839 sqlite3 *pSrc;
30840 sqlite3_backup *pBackup;
30841 int nTimeout = 0;
30842
30843 failIfSafeMode(p, "cannot run .restore in safe mode");
30844 if( nArg==2 ){
30845 zSrcFile = azArg[1];
30846 zDb = "main";
30847 }else if( nArg==3 ){
30848 zSrcFile = azArg[2];
30849 zDb = azArg[1];
30850 }else{
30851 eputz("Usage: .restore ?DB? FILE\n");
30852 rc = 1;
30853 goto meta_command_exit;
30854 }
30855 rc = sqlite3_open(zSrcFile, &pSrc);
30856 if( rc!=SQLITE_OK ){
30857 sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zSrcFile);
30858 close_db(pSrc);
30859 return 1;
30860 }
30861 open_db(p, 0);
30862 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
30863 if( pBackup==0 ){
30864 shellDatabaseError(p->db);
30865 close_db(pSrc);
30866 return 1;
30867 }
30868 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
30869 || rc==SQLITE_BUSY ){
30870 if( rc==SQLITE_BUSY ){
30871 if( nTimeout++ >= 3 ) break;
30872 sqlite3_sleep(100);
30873 }
30874 }
30876 if( rc==SQLITE_DONE ){
30877 rc = 0;
30878 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
30879 eputz("Error: source database is busy\n");
30880 rc = 1;
30881 }else{
30882 shellDatabaseError(p->db);
30883 rc = 1;
30884 }
30885 close_db(pSrc);
30886 }else
30887#endif /* !defined(SQLITE_SHELL_FIDDLE) */
30888
30889 if( c=='s' &&
30890 (cli_strncmp(azArg[0], "scanstats", n)==0 ||
30891 cli_strncmp(azArg[0], "scanstatus", n)==0)
30892 ){
30893 if( nArg==2 ){
30894 if( cli_strcmp(azArg[1], "vm")==0 ){
30895 p->scanstatsOn = 3;
30896 }else
30897 if( cli_strcmp(azArg[1], "est")==0 ){
30898 p->scanstatsOn = 2;
30899 }else{
30900 p->scanstatsOn = (u8)booleanValue(azArg[1]);
30901 }
30902 open_db(p, 0);
30905 );
30906#if !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
30907 eputz("Warning: .scanstats not available in this build.\n");
30908#elif !defined(SQLITE_ENABLE_BYTECODE_VTAB)
30909 if( p->scanstatsOn==3 ){
30910 eputz("Warning: \".scanstats vm\" not available in this build.\n");
30911 }
30912#endif
30913 }else{
30914 eputz("Usage: .scanstats on|off|est\n");
30915 rc = 1;
30916 }
30917 }else
30918
30919 if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
30920 ShellText sSelect;
30921 ShellState data;
30922 char *zErrMsg = 0;
30923 const char *zDiv = "(";
30924 const char *zName = 0;
30925 int iSchema = 0;
30926 int bDebug = 0;
30927 int bNoSystemTabs = 0;
30928 int ii;
30929
30930 open_db(p, 0);
30931 memcpy(&data, p, sizeof(data));
30932 data.showHeader = 0;
30933 data.cMode = data.mode = MODE_Semi;
30934 initText(&sSelect);
30935 for(ii=1; ii<nArg; ii++){
30936 if( optionMatch(azArg[ii],"indent") ){
30937 data.cMode = data.mode = MODE_Pretty;
30938 }else if( optionMatch(azArg[ii],"debug") ){
30939 bDebug = 1;
30940 }else if( optionMatch(azArg[ii],"nosys") ){
30941 bNoSystemTabs = 1;
30942 }else if( azArg[ii][0]=='-' ){
30943 sqlite3_fprintf(stderr,"Unknown option: \"%s\"\n", azArg[ii]);
30944 rc = 1;
30945 goto meta_command_exit;
30946 }else if( zName==0 ){
30947 zName = azArg[ii];
30948 }else{
30949 eputz("Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
30950 rc = 1;
30951 goto meta_command_exit;
30952 }
30953 }
30954 if( zName!=0 ){
30955 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
30956 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
30957 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
30958 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
30959 if( isSchema ){
30960 char *new_argv[2], *new_colv[2];
30961 new_argv[0] = sqlite3_mprintf(
30962 "CREATE TABLE %s (\n"
30963 " type text,\n"
30964 " name text,\n"
30965 " tbl_name text,\n"
30966 " rootpage integer,\n"
30967 " sql text\n"
30968 ")", zName);
30969 shell_check_oom(new_argv[0]);
30970 new_argv[1] = 0;
30971 new_colv[0] = "sql";
30972 new_colv[1] = 0;
30973 callback(&data, 1, new_argv, new_colv);
30974 sqlite3_free(new_argv[0]);
30975 }
30976 }
30977 if( zDiv ){
30978 sqlite3_stmt *pStmt = 0;
30979 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
30980 -1, &pStmt, 0);
30981 if( rc ){
30982 shellDatabaseError(p->db);
30983 sqlite3_finalize(pStmt);
30984 rc = 1;
30985 goto meta_command_exit;
30986 }
30987 appendText(&sSelect, "SELECT sql FROM", 0);
30988 iSchema = 0;
30989 while( sqlite3_step(pStmt)==SQLITE_ROW ){
30990 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
30991 char zScNum[30];
30992 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
30993 appendText(&sSelect, zDiv, 0);
30994 zDiv = " UNION ALL ";
30995 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
30996 if( sqlite3_stricmp(zDb, "main")!=0 ){
30997 appendText(&sSelect, zDb, '\'');
30998 }else{
30999 appendText(&sSelect, "NULL", 0);
31000 }
31001 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
31002 appendText(&sSelect, zScNum, 0);
31003 appendText(&sSelect, " AS snum, ", 0);
31004 appendText(&sSelect, zDb, '\'');
31005 appendText(&sSelect, " AS sname FROM ", 0);
31006 appendText(&sSelect, zDb, quoteChar(zDb));
31007 appendText(&sSelect, ".sqlite_schema", 0);
31008 }
31009 sqlite3_finalize(pStmt);
31010#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
31011 if( zName ){
31012 appendText(&sSelect,
31013 " UNION ALL SELECT shell_module_schema(name),"
31014 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
31015 0);
31016 }
31017#endif
31018 appendText(&sSelect, ") WHERE ", 0);
31019 if( zName ){
31020 char *zQarg = sqlite3_mprintf("%Q", zName);
31021 int bGlob;
31022 shell_check_oom(zQarg);
31023 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
31024 strchr(zName, '[') != 0;
31025 if( strchr(zName, '.') ){
31026 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
31027 }else{
31028 appendText(&sSelect, "lower(tbl_name)", 0);
31029 }
31030 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
31031 appendText(&sSelect, zQarg, 0);
31032 if( !bGlob ){
31033 appendText(&sSelect, " ESCAPE '\\' ", 0);
31034 }
31035 appendText(&sSelect, " AND ", 0);
31036 sqlite3_free(zQarg);
31037 }
31038 if( bNoSystemTabs ){
31039 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
31040 }
31041 appendText(&sSelect, "sql IS NOT NULL"
31042 " ORDER BY snum, rowid", 0);
31043 if( bDebug ){
31044 sqlite3_fprintf(p->out, "SQL: %s;\n", sSelect.z);
31045 }else{
31046 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
31047 }
31048 freeText(&sSelect);
31049 }
31050 if( zErrMsg ){
31051 shellEmitError(zErrMsg);
31052 sqlite3_free(zErrMsg);
31053 rc = 1;
31054 }else if( rc != SQLITE_OK ){
31055 eputz("Error: querying schema information\n");
31056 rc = 1;
31057 }else{
31058 rc = 0;
31059 }
31060 }else
31061
31062 if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
31063 || (c=='t' && n==9 && cli_strncmp(azArg[0], "treetrace", n)==0)
31064 ){
31065 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
31067 }else
31068
31069#if defined(SQLITE_ENABLE_SESSION)
31070 if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
31071 struct AuxDb *pAuxDb = p->pAuxDb;
31072 OpenSession *pSession = &pAuxDb->aSession[0];
31073 char **azCmd = &azArg[1];
31074 int iSes = 0;
31075 int nCmd = nArg - 1;
31076 int i;
31077 if( nArg<=1 ) goto session_syntax_error;
31078 open_db(p, 0);
31079 if( nArg>=3 ){
31080 for(iSes=0; iSes<pAuxDb->nSession; iSes++){
31081 if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
31082 }
31083 if( iSes<pAuxDb->nSession ){
31084 pSession = &pAuxDb->aSession[iSes];
31085 azCmd++;
31086 nCmd--;
31087 }else{
31088 pSession = &pAuxDb->aSession[0];
31089 iSes = 0;
31090 }
31091 }
31092
31093 /* .session attach TABLE
31094 ** Invoke the sqlite3session_attach() interface to attach a particular
31095 ** table so that it is never filtered.
31096 */
31097 if( cli_strcmp(azCmd[0],"attach")==0 ){
31098 if( nCmd!=2 ) goto session_syntax_error;
31099 if( pSession->p==0 ){
31100 session_not_open:
31101 eputz("ERROR: No sessions are open\n");
31102 }else{
31103 rc = sqlite3session_attach(pSession->p, azCmd[1]);
31104 if( rc ){
31105 sqlite3_fprintf(stderr,
31106 "ERROR: sqlite3session_attach() returns %d\n",rc);
31107 rc = 0;
31108 }
31109 }
31110 }else
31111
31112 /* .session changeset FILE
31113 ** .session patchset FILE
31114 ** Write a changeset or patchset into a file. The file is overwritten.
31115 */
31116 if( cli_strcmp(azCmd[0],"changeset")==0
31117 || cli_strcmp(azCmd[0],"patchset")==0
31118 ){
31119 FILE *out = 0;
31120 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
31121 if( nCmd!=2 ) goto session_syntax_error;
31122 if( pSession->p==0 ) goto session_not_open;
31123 out = sqlite3_fopen(azCmd[1], "wb");
31124 if( out==0 ){
31125 sqlite3_fprintf(stderr,"ERROR: cannot open \"%s\" for writing\n",
31126 azCmd[1]);
31127 }else{
31128 int szChng;
31129 void *pChng;
31130 if( azCmd[0][0]=='c' ){
31131 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
31132 }else{
31133 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
31134 }
31135 if( rc ){
31136 sqlite3_fprintf(stdout, "Error: error code %d\n", rc);
31137 rc = 0;
31138 }
31139 if( pChng
31140 && fwrite(pChng, szChng, 1, out)!=1 ){
31141 sqlite3_fprintf(stderr,
31142 "ERROR: Failed to write entire %d-byte output\n", szChng);
31143 }
31144 sqlite3_free(pChng);
31145 fclose(out);
31146 }
31147 }else
31148
31149 /* .session close
31150 ** Close the identified session
31151 */
31152 if( cli_strcmp(azCmd[0], "close")==0 ){
31153 if( nCmd!=1 ) goto session_syntax_error;
31154 if( pAuxDb->nSession ){
31155 session_close(pSession);
31156 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
31157 }
31158 }else
31159
31160 /* .session enable ?BOOLEAN?
31161 ** Query or set the enable flag
31162 */
31163 if( cli_strcmp(azCmd[0], "enable")==0 ){
31164 int ii;
31165 if( nCmd>2 ) goto session_syntax_error;
31166 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
31167 if( pAuxDb->nSession ){
31168 ii = sqlite3session_enable(pSession->p, ii);
31169 sqlite3_fprintf(p->out,
31170 "session %s enable flag = %d\n", pSession->zName, ii);
31171 }
31172 }else
31173
31174 /* .session filter GLOB ....
31175 ** Set a list of GLOB patterns of table names to be excluded.
31176 */
31177 if( cli_strcmp(azCmd[0], "filter")==0 ){
31178 int ii, nByte;
31179 if( nCmd<2 ) goto session_syntax_error;
31180 if( pAuxDb->nSession ){
31181 for(ii=0; ii<pSession->nFilter; ii++){
31182 sqlite3_free(pSession->azFilter[ii]);
31183 }
31184 sqlite3_free(pSession->azFilter);
31185 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
31186 pSession->azFilter = sqlite3_malloc( nByte );
31187 shell_check_oom( pSession->azFilter );
31188 for(ii=1; ii<nCmd; ii++){
31189 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
31190 shell_check_oom(x);
31191 }
31192 pSession->nFilter = ii-1;
31193 }
31194 }else
31195
31196 /* .session indirect ?BOOLEAN?
31197 ** Query or set the indirect flag
31198 */
31199 if( cli_strcmp(azCmd[0], "indirect")==0 ){
31200 int ii;
31201 if( nCmd>2 ) goto session_syntax_error;
31202 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
31203 if( pAuxDb->nSession ){
31204 ii = sqlite3session_indirect(pSession->p, ii);
31205 sqlite3_fprintf(p->out,
31206 "session %s indirect flag = %d\n", pSession->zName, ii);
31207 }
31208 }else
31209
31210 /* .session isempty
31211 ** Determine if the session is empty
31212 */
31213 if( cli_strcmp(azCmd[0], "isempty")==0 ){
31214 int ii;
31215 if( nCmd!=1 ) goto session_syntax_error;
31216 if( pAuxDb->nSession ){
31217 ii = sqlite3session_isempty(pSession->p);
31218 sqlite3_fprintf(p->out,
31219 "session %s isempty flag = %d\n", pSession->zName, ii);
31220 }
31221 }else
31222
31223 /* .session list
31224 ** List all currently open sessions
31225 */
31226 if( cli_strcmp(azCmd[0],"list")==0 ){
31227 for(i=0; i<pAuxDb->nSession; i++){
31228 sqlite3_fprintf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
31229 }
31230 }else
31231
31232 /* .session open DB NAME
31233 ** Open a new session called NAME on the attached database DB.
31234 ** DB is normally "main".
31235 */
31236 if( cli_strcmp(azCmd[0],"open")==0 ){
31237 char *zName;
31238 if( nCmd!=3 ) goto session_syntax_error;
31239 zName = azCmd[2];
31240 if( zName[0]==0 ) goto session_syntax_error;
31241 for(i=0; i<pAuxDb->nSession; i++){
31242 if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
31243 sqlite3_fprintf(stderr,"Session \"%s\" already exists\n", zName);
31244 goto meta_command_exit;
31245 }
31246 }
31247 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
31248 sqlite3_fprintf(stderr,
31249 "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
31250 goto meta_command_exit;
31251 }
31252 pSession = &pAuxDb->aSession[pAuxDb->nSession];
31253 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
31254 if( rc ){
31255 sqlite3_fprintf(stderr,"Cannot open session: error code=%d\n", rc);
31256 rc = 0;
31257 goto meta_command_exit;
31258 }
31259 pSession->nFilter = 0;
31260 sqlite3session_table_filter(pSession->p, session_filter, pSession);
31261 pAuxDb->nSession++;
31262 pSession->zName = sqlite3_mprintf("%s", zName);
31263 shell_check_oom(pSession->zName);
31264 }else
31265 /* If no command name matches, show a syntax error */
31266 session_syntax_error:
31267 showHelp(p->out, "session");
31268 }else
31269#endif
31270
31271#ifdef SQLITE_DEBUG
31272 /* Undocumented commands for internal testing. Subject to change
31273 ** without notice. */
31274 if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
31275 if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
31276 int i, v;
31277 for(i=1; i<nArg; i++){
31278 v = booleanValue(azArg[i]);
31279 sqlite3_fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
31280 }
31281 }
31282 if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
31283 int i; sqlite3_int64 v;
31284 for(i=1; i<nArg; i++){
31285 char zBuf[200];
31286 v = integerValue(azArg[i]);
31287 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
31288 sqlite3_fputs(zBuf, p->out);
31289 }
31290 }
31291 }else
31292#endif
31293
31294 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
31295 int bIsInit = 0; /* True to initialize the SELFTEST table */
31296 int bVerbose = 0; /* Verbose output */
31297 int bSelftestExists; /* True if SELFTEST already exists */
31298 int i, k; /* Loop counters */
31299 int nTest = 0; /* Number of tests runs */
31300 int nErr = 0; /* Number of errors seen */
31301 ShellText str; /* Answer for a query */
31302 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
31303
31304 open_db(p,0);
31305 for(i=1; i<nArg; i++){
31306 const char *z = azArg[i];
31307 if( z[0]=='-' && z[1]=='-' ) z++;
31308 if( cli_strcmp(z,"-init")==0 ){
31309 bIsInit = 1;
31310 }else
31311 if( cli_strcmp(z,"-v")==0 ){
31312 bVerbose++;
31313 }else
31314 {
31315 sqlite3_fprintf(stderr,
31316 "Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
31317 sqlite3_fputs("Should be one of: --init -v\n", stderr);
31318 rc = 1;
31319 goto meta_command_exit;
31320 }
31321 }
31322 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
31323 != SQLITE_OK ){
31324 bSelftestExists = 0;
31325 }else{
31326 bSelftestExists = 1;
31327 }
31328 if( bIsInit ){
31329 createSelftestTable(p);
31330 bSelftestExists = 1;
31331 }
31332 initText(&str);
31333 appendText(&str, "x", 0);
31334 for(k=bSelftestExists; k>=0; k--){
31335 if( k==1 ){
31337 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
31338 -1, &pStmt, 0);
31339 }else{
31341 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
31342 " (1,'run','PRAGMA integrity_check','ok')",
31343 -1, &pStmt, 0);
31344 }
31345 if( rc ){
31346 eputz("Error querying the selftest table\n");
31347 rc = 1;
31348 sqlite3_finalize(pStmt);
31349 goto meta_command_exit;
31350 }
31351 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
31352 int tno = sqlite3_column_int(pStmt, 0);
31353 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
31354 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
31355 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
31356
31357 if( zOp==0 ) continue;
31358 if( zSql==0 ) continue;
31359 if( zAns==0 ) continue;
31360 k = 0;
31361 if( bVerbose>0 ){
31362 sqlite3_fprintf(stdout, "%d: %s %s\n", tno, zOp, zSql);
31363 }
31364 if( cli_strcmp(zOp,"memo")==0 ){
31365 sqlite3_fprintf(p->out, "%s\n", zSql);
31366 }else
31367 if( cli_strcmp(zOp,"run")==0 ){
31368 char *zErrMsg = 0;
31369 str.n = 0;
31370 str.z[0] = 0;
31371 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
31372 nTest++;
31373 if( bVerbose ){
31374 sqlite3_fprintf(p->out, "Result: %s\n", str.z);
31375 }
31376 if( rc || zErrMsg ){
31377 nErr++;
31378 rc = 1;
31379 sqlite3_fprintf(p->out, "%d: error-code-%d: %s\n", tno, rc,zErrMsg);
31380 sqlite3_free(zErrMsg);
31381 }else if( cli_strcmp(zAns,str.z)!=0 ){
31382 nErr++;
31383 rc = 1;
31384 sqlite3_fprintf(p->out, "%d: Expected: [%s]\n", tno, zAns);
31385 sqlite3_fprintf(p->out, "%d: Got: [%s]\n", tno, str.z);
31386 }
31387 }
31388 else{
31389 sqlite3_fprintf(stderr,
31390 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
31391 rc = 1;
31392 break;
31393 }
31394 } /* End loop over rows of content from SELFTEST */
31395 sqlite3_finalize(pStmt);
31396 } /* End loop over k */
31397 freeText(&str);
31398 sqlite3_fprintf(p->out, "%d errors out of %d tests\n", nErr, nTest);
31399 }else
31400
31401 if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
31402 if( nArg<2 || nArg>3 ){
31403 eputz("Usage: .separator COL ?ROW?\n");
31404 rc = 1;
31405 }
31406 if( nArg>=2 ){
31408 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
31409 }
31410 if( nArg>=3 ){
31412 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
31413 }
31414 }else
31415
31416 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
31417 const char *zLike = 0; /* Which table to checksum. 0 means everything */
31418 int i; /* Loop counter */
31419 int bSchema = 0; /* Also hash the schema */
31420 int bSeparate = 0; /* Hash each table separately */
31421 int iSize = 224; /* Hash algorithm to use */
31422 int bDebug = 0; /* Only show the query that would have run */
31423 sqlite3_stmt *pStmt; /* For querying tables names */
31424 char *zSql; /* SQL to be run */
31425 char *zSep; /* Separator */
31426 ShellText sSql; /* Complete SQL for the query to run the hash */
31427 ShellText sQuery; /* Set of queries used to read all content */
31428 open_db(p, 0);
31429 for(i=1; i<nArg; i++){
31430 const char *z = azArg[i];
31431 if( z[0]=='-' ){
31432 z++;
31433 if( z[0]=='-' ) z++;
31434 if( cli_strcmp(z,"schema")==0 ){
31435 bSchema = 1;
31436 }else
31437 if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
31438 || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
31439 ){
31440 iSize = atoi(&z[5]);
31441 }else
31442 if( cli_strcmp(z,"debug")==0 ){
31443 bDebug = 1;
31444 }else
31445 {
31446 sqlite3_fprintf(stderr,
31447 "Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
31448 showHelp(p->out, azArg[0]);
31449 rc = 1;
31450 goto meta_command_exit;
31451 }
31452 }else if( zLike ){
31453 eputz("Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
31454 rc = 1;
31455 goto meta_command_exit;
31456 }else{
31457 zLike = z;
31458 bSeparate = 1;
31459 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
31460 }
31461 }
31462 if( bSchema ){
31463 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
31464 " WHERE type='table' AND coalesce(rootpage,0)>1"
31465 " UNION ALL SELECT 'sqlite_schema'"
31466 " ORDER BY 1 collate nocase";
31467 }else{
31468 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
31469 " WHERE type='table' AND coalesce(rootpage,0)>1"
31470 " AND name NOT LIKE 'sqlite_%'"
31471 " ORDER BY 1 collate nocase";
31472 }
31473 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
31474 initText(&sQuery);
31475 initText(&sSql);
31476 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
31477 zSep = "VALUES(";
31478 while( SQLITE_ROW==sqlite3_step(pStmt) ){
31479 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
31480 if( zTab==0 ) continue;
31481 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
31482 if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
31483 appendText(&sQuery,"SELECT * FROM ", 0);
31484 appendText(&sQuery,zTab,'"');
31485 appendText(&sQuery," NOT INDEXED;", 0);
31486 }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
31487 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
31488 " ORDER BY name;", 0);
31489 }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
31490 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
31491 " ORDER BY name;", 0);
31492 }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
31493 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
31494 " ORDER BY tbl,idx;", 0);
31495 }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
31496 appendText(&sQuery, "SELECT * FROM ", 0);
31497 appendText(&sQuery, zTab, 0);
31498 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
31499 }
31500 appendText(&sSql, zSep, 0);
31501 appendText(&sSql, sQuery.z, '\'');
31502 sQuery.n = 0;
31503 appendText(&sSql, ",", 0);
31504 appendText(&sSql, zTab, '\'');
31505 zSep = "),(";
31506 }
31507 sqlite3_finalize(pStmt);
31508 if( bSeparate ){
31509 zSql = sqlite3_mprintf(
31510 "%s))"
31511 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
31512 " FROM [sha3sum$query]",
31513 sSql.z, iSize);
31514 }else{
31515 zSql = sqlite3_mprintf(
31516 "%s))"
31517 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
31518 " FROM [sha3sum$query]",
31519 sSql.z, iSize);
31520 }
31522 freeText(&sQuery);
31523 freeText(&sSql);
31524 if( bDebug ){
31525 sqlite3_fprintf(p->out, "%s\n", zSql);
31526 }else{
31527 shell_exec(p, zSql, 0);
31528 }
31529#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
31530 {
31531 int lrc;
31532 char *zRevText = /* Query for reversible to-blob-to-text check */
31533 "SELECT lower(name) as tname FROM sqlite_schema\n"
31534 "WHERE type='table' AND coalesce(rootpage,0)>1\n"
31535 "AND name NOT LIKE 'sqlite_%%'%s\n"
31536 "ORDER BY 1 collate nocase";
31537 zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
31538 zRevText = sqlite3_mprintf(
31539 /* lower-case query is first run, producing upper-case query. */
31540 "with tabcols as materialized(\n"
31541 "select tname, cname\n"
31542 "from ("
31543 " select printf('\"%%w\"',ss.tname) as tname,"
31544 " printf('\"%%w\"',ti.name) as cname\n"
31545 " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
31546 "select 'SELECT total(bad_text_count) AS bad_text_count\n"
31547 "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
31548 " from (select 'SELECT COUNT(*) AS bad_text_count\n"
31549 "FROM '||tname||' WHERE '\n"
31550 "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
31551 "|| ' AND typeof('||cname||')=''text'' ',\n"
31552 "' OR ') as query, tname from tabcols group by tname)"
31553 , zRevText);
31554 shell_check_oom(zRevText);
31555 if( bDebug ) sqlite3_fprintf(p->out, "%s\n", zRevText);
31556 lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
31557 if( lrc!=SQLITE_OK ){
31558 /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
31559 ** user does cruel and unnatural things like ".limit expr_depth 0". */
31560 rc = 1;
31561 }else{
31562 if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
31563 lrc = SQLITE_ROW==sqlite3_step(pStmt);
31564 if( lrc ){
31565 const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
31566 sqlite3_stmt *pCheckStmt;
31567 lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
31568 if( bDebug ) sqlite3_fprintf(p->out, "%s\n", zGenQuery);
31569 if( lrc!=SQLITE_OK ){
31570 rc = 1;
31571 }else{
31572 if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
31573 double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
31574 if( countIrreversible>0 ){
31575 int sz = (int)(countIrreversible + 0.5);
31576 sqlite3_fprintf(stderr,
31577 "Digest includes %d invalidly encoded text field%s.\n",
31578 sz, (sz>1)? "s": "");
31579 }
31580 }
31581 sqlite3_finalize(pCheckStmt);
31582 }
31583 sqlite3_finalize(pStmt);
31584 }
31585 }
31586 if( rc ) eputz(".sha3sum failed.\n");
31587 sqlite3_free(zRevText);
31588 }
31589#endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
31590 sqlite3_free(zSql);
31591 }else
31592
31593#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
31594 if( c=='s'
31595 && (cli_strncmp(azArg[0], "shell", n)==0
31596 || cli_strncmp(azArg[0],"system",n)==0)
31597 ){
31598 char *zCmd;
31599 int i, x;
31600 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
31601 if( nArg<2 ){
31602 eputz("Usage: .system COMMAND\n");
31603 rc = 1;
31604 goto meta_command_exit;
31605 }
31606 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
31607 for(i=2; i<nArg && zCmd!=0; i++){
31608 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
31609 zCmd, azArg[i]);
31610 }
31611 /*consoleRestore();*/
31612 x = zCmd!=0 ? system(zCmd) : 1;
31613 /*consoleRenewSetup();*/
31614 sqlite3_free(zCmd);
31615 if( x ) sqlite3_fprintf(stderr,"System command returns %d\n", x);
31616 }else
31617#endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
31618
31619 if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
31620 static const char *azBool[] = { "off", "on", "trigger", "full"};
31621 const char *zOut;
31622 int i;
31623 if( nArg!=1 ){
31624 eputz("Usage: .show\n");
31625 rc = 1;
31626 goto meta_command_exit;
31627 }
31628 sqlite3_fprintf(p->out, "%12.12s: %s\n","echo",
31629 azBool[ShellHasFlag(p, SHFLG_Echo)]);
31630 sqlite3_fprintf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
31631 sqlite3_fprintf(p->out, "%12.12s: %s\n","explain",
31632 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
31633 sqlite3_fprintf(p->out, "%12.12s: %s\n","headers",
31634 azBool[p->showHeader!=0]);
31635 if( p->mode==MODE_Column
31637 ){
31638 sqlite3_fprintf(p->out,
31639 "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
31640 modeDescr[p->mode], p->cmOpts.iWrap,
31641 p->cmOpts.bWordWrap ? "on" : "off",
31642 p->cmOpts.bQuote ? "" : "no");
31643 }else{
31644 sqlite3_fprintf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
31645 }
31646 sqlite3_fprintf(p->out, "%12.12s: ", "nullvalue");
31647 output_c_string(p->out, p->nullValue);
31648 sqlite3_fputs("\n", p->out);
31649 sqlite3_fprintf(p->out, "%12.12s: %s\n","output",
31650 strlen30(p->outfile) ? p->outfile : "stdout");
31651 sqlite3_fprintf(p->out, "%12.12s: ", "colseparator");
31652 output_c_string(p->out, p->colSeparator);
31653 sqlite3_fputs("\n", p->out);
31654 sqlite3_fprintf(p->out, "%12.12s: ", "rowseparator");
31655 output_c_string(p->out, p->rowSeparator);
31656 sqlite3_fputs("\n", p->out);
31657 switch( p->statsOn ){
31658 case 0: zOut = "off"; break;
31659 default: zOut = "on"; break;
31660 case 2: zOut = "stmt"; break;
31661 case 3: zOut = "vmstep"; break;
31662 }
31663 sqlite3_fprintf(p->out, "%12.12s: %s\n","stats", zOut);
31664 sqlite3_fprintf(p->out, "%12.12s: ", "width");
31665 for (i=0;i<p->nWidth;i++) {
31666 sqlite3_fprintf(p->out, "%d ", p->colWidth[i]);
31667 }
31668 sqlite3_fputs("\n", p->out);
31669 sqlite3_fprintf(p->out, "%12.12s: %s\n", "filename",
31670 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
31671 }else
31672
31673 if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
31674 if( nArg==2 ){
31675 if( cli_strcmp(azArg[1],"stmt")==0 ){
31676 p->statsOn = 2;
31677 }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
31678 p->statsOn = 3;
31679 }else{
31680 p->statsOn = (u8)booleanValue(azArg[1]);
31681 }
31682 }else if( nArg==1 ){
31683 display_stats(p->db, p, 0);
31684 }else{
31685 eputz("Usage: .stats ?on|off|stmt|vmstep?\n");
31686 rc = 1;
31687 }
31688 }else
31689
31690 if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
31691 || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
31692 || cli_strncmp(azArg[0], "indexes", n)==0) )
31693 ){
31694 sqlite3_stmt *pStmt;
31695 char **azResult;
31696 int nRow, nAlloc;
31697 int ii;
31698 ShellText s;
31699 initText(&s);
31700 open_db(p, 0);
31701 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
31702 if( rc ){
31703 sqlite3_finalize(pStmt);
31704 return shellDatabaseError(p->db);
31705 }
31706
31707 if( nArg>2 && c=='i' ){
31708 /* It is an historical accident that the .indexes command shows an error
31709 ** when called with the wrong number of arguments whereas the .tables
31710 ** command does not. */
31711 eputz("Usage: .indexes ?LIKE-PATTERN?\n");
31712 rc = 1;
31713 sqlite3_finalize(pStmt);
31714 goto meta_command_exit;
31715 }
31716 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
31717 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
31718 if( zDbName==0 ) continue;
31719 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
31720 if( sqlite3_stricmp(zDbName, "main")==0 ){
31721 appendText(&s, "SELECT name FROM ", 0);
31722 }else{
31723 appendText(&s, "SELECT ", 0);
31724 appendText(&s, zDbName, '\'');
31725 appendText(&s, "||'.'||name FROM ", 0);
31726 }
31727 appendText(&s, zDbName, '"');
31728 appendText(&s, ".sqlite_schema ", 0);
31729 if( c=='t' ){
31730 appendText(&s," WHERE type IN ('table','view')"
31731 " AND name NOT LIKE 'sqlite_%'"
31732 " AND name LIKE ?1", 0);
31733 }else{
31734 appendText(&s," WHERE type='index'"
31735 " AND tbl_name LIKE ?1", 0);
31736 }
31737 }
31738 rc = sqlite3_finalize(pStmt);
31739 if( rc==SQLITE_OK ){
31740 appendText(&s, " ORDER BY 1", 0);
31741 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
31742 }
31743 freeText(&s);
31744 if( rc ) return shellDatabaseError(p->db);
31745
31746 /* Run the SQL statement prepared by the above block. Store the results
31747 ** as an array of nul-terminated strings in azResult[]. */
31748 nRow = nAlloc = 0;
31749 azResult = 0;
31750 if( nArg>1 ){
31751 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
31752 }else{
31754 }
31755 while( sqlite3_step(pStmt)==SQLITE_ROW ){
31756 if( nRow>=nAlloc ){
31757 char **azNew;
31758 int n2 = nAlloc*2 + 10;
31759 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
31760 shell_check_oom(azNew);
31761 nAlloc = n2;
31762 azResult = azNew;
31763 }
31764 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
31765 shell_check_oom(azResult[nRow]);
31766 nRow++;
31767 }
31768 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
31769 rc = shellDatabaseError(p->db);
31770 }
31771
31772 /* Pretty-print the contents of array azResult[] to the output */
31773 if( rc==0 && nRow>0 ){
31774 int len, maxlen = 0;
31775 int i, j;
31776 int nPrintCol, nPrintRow;
31777 for(i=0; i<nRow; i++){
31778 len = strlen30(azResult[i]);
31779 if( len>maxlen ) maxlen = len;
31780 }
31781 nPrintCol = 80/(maxlen+2);
31782 if( nPrintCol<1 ) nPrintCol = 1;
31783 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
31784 for(i=0; i<nPrintRow; i++){
31785 for(j=i; j<nRow; j+=nPrintRow){
31786 char *zSp = j<nPrintRow ? "" : " ";
31787 sqlite3_fprintf(p->out,
31788 "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
31789 }
31790 sqlite3_fputs("\n", p->out);
31791 }
31792 }
31793
31794 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
31795 sqlite3_free(azResult);
31796 }else
31797
31798#ifndef SQLITE_SHELL_FIDDLE
31799 /* Begin redirecting output to the file "testcase-out.txt" */
31800 if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
31801 output_reset(p);
31802 p->out = output_file_open("testcase-out.txt");
31803 if( p->out==0 ){
31804 eputz("Error: cannot open 'testcase-out.txt'\n");
31805 }
31806 if( nArg>=2 ){
31807 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
31808 }else{
31810 }
31811 }else
31812#endif /* !defined(SQLITE_SHELL_FIDDLE) */
31813
31814#ifndef SQLITE_UNTESTABLE
31815 if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
31816 static const struct {
31817 const char *zCtrlName; /* Name of a test-control option */
31818 int ctrlCode; /* Integer code for that option */
31819 int unSafe; /* Not valid unless --unsafe-testing */
31820 const char *zUsage; /* Usage notes */
31821 } aCtrl[] = {
31822 {"always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" },
31823 {"assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" },
31824 /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/
31825 /*{"bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/
31826 {"byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" },
31827 {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" },
31828 {"fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"args..." },
31829 {"fk_no_action", SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN" },
31830 {"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
31831 {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
31832 {"json_selfcheck", SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN" },
31833 {"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
31834 {"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
31835 {"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK ..."},
31836#ifdef YYCOVERAGE
31837 {"parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" },
31838#endif
31839 {"pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,1, "OFFSET " },
31840 {"prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" },
31841 {"prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" },
31842 {"prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" },
31843 {"seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" },
31844 {"sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" },
31845 {"tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" },
31846 };
31847 int testctrl = -1;
31848 int iCtrl = -1;
31849 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
31850 int isOk = 0;
31851 int i, n2;
31852 const char *zCmd = 0;
31853
31854 open_db(p, 0);
31855 zCmd = nArg>=2 ? azArg[1] : "help";
31856
31857 /* The argument can optionally begin with "-" or "--" */
31858 if( zCmd[0]=='-' && zCmd[1] ){
31859 zCmd++;
31860 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
31861 }
31862
31863 /* --help lists all test-controls */
31864 if( cli_strcmp(zCmd,"help")==0 ){
31865 sqlite3_fputs("Available test-controls:\n", p->out);
31866 for(i=0; i<ArraySize(aCtrl); i++){
31867 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
31868 sqlite3_fprintf(p->out, " .testctrl %s %s\n",
31869 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
31870 }
31871 rc = 1;
31872 goto meta_command_exit;
31873 }
31874
31875 /* convert testctrl text option to value. allow any unique prefix
31876 ** of the option name, or a numerical value. */
31877 n2 = strlen30(zCmd);
31878 for(i=0; i<ArraySize(aCtrl); i++){
31879 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
31880 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
31881 if( testctrl<0 ){
31882 testctrl = aCtrl[i].ctrlCode;
31883 iCtrl = i;
31884 }else{
31885 sqlite3_fprintf(stderr,"Error: ambiguous test-control: \"%s\"\n"
31886 "Use \".testctrl --help\" for help\n", zCmd);
31887 rc = 1;
31888 goto meta_command_exit;
31889 }
31890 }
31891 }
31892 if( testctrl<0 ){
31893 sqlite3_fprintf(stderr,"Error: unknown test-control: %s\n"
31894 "Use \".testctrl --help\" for help\n", zCmd);
31895 }else{
31896 switch(testctrl){
31897
31898 /* Special processing for .testctrl opt MASK ...
31899 ** Each MASK argument can be one of:
31900 **
31901 ** +LABEL Enable the named optimization
31902 **
31903 ** -LABEL Disable the named optimization
31904 **
31905 ** INTEGER Mask of optimizations to disable
31906 */
31908 static const struct {
31909 unsigned int mask; /* Mask for this optimization */
31910 unsigned int bDsply; /* Display this on output */
31911 const char *zLabel; /* Name of optimization */
31912 } aLabel[] = {
31913 { 0x00000001, 1, "QueryFlattener" },
31914 { 0x00000001, 0, "Flatten" },
31915 { 0x00000002, 1, "WindowFunc" },
31916 { 0x00000004, 1, "GroupByOrder" },
31917 { 0x00000008, 1, "FactorOutConst" },
31918 { 0x00000010, 1, "DistinctOpt" },
31919 { 0x00000020, 1, "CoverIdxScan" },
31920 { 0x00000040, 1, "OrderByIdxJoin" },
31921 { 0x00000080, 1, "Transitive" },
31922 { 0x00000100, 1, "OmitNoopJoin" },
31923 { 0x00000200, 1, "CountOfView" },
31924 { 0x00000400, 1, "CurosrHints" },
31925 { 0x00000800, 1, "Stat4" },
31926 { 0x00001000, 1, "PushDown" },
31927 { 0x00002000, 1, "SimplifyJoin" },
31928 { 0x00004000, 1, "SkipScan" },
31929 { 0x00008000, 1, "PropagateConst" },
31930 { 0x00010000, 1, "MinMaxOpt" },
31931 { 0x00020000, 1, "SeekScan" },
31932 { 0x00040000, 1, "OmitOrderBy" },
31933 { 0x00080000, 1, "BloomFilter" },
31934 { 0x00100000, 1, "BloomPulldown" },
31935 { 0x00200000, 1, "BalancedMerge" },
31936 { 0x00400000, 1, "ReleaseReg" },
31937 { 0x00800000, 1, "FlttnUnionAll" },
31938 { 0x01000000, 1, "IndexedEXpr" },
31939 { 0x02000000, 1, "Coroutines" },
31940 { 0x04000000, 1, "NullUnusedCols" },
31941 { 0x08000000, 1, "OnePass" },
31942 { 0x10000000, 1, "OrderBySubq" },
31943 { 0x20000000, 1, "StarQuery" },
31944 { 0xffffffff, 0, "All" },
31945 };
31946 unsigned int curOpt;
31947 unsigned int newOpt;
31948 unsigned int m;
31949 int ii;
31950 int nOff;
31952 newOpt = curOpt;
31953 for(ii=2; ii<nArg; ii++){
31954 const char *z = azArg[ii];
31955 int useLabel = 0;
31956 const char *zLabel = 0;
31957 if( (z[0]=='+'|| z[0]=='-') && !IsDigit(z[1]) ){
31958 useLabel = z[0];
31959 zLabel = &z[1];
31960 }else if( !IsDigit(z[0]) && z[0]!=0 && !IsDigit(z[1]) ){
31961 useLabel = '+';
31962 zLabel = z;
31963 }else{
31964 newOpt = (unsigned int)strtol(z,0,0);
31965 }
31966 if( useLabel ){
31967 int jj;
31968 for(jj=0; jj<ArraySize(aLabel); jj++){
31969 if( sqlite3_stricmp(zLabel, aLabel[jj].zLabel)==0 ) break;
31970 }
31971 if( jj>=ArraySize(aLabel) ){
31972 sqlite3_fprintf(stderr,
31973 "Error: no such optimization: \"%s\"\n", zLabel);
31974 sqlite3_fputs("Should be one of:", stderr);
31975 for(jj=0; jj<ArraySize(aLabel); jj++){
31976 sqlite3_fprintf(stderr," %s", aLabel[jj].zLabel);
31977 }
31978 sqlite3_fputs("\n", stderr);
31979 rc = 1;
31980 goto meta_command_exit;
31981 }
31982 if( useLabel=='+' ){
31983 newOpt &= ~aLabel[jj].mask;
31984 }else{
31985 newOpt |= aLabel[jj].mask;
31986 }
31987 }
31988 }
31989 if( curOpt!=newOpt ){
31991 }
31992 for(ii=nOff=0, m=1; ii<32; ii++, m <<= 1){
31993 if( m & newOpt ) nOff++;
31994 }
31995 if( nOff<12 ){
31996 sqlite3_fputs("+All", p->out);
31997 for(ii=0; ii<ArraySize(aLabel); ii++){
31998 if( !aLabel[ii].bDsply ) continue;
31999 if( (newOpt & aLabel[ii].mask)!=0 ){
32000 sqlite3_fprintf(p->out, " -%s", aLabel[ii].zLabel);
32001 }
32002 }
32003 }else{
32004 sqlite3_fputs("-All", p->out);
32005 for(ii=0; ii<ArraySize(aLabel); ii++){
32006 if( !aLabel[ii].bDsply ) continue;
32007 if( (newOpt & aLabel[ii].mask)==0 ){
32008 sqlite3_fprintf(p->out, " +%s", aLabel[ii].zLabel);
32009 }
32010 }
32011 }
32012 sqlite3_fputs("\n", p->out);
32013 rc2 = isOk = 3;
32014 break;
32015 }
32016
32017 /* sqlite3_test_control(int, db, int) */
32019 if( nArg==3 ){
32020 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
32021 rc2 = sqlite3_test_control(testctrl, p->db, opt);
32022 isOk = 3;
32023 }
32024 break;
32025
32026 /* sqlite3_test_control(int) */
32030 if( nArg==2 ){
32031 rc2 = sqlite3_test_control(testctrl);
32032 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
32033 }
32034 break;
32035
32036 /* sqlite3_test_control(int, uint) */
32038 if( nArg==3 ){
32039 unsigned int opt = (unsigned int)integerValue(azArg[2]);
32040 rc2 = sqlite3_test_control(testctrl, opt);
32041 isOk = 3;
32042 }
32043 break;
32044
32045 /* sqlite3_test_control(int, int, sqlite3*) */
32047 if( nArg==3 || nArg==4 ){
32048 int ii = (int)integerValue(azArg[2]);
32049 sqlite3 *db;
32050 if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
32051 sqlite3_randomness(sizeof(ii),&ii);
32052 sqlite3_fprintf(stdout, "-- random seed: %d\n", ii);
32053 }
32054 if( nArg==3 ){
32055 db = 0;
32056 }else{
32057 db = p->db;
32058 /* Make sure the schema has been loaded */
32059 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
32060 }
32061 rc2 = sqlite3_test_control(testctrl, ii, db);
32062 isOk = 3;
32063 }
32064 break;
32065
32066 /* sqlite3_test_control(int, int) */
32069 if( nArg==3 ){
32070 int opt = booleanValue(azArg[2]);
32071 rc2 = sqlite3_test_control(testctrl, opt);
32072 isOk = 1;
32073 }
32074 break;
32075
32076 /* sqlite3_test_control(int, int) */
32079 if( nArg==3 ){
32080 int opt = booleanValue(azArg[2]);
32081 rc2 = sqlite3_test_control(testctrl, opt);
32082 isOk = 3;
32083 }
32084 break;
32085
32086 /* sqlite3_test_control(sqlite3*) */
32088 rc2 = sqlite3_test_control(testctrl, p->db);
32089 isOk = 3;
32090 break;
32091
32093 if( nArg==5 ){
32094 rc2 = sqlite3_test_control(testctrl, p->db,
32095 azArg[2],
32096 integerValue(azArg[3]),
32097 integerValue(azArg[4]));
32098 isOk = 3;
32099 }
32100 break;
32101
32103 u64 x = 0;
32104 rc2 = sqlite3_test_control(testctrl, p->db, &x);
32105 sqlite3_fprintf(p->out, "%llu\n", x);
32106 isOk = 3;
32107 break;
32108 }
32109
32110#ifdef YYCOVERAGE
32111 case SQLITE_TESTCTRL_PARSER_COVERAGE: {
32112 if( nArg==2 ){
32113 sqlite3_test_control(testctrl, p->out);
32114 isOk = 3;
32115 }
32116 break;
32117 }
32118#endif
32119#ifdef SQLITE_DEBUG
32120 case SQLITE_TESTCTRL_TUNE: {
32121 if( nArg==4 ){
32122 int id = (int)integerValue(azArg[2]);
32123 int val = (int)integerValue(azArg[3]);
32124 sqlite3_test_control(testctrl, id, &val);
32125 isOk = 3;
32126 }else if( nArg==3 ){
32127 int id = (int)integerValue(azArg[2]);
32128 sqlite3_test_control(testctrl, -id, &rc2);
32129 isOk = 1;
32130 }else if( nArg==2 ){
32131 int id = 1;
32132 while(1){
32133 int val = 0;
32134 rc2 = sqlite3_test_control(testctrl, -id, &val);
32135 if( rc2!=SQLITE_OK ) break;
32136 if( id>1 ) sqlite3_fputs(" ", p->out);
32137 sqlite3_fprintf(p->out, "%d: %d", id, val);
32138 id++;
32139 }
32140 if( id>1 ) sqlite3_fputs("\n", p->out);
32141 isOk = 3;
32142 }
32143 break;
32144 }
32145#endif
32147 if( nArg==3 ){
32148 int opt = (unsigned int)integerValue(azArg[2]);
32149 rc2 = sqlite3_test_control(testctrl, p->db, opt);
32150 isOk = 3;
32151 }
32152 break;
32154 if( nArg==2 ){
32155 rc2 = -1;
32156 isOk = 1;
32157 }else{
32158 rc2 = booleanValue(azArg[2]);
32159 isOk = 3;
32160 }
32161 sqlite3_test_control(testctrl, &rc2);
32162 break;
32164 int kk;
32165 int bShowHelp = nArg<=2;
32166 isOk = 3;
32167 for(kk=2; kk<nArg; kk++){
32168 const char *z = azArg[kk];
32169 if( z[0]=='-' && z[1]=='-' ) z++;
32170 if( cli_strcmp(z,"off")==0 ){
32171 sqlite3_test_control(testctrl, 0);
32172 }else if( cli_strcmp(z,"on")==0 ){
32173 faultsim_state.iCnt = faultsim_state.nSkip;
32174 if( faultsim_state.iErr==0 ) faultsim_state.iErr = 1;
32175 faultsim_state.nHit = 0;
32176 sqlite3_test_control(testctrl, faultsim_callback);
32177 }else if( cli_strcmp(z,"reset")==0 ){
32178 faultsim_state.iCnt = faultsim_state.nSkip;
32179 faultsim_state.nHit = 0;
32180 sqlite3_test_control(testctrl, faultsim_callback);
32181 }else if( cli_strcmp(z,"status")==0 ){
32182 sqlite3_fprintf(p->out, "faultsim.iId: %d\n",
32183 faultsim_state.iId);
32184 sqlite3_fprintf(p->out, "faultsim.iErr: %d\n",
32185 faultsim_state.iErr);
32186 sqlite3_fprintf(p->out, "faultsim.iCnt: %d\n",
32187 faultsim_state.iCnt);
32188 sqlite3_fprintf(p->out, "faultsim.nHit: %d\n",
32189 faultsim_state.nHit);
32190 sqlite3_fprintf(p->out, "faultsim.iInterval: %d\n",
32191 faultsim_state.iInterval);
32192 sqlite3_fprintf(p->out, "faultsim.eVerbose: %d\n",
32193 faultsim_state.eVerbose);
32194 sqlite3_fprintf(p->out, "faultsim.nRepeat: %d\n",
32195 faultsim_state.nRepeat);
32196 sqlite3_fprintf(p->out, "faultsim.nSkip: %d\n",
32197 faultsim_state.nSkip);
32198 }else if( cli_strcmp(z,"-v")==0 ){
32199 if( faultsim_state.eVerbose<2 ) faultsim_state.eVerbose++;
32200 }else if( cli_strcmp(z,"-q")==0 ){
32201 if( faultsim_state.eVerbose>0 ) faultsim_state.eVerbose--;
32202 }else if( cli_strcmp(z,"-id")==0 && kk+1<nArg ){
32203 faultsim_state.iId = atoi(azArg[++kk]);
32204 }else if( cli_strcmp(z,"-errcode")==0 && kk+1<nArg ){
32205 faultsim_state.iErr = atoi(azArg[++kk]);
32206 }else if( cli_strcmp(z,"-interval")==0 && kk+1<nArg ){
32207 faultsim_state.iInterval = atoi(azArg[++kk]);
32208 }else if( cli_strcmp(z,"-repeat")==0 && kk+1<nArg ){
32209 faultsim_state.nRepeat = atoi(azArg[++kk]);
32210 }else if( cli_strcmp(z,"-skip")==0 && kk+1<nArg ){
32211 faultsim_state.nSkip = atoi(azArg[++kk]);
32212 }else if( cli_strcmp(z,"-?")==0 || sqlite3_strglob("*help*",z)==0){
32213 bShowHelp = 1;
32214 }else{
32215 sqlite3_fprintf(stderr,
32216 "Unrecognized fault_install argument: \"%s\"\n",
32217 azArg[kk]);
32218 rc = 1;
32219 bShowHelp = 1;
32220 break;
32221 }
32222 }
32223 if( bShowHelp ){
32224 sqlite3_fputs(
32225 "Usage: .testctrl fault_install ARGS\n"
32226 "Possible arguments:\n"
32227 " off Disable faultsim\n"
32228 " on Activate faultsim\n"
32229 " reset Reset the trigger counter\n"
32230 " status Show current status\n"
32231 " -v Increase verbosity\n"
32232 " -q Decrease verbosity\n"
32233 " --errcode N When triggered, return N as error code\n"
32234 " --id ID Trigger only for the ID specified\n"
32235 " --interval N Trigger only after every N-th call\n"
32236 " --repeat N Turn off after N hits. 0 means never\n"
32237 " --skip N Skip the first N encounters\n"
32238 ,p->out
32239 );
32240 }
32241 break;
32242 }
32243 }
32244 }
32245 if( isOk==0 && iCtrl>=0 ){
32246 sqlite3_fprintf(p->out,
32247 "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
32248 rc = 1;
32249 }else if( isOk==1 ){
32250 sqlite3_fprintf(p->out, "%d\n", rc2);
32251 }else if( isOk==2 ){
32252 sqlite3_fprintf(p->out, "0x%08x\n", rc2);
32253 }
32254 }else
32255#endif /* !defined(SQLITE_UNTESTABLE) */
32256
32257 if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
32258 open_db(p, 0);
32259 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
32260 }else
32261
32262 if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
32263 if( nArg==2 ){
32264 enableTimer = booleanValue(azArg[1]);
32265 if( enableTimer && !HAS_TIMER ){
32266 eputz("Error: timer not available on this system.\n");
32267 enableTimer = 0;
32268 }
32269 }else{
32270 eputz("Usage: .timer on|off\n");
32271 rc = 1;
32272 }
32273 }else
32274
32275#ifndef SQLITE_OMIT_TRACE
32276 if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
32277 int mType = 0;
32278 int jj;
32279 open_db(p, 0);
32280 for(jj=1; jj<nArg; jj++){
32281 const char *z = azArg[jj];
32282 if( z[0]=='-' ){
32283 if( optionMatch(z, "expanded") ){
32285 }
32286#ifdef SQLITE_ENABLE_NORMALIZE
32287 else if( optionMatch(z, "normalized") ){
32288 p->eTraceType = SHELL_TRACE_NORMALIZED;
32289 }
32290#endif
32291 else if( optionMatch(z, "plain") ){
32293 }
32294 else if( optionMatch(z, "profile") ){
32295 mType |= SQLITE_TRACE_PROFILE;
32296 }
32297 else if( optionMatch(z, "row") ){
32298 mType |= SQLITE_TRACE_ROW;
32299 }
32300 else if( optionMatch(z, "stmt") ){
32301 mType |= SQLITE_TRACE_STMT;
32302 }
32303 else if( optionMatch(z, "close") ){
32304 mType |= SQLITE_TRACE_CLOSE;
32305 }
32306 else {
32307 sqlite3_fprintf(stderr,"Unknown option \"%s\" on \".trace\"\n", z);
32308 rc = 1;
32309 goto meta_command_exit;
32310 }
32311 }else{
32312 output_file_close(p->traceOut);
32313 p->traceOut = output_file_open(z);
32314 }
32315 }
32316 if( p->traceOut==0 ){
32318 }else{
32319 if( mType==0 ) mType = SQLITE_TRACE_STMT;
32320 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
32321 }
32322 }else
32323#endif /* !defined(SQLITE_OMIT_TRACE) */
32324
32325#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
32326 if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
32327 int ii;
32328 int lenOpt;
32329 char *zOpt;
32330 if( nArg<2 ){
32331 eputz("Usage: .unmodule [--allexcept] NAME ...\n");
32332 rc = 1;
32333 goto meta_command_exit;
32334 }
32335 open_db(p, 0);
32336 zOpt = azArg[1];
32337 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
32338 lenOpt = (int)strlen(zOpt);
32339 if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
32340 assert( azArg[nArg]==0 );
32341 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
32342 }else{
32343 for(ii=1; ii<nArg; ii++){
32344 sqlite3_create_module(p->db, azArg[ii], 0, 0);
32345 }
32346 }
32347 }else
32348#endif
32349
32350 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
32351 char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
32352 sqlite3_fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
32354#if SQLITE_HAVE_ZLIB
32355 sqlite3_fprintf(p->out, "zlib version %s\n", zlibVersion());
32356#endif
32357#define CTIMEOPT_VAL_(opt) #opt
32358#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
32359#if defined(__clang__) && defined(__clang_major__)
32360 sqlite3_fprintf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
32361 CTIMEOPT_VAL(__clang_minor__) "."
32362 CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
32363#elif defined(_MSC_VER)
32364 sqlite3_fprintf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
32365#elif defined(__GNUC__) && defined(__VERSION__)
32366 sqlite3_fprintf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
32367#endif
32368 }else
32369
32370 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
32371 const char *zDbName = nArg==2 ? azArg[1] : "main";
32372 sqlite3_vfs *pVfs = 0;
32373 if( p->db ){
32375 if( pVfs ){
32376 sqlite3_fprintf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
32377 sqlite3_fprintf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
32378 sqlite3_fprintf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
32379 sqlite3_fprintf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
32380 }
32381 }
32382 }else
32383
32384 if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
32385 sqlite3_vfs *pVfs;
32386 sqlite3_vfs *pCurrent = 0;
32387 if( p->db ){
32389 }
32390 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
32391 sqlite3_fprintf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
32392 pVfs==pCurrent ? " <--- CURRENT" : "");
32393 sqlite3_fprintf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
32394 sqlite3_fprintf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
32395 sqlite3_fprintf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
32396 if( pVfs->pNext ){
32397 sqlite3_fputs("-----------------------------------\n", p->out);
32398 }
32399 }
32400 }else
32401
32402 if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
32403 const char *zDbName = nArg==2 ? azArg[1] : "main";
32404 char *zVfsName = 0;
32405 if( p->db ){
32407 if( zVfsName ){
32408 sqlite3_fprintf(p->out, "%s\n", zVfsName);
32409 sqlite3_free(zVfsName);
32410 }
32411 }
32412 }else
32413
32414 if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
32415 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
32417 }else
32418
32419 if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
32420 int j;
32421 assert( nArg<=ArraySize(azArg) );
32422 p->nWidth = nArg-1;
32423 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
32426 for(j=1; j<nArg; j++){
32427 p->colWidth[j-1] = (int)integerValue(azArg[j]);
32428 }
32429 }else
32430
32431 {
32432 sqlite3_fprintf(stderr,"Error: unknown command or invalid arguments: "
32433 " \"%s\". Enter \".help\" for help\n", azArg[0]);
32434 rc = 1;
32435 }
32436
32437meta_command_exit:
32438 if( p->outCount ){
32439 p->outCount--;
32440 if( p->outCount==0 ) output_reset(p);
32441 }
32443 return rc;
32444}
32445
32446/* Line scan result and intermediate states (supporting scan resumption)
32448#ifndef CHAR_BIT
32449# define CHAR_BIT 8
32450#endif
32451typedef enum {
32452 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
32453 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
32454 QSS_Start = 0
32455} QuickScanState;
32456#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
32457#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
32458#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
32459#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
32460#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
32461
32462/*
32463** Scan line for classification to guide shell's handling.
32464** The scan is resumable for subsequent lines when prior
32465** return values are passed as the 2nd argument.
32466*/
32467static QuickScanState quickscan(char *zLine, QuickScanState qss,
32469 char cin;
32470 char cWait = (char)qss; /* intentional narrowing loss */
32471 if( cWait==0 ){
32472 PlainScan:
32473 while( (cin = *zLine++)!=0 ){
32474 if( IsSpace(cin) )
32475 continue;
32476 switch (cin){
32477 case '-':
32478 if( *zLine!='-' )
32479 break;
32480 while((cin = *++zLine)!=0 )
32481 if( cin=='\n')
32482 goto PlainScan;
32483 return qss;
32484 case ';':
32485 qss |= QSS_EndingSemi;
32486 continue;
32487 case '/':
32488 if( *zLine=='*' ){
32489 ++zLine;
32490 cWait = '*';
32491 CONTINUE_PROMPT_AWAITS(pst, "/*");
32492 qss = QSS_SETV(qss, cWait);
32493 goto TermScan;
32494 }
32495 break;
32496 case '[':
32497 cin = ']';
32498 deliberate_fall_through; /* FALLTHRU */
32499 case '`': case '\'': case '"':
32500 cWait = cin;
32501 qss = QSS_HasDark | cWait;
32502 CONTINUE_PROMPT_AWAITC(pst, cin);
32503 goto TermScan;
32504 case '(':
32505 CONTINUE_PAREN_INCR(pst, 1);
32506 break;
32507 case ')':
32508 CONTINUE_PAREN_INCR(pst, -1);
32509 break;
32510 default:
32511 break;
32512 }
32513 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
32514 }
32515 }else{
32516 TermScan:
32517 while( (cin = *zLine++)!=0 ){
32518 if( cin==cWait ){
32519 switch( cWait ){
32520 case '*':
32521 if( *zLine != '/' )
32522 continue;
32523 ++zLine;
32524 CONTINUE_PROMPT_AWAITC(pst, 0);
32525 qss = QSS_SETV(qss, 0);
32526 goto PlainScan;
32527 case '`': case '\'': case '"':
32528 if(*zLine==cWait){
32529 /* Swallow doubled end-delimiter.*/
32530 ++zLine;
32531 continue;
32532 }
32533 deliberate_fall_through; /* FALLTHRU */
32534 case ']':
32535 CONTINUE_PROMPT_AWAITC(pst, 0);
32536 qss = QSS_SETV(qss, 0);
32537 goto PlainScan;
32538 default: assert(0);
32539 }
32540 }
32541 }
32542 }
32543 return qss;
32544}
32545
32546/*
32547** Return TRUE if the line typed in is an SQL command terminator other
32548** than a semi-colon. The SQL Server style "go" command is understood
32549** as is the Oracle "/".
32550*/
32551static int line_is_command_terminator(char *zLine){
32552 while( IsSpace(zLine[0]) ){ zLine++; };
32553 if( zLine[0]=='/' )
32554 zLine += 1; /* Oracle */
32555 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
32556 zLine += 2; /* SQL Server */
32557 else
32558 return 0;
32559 return quickscan(zLine, QSS_Start, 0)==QSS_Start;
32560}
32561
32562/*
32563** The CLI needs a working sqlite3_complete() to work properly. So error
32564** out of the build if compiling with SQLITE_OMIT_COMPLETE.
32565*/
32566#ifdef SQLITE_OMIT_COMPLETE
32567# error the CLI application is incompatible with SQLITE_OMIT_COMPLETE.
32568#endif
32569
32570/*
32571** Return true if zSql is a complete SQL statement. Return false if it
32572** ends in the middle of a string literal or C-style comment.
32573*/
32574static int line_is_complete(char *zSql, int nSql){
32575 int rc;
32576 if( zSql==0 ) return 1;
32577 zSql[nSql] = ';';
32578 zSql[nSql+1] = 0;
32579 rc = sqlite3_complete(zSql);
32580 zSql[nSql] = 0;
32581 return rc;
32582}
32583
32584/*
32585** This function is called after processing each line of SQL in the
32586** runOneSqlLine() function. Its purpose is to detect scenarios where
32587** defensive mode should be automatically turned off. Specifically, when
32588**
32589** 1. The first line of input is "PRAGMA foreign_keys=OFF;",
32590** 2. The second line of input is "BEGIN TRANSACTION;",
32591** 3. The database is empty, and
32592** 4. The shell is not running in --safe mode.
32593**
32594** The implementation uses the ShellState.eRestoreState to maintain state:
32595**
32596** 0: Have not seen any SQL.
32597** 1: Have seen "PRAGMA foreign_keys=OFF;".
32598** 2-6: Currently running .dump transaction. If the "2" bit is set,
32599** disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
32600** 7: Nothing left to do. This function becomes a no-op.
32601*/
32602static int doAutoDetectRestore(ShellState *p, const char *zSql){
32603 int rc = SQLITE_OK;
32604
32605 if( p->eRestoreState<7 ){
32606 switch( p->eRestoreState ){
32607 case 0: {
32608 const char *zExpect = "PRAGMA foreign_keys=OFF;";
32609 assert( strlen(zExpect)==24 );
32610 if( p->bSafeMode==0
32611 && strlen(zSql)>=24
32612 && memcmp(zSql, zExpect, 25)==0
32613 ){
32614 p->eRestoreState = 1;
32615 }else{
32616 p->eRestoreState = 7;
32617 }
32618 break;
32619 };
32620
32621 case 1: {
32622 int bIsDump = 0;
32623 const char *zExpect = "BEGIN TRANSACTION;";
32624 assert( strlen(zExpect)==18 );
32625 if( memcmp(zSql, zExpect, 19)==0 ){
32626 /* Now check if the database is empty. */
32627 const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
32628 sqlite3_stmt *pStmt = 0;
32629
32630 bIsDump = 1;
32631 shellPrepare(p->db, &rc, zQuery, &pStmt);
32632 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
32633 bIsDump = 0;
32634 }
32635 shellFinalize(&rc, pStmt);
32636 }
32637 if( bIsDump && rc==SQLITE_OK ){
32638 int bDefense = 0;
32639 int bDqsDdl = 0;
32644 p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
32645 }else{
32646 p->eRestoreState = 7;
32647 }
32648 break;
32649 }
32650
32651 default: {
32653 if( (p->eRestoreState & 2) ){
32655 }
32656 if( (p->eRestoreState & 4) ){
32658 }
32659 p->eRestoreState = 7;
32660 }
32661 break;
32662 }
32663 }
32664 }
32665
32666 return rc;
32667}
32668
32669/*
32670** Run a single line of SQL. Return the number of errors.
32671*/
32672static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
32673 int rc;
32674 char *zErrMsg = 0;
32675
32676 open_db(p, 0);
32677 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
32680 rc = shell_exec(p, zSql, &zErrMsg);
32681 END_TIMER(p->out);
32682 if( rc || zErrMsg ){
32683 char zPrefix[100];
32684 const char *zErrorTail;
32685 const char *zErrorType;
32686 if( zErrMsg==0 ){
32687 zErrorType = "Error";
32688 zErrorTail = sqlite3_errmsg(p->db);
32689 }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
32690 zErrorType = "Parse error";
32691 zErrorTail = &zErrMsg[12];
32692 }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
32693 zErrorType = "Runtime error";
32694 zErrorTail = &zErrMsg[10];
32695 }else{
32696 zErrorType = "Error";
32697 zErrorTail = zErrMsg;
32698 }
32699 if( in!=0 || !stdin_is_interactive ){
32700 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
32701 "%s near line %d:", zErrorType, startline);
32702 }else{
32703 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
32704 }
32705 sqlite3_fprintf(stderr,"%s %s\n", zPrefix, zErrorTail);
32706 sqlite3_free(zErrMsg);
32707 zErrMsg = 0;
32708 return 1;
32709 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
32710 char zLineBuf[2000];
32711 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
32712 "changes: %lld total_changes: %lld",
32714 sqlite3_fprintf(p->out, "%s\n", zLineBuf);
32715 }
32716
32717 if( doAutoDetectRestore(p, zSql) ) return 1;
32718 return 0;
32720
32721static void echo_group_input(ShellState *p, const char *zDo){
32722 if( ShellHasFlag(p, SHFLG_Echo) ){
32723 sqlite3_fprintf(p->out, "%s\n", zDo);
32724 fflush(p->out);
32725 }
32726}
32727
32728#ifdef SQLITE_SHELL_FIDDLE
32729/*
32730** Alternate one_input_line() impl for wasm mode. This is not in the primary
32731** impl because we need the global shellState and cannot access it from that
32732** function without moving lots of code around (creating a larger/messier diff).
32733*/
32734static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
32735 /* Parse the next line from shellState.wasm.zInput. */
32736 const char *zBegin = shellState.wasm.zPos;
32737 const char *z = zBegin;
32738 char *zLine = 0;
32739 i64 nZ = 0;
32740
32741 UNUSED_PARAMETER(in);
32742 UNUSED_PARAMETER(isContinuation);
32743 if(!z || !*z){
32744 return 0;
32745 }
32746 while(*z && IsSpace(*z)) ++z;
32747 zBegin = z;
32748 for(; *z && '\n'!=*z; ++nZ, ++z){}
32749 if(nZ>0 && '\r'==zBegin[nZ-1]){
32750 --nZ;
32751 }
32752 shellState.wasm.zPos = z;
32753 zLine = realloc(zPrior, nZ+1);
32754 shell_check_oom(zLine);
32755 memcpy(zLine, zBegin, nZ);
32756 zLine[nZ] = 0;
32757 return zLine;
32758}
32759#endif /* SQLITE_SHELL_FIDDLE */
32760
32761/*
32762** Read input from *in and process it. If *in==0 then input
32763** is interactive - the user is typing it it. Otherwise, input
32764** is coming from a file or device. A prompt is issued and history
32765** is saved only if input is interactive. An interrupt signal will
32766** cause this routine to exit immediately, unless input is interactive.
32767**
32768** Return the number of errors.
32769*/
32770static int process_input(ShellState *p){
32771 char *zLine = 0; /* A single input line */
32772 char *zSql = 0; /* Accumulated SQL text */
32773 i64 nLine; /* Length of current line */
32774 i64 nSql = 0; /* Bytes of zSql[] used */
32775 i64 nAlloc = 0; /* Allocated zSql[] space */
32776 int rc; /* Error code */
32777 int errCnt = 0; /* Number of errors seen */
32778 i64 startline = 0; /* Line number for start of current input */
32779 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
32780
32782 /* This will be more informative in a later version. */
32783 sqlite3_fprintf(stderr,"Input nesting limit (%d) reached at line %d."
32784 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
32785 return 1;
32786 }
32787 ++p->inputNesting;
32788 p->lineno = 0;
32790 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
32791 fflush(p->out);
32792 zLine = one_input_line(p->in, zLine, nSql>0);
32793 if( zLine==0 ){
32794 /* End of input */
32795 if( p->in==0 && stdin_is_interactive ) sqlite3_fputs("\n", p->out);
32796 break;
32797 }
32798 if( seenInterrupt ){
32799 if( p->in!=0 ) break;
32800 seenInterrupt = 0;
32801 }
32802 p->lineno++;
32803 if( QSS_INPLAIN(qss)
32804 && line_is_command_terminator(zLine)
32805 && line_is_complete(zSql, nSql) ){
32806 memcpy(zLine,";",2);
32807 }
32808 qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
32809 if( QSS_PLAINWHITE(qss) && nSql==0 ){
32810 /* Just swallow single-line whitespace */
32811 echo_group_input(p, zLine);
32812 qss = QSS_Start;
32813 continue;
32814 }
32815 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
32817 echo_group_input(p, zLine);
32818 if( zLine[0]=='.' ){
32819 rc = do_meta_command(zLine, p);
32820 if( rc==2 ){ /* exit requested */
32821 break;
32822 }else if( rc ){
32823 errCnt++;
32824 }
32825 }
32826 qss = QSS_Start;
32827 continue;
32828 }
32829 /* No single-line dispositions remain; accumulate line(s). */
32830 nLine = strlen(zLine);
32831 if( nSql+nLine+2>=nAlloc ){
32832 /* Grow buffer by half-again increments when big. */
32833 nAlloc = nSql+(nSql>>1)+nLine+100;
32834 zSql = realloc(zSql, nAlloc);
32836 }
32837 if( nSql==0 ){
32838 i64 i;
32839 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
32840 assert( nAlloc>0 && zSql!=0 );
32841 memcpy(zSql, zLine+i, nLine+1-i);
32842 startline = p->lineno;
32843 nSql = nLine-i;
32844 }else{
32845 zSql[nSql++] = '\n';
32846 memcpy(zSql+nSql, zLine, nLine+1);
32847 nSql += nLine;
32848 }
32849 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
32850 echo_group_input(p, zSql);
32851 errCnt += runOneSqlLine(p, zSql, p->in, startline);
32853 nSql = 0;
32854 if( p->outCount ){
32855 output_reset(p);
32856 p->outCount = 0;
32857 }else{
32858 clearTempFile(p);
32859 }
32861 qss = QSS_Start;
32862 }else if( nSql && QSS_PLAINWHITE(qss) ){
32863 echo_group_input(p, zSql);
32864 nSql = 0;
32865 qss = QSS_Start;
32866 }
32867 }
32868 if( nSql ){
32869 /* This may be incomplete. Let the SQL parser deal with that. */
32870 echo_group_input(p, zSql);
32871 errCnt += runOneSqlLine(p, zSql, p->in, startline);
32873 }
32874 free(zSql);
32875 free(zLine);
32876 --p->inputNesting;
32877 return errCnt>0;
32878}
32879
32880/*
32881** Return a pathname which is the user's home directory. A
32882** 0 return indicates an error of some kind.
32883*/
32884static char *find_home_dir(int clearFlag){
32885 static char *home_dir = NULL;
32886 if( clearFlag ){
32887 free(home_dir);
32888 home_dir = 0;
32889 return 0;
32890 }
32891 if( home_dir ) return home_dir;
32892
32893#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE)
32894 && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
32895 {
32896 struct passwd *pwent;
32897 uid_t uid = getuid();
32898 if( (pwent=getpwuid(uid)) != NULL) {
32899 home_dir = pwent->pw_dir;
32900 }
32901 }
32902#endif
32903
32904#if defined(_WIN32_WCE)
32905 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
32906 */
32907 home_dir = "/";
32908#else
32909
32910#if defined(_WIN32) || defined(WIN32)
32911 if (!home_dir) {
32912 home_dir = getenv("USERPROFILE");
32913 }
32914#endif
32915
32916 if (!home_dir) {
32917 home_dir = getenv("HOME");
32918 }
32919
32920#if defined(_WIN32) || defined(WIN32)
32921 if (!home_dir) {
32922 char *zDrive, *zPath;
32923 int n;
32924 zDrive = getenv("HOMEDRIVE");
32925 zPath = getenv("HOMEPATH");
32926 if( zDrive && zPath ){
32927 n = strlen30(zDrive) + strlen30(zPath) + 1;
32928 home_dir = malloc( n );
32929 if( home_dir==0 ) return 0;
32930 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
32931 return home_dir;
32932 }
32933 home_dir = "c:\\";
32934 }
32935#endif
32936
32937#endif /* !_WIN32_WCE */
32938
32939 if( home_dir ){
32940 i64 n = strlen(home_dir) + 1;
32941 char *z = malloc( n );
32942 if( z ) memcpy(z, home_dir, n);
32943 home_dir = z;
32944 }
32945
32946 return home_dir;
32947}
32948
32949/*
32950** On non-Windows platforms, look for $XDG_CONFIG_HOME.
32951** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
32952** the path to it. If there is no $(XDG_CONFIG_HOME) then
32953** look for $(HOME)/.config/sqlite3/sqliterc and if found
32954** return that. If none of these are found, return 0.
32955**
32956** The string returned is obtained from sqlite3_malloc() and
32957** should be freed by the caller.
32958*/
32959static char *find_xdg_config(void){
32960#if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE)
32961 || defined(__RTP__) || defined(_WRS_KERNEL)
32962 return 0;
32963#else
32964 char *zConfig = 0;
32965 const char *zXdgHome;
32966
32967 zXdgHome = getenv("XDG_CONFIG_HOME");
32968 if( zXdgHome==0 ){
32969 const char *zHome = getenv("HOME");
32970 if( zHome==0 ) return 0;
32971 zConfig = sqlite3_mprintf("%s/.config/sqlite3/sqliterc", zHome);
32972 }else{
32973 zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
32974 }
32975 shell_check_oom(zConfig);
32976 if( access(zConfig,0)!=0 ){
32977 sqlite3_free(zConfig);
32978 zConfig = 0;
32979 }
32980 return zConfig;
32981#endif
32982}
32983
32984/*
32985** Read input from the file given by sqliterc_override. Or if that
32986** parameter is NULL, take input from the first of find_xdg_config()
32987** or ~/.sqliterc which is found.
32988**
32989** Returns the number of errors.
32990*/
32991static void process_sqliterc(
32992 ShellState *p, /* Configuration data */
32993 const char *sqliterc_override /* Name of config file. NULL to use default */
32994){
32995 char *home_dir = NULL;
32996 const char *sqliterc = sqliterc_override;
32997 char *zBuf = 0;
32998 FILE *inSaved = p->in;
32999 int savedLineno = p->lineno;
33000
33001 if( sqliterc == NULL ){
33002 sqliterc = zBuf = find_xdg_config();
33003 }
33004 if( sqliterc == NULL ){
33005 home_dir = find_home_dir(0);
33006 if( home_dir==0 ){
33007 eputz("-- warning: cannot find home directory;"
33008 " cannot read ~/.sqliterc\n");
33009 return;
33010 }
33011 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
33013 sqliterc = zBuf;
33014 }
33015 p->in = sqlite3_fopen(sqliterc,"rb");
33016 if( p->in ){
33018 sqlite3_fprintf(stderr,"-- Loading resources from %s\n", sqliterc);
33019 }
33020 if( process_input(p) && bail_on_error ) exit(1);
33021 fclose(p->in);
33022 }else if( sqliterc_override!=0 ){
33023 sqlite3_fprintf(stderr,"cannot open: \"%s\"\n", sqliterc);
33024 if( bail_on_error ) exit(1);
33025 }
33026 p->in = inSaved;
33027 p->lineno = savedLineno;
33028 sqlite3_free(zBuf);
33029}
33030
33031/*
33032** Show available command line options
33033*/
33034static const char zOptions[] =
33035 " -- treat no subsequent arguments as options\n"
33036#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
33037 " -A ARGS... run \".archive ARGS\" and exit\n"
33038#endif
33039 " -append append the database to the end of the file\n"
33040 " -ascii set output mode to 'ascii'\n"
33041 " -bail stop after hitting an error\n"
33042 " -batch force batch I/O\n"
33043 " -box set output mode to 'box'\n"
33044 " -column set output mode to 'column'\n"
33045 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
33046 " -csv set output mode to 'csv'\n"
33047#if !defined(SQLITE_OMIT_DESERIALIZE)
33048 " -deserialize open the database using sqlite3_deserialize()\n"
33049#endif
33050 " -echo print inputs before execution\n"
33051 " -escape T ctrl-char escape; T is one of: symbol, ascii, off\n"
33052 " -init FILENAME read/process named file\n"
33053 " -[no]header turn headers on or off\n"
33054#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
33055 " -heap SIZE Size of heap for memsys3 or memsys5\n"
33056#endif
33057 " -help show this message\n"
33058 " -html set output mode to HTML\n"
33059 " -interactive force interactive I/O\n"
33060 " -json set output mode to 'json'\n"
33061 " -line set output mode to 'line'\n"
33062 " -list set output mode to 'list'\n"
33063 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
33064 " -markdown set output mode to 'markdown'\n"
33065#if !defined(SQLITE_OMIT_DESERIALIZE)
33066 " -maxsize N maximum size for a --deserialize database\n"
33067#endif
33068 " -memtrace trace all memory allocations and deallocations\n"
33069 " -mmap N default mmap size set to N\n"
33070#ifdef SQLITE_ENABLE_MULTIPLEX
33071 " -multiplex enable the multiplexor VFS\n"
33072#endif
33073 " -newline SEP set output row separator. Default: '\\n'\n"
33074 " -nofollow refuse to open symbolic links to database files\n"
33075 " -nonce STRING set the safe-mode escape nonce\n"
33076 " -no-rowid-in-view Disable rowid-in-view using sqlite3_config()\n"
33077 " -nullvalue TEXT set text string for NULL values. Default ''\n"
33078 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
33079 " -pcachetrace trace all page cache operations\n"
33080 " -quote set output mode to 'quote'\n"
33081 " -readonly open the database read-only\n"
33082 " -safe enable safe-mode\n"
33083 " -separator SEP set output column separator. Default: '|'\n"
33084#ifdef SQLITE_ENABLE_SORTER_REFERENCES
33085 " -sorterref SIZE sorter references threshold size\n"
33086#endif
33087 " -stats print memory stats before each finalize\n"
33088 " -table set output mode to 'table'\n"
33089 " -tabs set output mode to 'tabs'\n"
33090 " -unsafe-testing allow unsafe commands and modes for testing\n"
33091 " -version show SQLite version\n"
33092 " -vfs NAME use NAME as the default VFS\n"
33093 " -vfstrace enable tracing of all VFS calls\n"
33094#ifdef SQLITE_HAVE_ZLIB
33095 " -zip open the file as a ZIP Archive\n"
33096#endif
33097;
33098static void usage(int showDetail){
33099 sqlite3_fprintf(stderr,"Usage: %s [OPTIONS] [FILENAME [SQL...]]\n"
33100 "FILENAME is the name of an SQLite database. A new database is created\n"
33101 "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
33102 if( showDetail ){
33103 sqlite3_fprintf(stderr,"OPTIONS include:\n%s", zOptions);
33104 }else{
33105 eputz("Use the -help option for additional information\n");
33106 }
33107 exit(0);
33108}
33109
33110/*
33111** Internal check: Verify that the SQLite is uninitialized. Print a
33112** error message if it is initialized.
33113*/
33114static void verify_uninitialized(void){
33116 sputz(stdout, "WARNING: attempt to configure SQLite after"
33117 " initialization.\n");
33118 }
33119}
33120
33121/*
33122** Initialize the state information in data
33123*/
33124static void main_init(ShellState *data) {
33125 memset(data, 0, sizeof(*data));
33126 data->normalMode = data->cMode = data->mode = MODE_List;
33127 data->autoExplain = 1;
33128#ifdef _WIN32
33129 data->crlfMode = 1;
33130#endif
33131 data->pAuxDb = &data->aAuxDb[0];
33132 memcpy(data->colSeparator,SEP_Column, 2);
33133 memcpy(data->rowSeparator,SEP_Row, 2);
33134 data->showHeader = 0;
33137#if !defined(SQLITE_SHELL_FIDDLE)
33138 verify_uninitialized();
33139#endif
33144}
33145
33146/*
33147** Output text to the console in a font that attracts extra attention.
33148*/
33149#if defined(_WIN32) || defined(WIN32)
33150static void printBold(const char *zText){
33151#if !SQLITE_OS_WINRT
33152 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
33153 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
33154 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
33155 SetConsoleTextAttribute(out,
33156 FOREGROUND_RED|FOREGROUND_INTENSITY
33157 );
33158#endif
33159 sputz(stdout, zText);
33160#if !SQLITE_OS_WINRT
33161 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
33162#endif
33164#else
33165static void printBold(const char *zText){
33166 sqlite3_fprintf(stdout, "\033[1m%s\033[0m", zText);
33167}
33168#endif
33169
33170/*
33171** Get the argument to an --option. Throw an error and die if no argument
33172** is available.
33173*/
33174static char *cmdline_option_value(int argc, char **argv, int i){
33175 if( i==argc ){
33176 sqlite3_fprintf(stderr,
33177 "%s: Error: missing argument to %s\n", argv[0], argv[argc-1]);
33178 exit(1);
33179 }
33180 return argv[i];
33182
33183static void sayAbnormalExit(void){
33184 if( seenInterrupt ) eputz("Program interrupted.\n");
33185}
33186
33187/* Routine to output from vfstrace
33188*/
33189static int vfstraceOut(const char *z, void *pArg){
33190 ShellState *p = (ShellState*)pArg;
33191 sqlite3_fputs(z, p->out);
33192 fflush(p->out);
33193 return 1;
33194}
33195
33196#ifndef SQLITE_SHELL_IS_UTF8
33197# if (defined(_WIN32) || defined(WIN32))
33198 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
33199# define SQLITE_SHELL_IS_UTF8 (0)
33200# else
33201# define SQLITE_SHELL_IS_UTF8 (1)
33202# endif
33203#endif
33204
33205#ifdef SQLITE_SHELL_FIDDLE
33206# define main fiddle_main
33207#endif
33210int SQLITE_CDECL main(int argc, char **argv){
33211#else
33212int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
33213 char **argv;
33214#endif
33215#ifdef SQLITE_DEBUG
33216 sqlite3_int64 mem_main_enter = 0;
33217#endif
33218 char *zErrMsg = 0;
33219#ifdef SQLITE_SHELL_FIDDLE
33220# define data shellState
33221#else
33222 ShellState data;
33223#endif
33224 const char *zInitFile = 0;
33225 int i;
33226 int rc = 0;
33227 int warnInmemoryDb = 0;
33228 int readStdin = 1;
33229 int nCmd = 0;
33230 int nOptsEnd = argc;
33231 int bEnableVfstrace = 0;
33232 char **azCmd = 0;
33233 const char *zVfs = 0; /* Value of -vfs command-line option */
33235 char **argvToFree = 0;
33236 int argcToFree = 0;
33237#endif
33238 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
33239
33240#ifdef SQLITE_SHELL_FIDDLE
33241 stdin_is_interactive = 0;
33242 stdout_is_console = 1;
33243 data.wasm.zDefaultDbName = "/fiddle.sqlite3";
33244#else
33245 stdin_is_interactive = isatty(0);
33246 stdout_is_console = isatty(1);
33247#endif
33248 atexit(sayAbnormalExit);
33249#ifdef SQLITE_DEBUG
33250 mem_main_enter = sqlite3_memory_used();
33251#endif
33252#if !defined(_WIN32_WCE)
33253 if( getenv("SQLITE_DEBUG_BREAK") ){
33254 if( isatty(0) && isatty(2) ){
33255 char zLine[100];
33256 sqlite3_fprintf(stderr,
33257 "attach debugger to process %d and press ENTER to continue...",
33258 GETPID());
33259 if( sqlite3_fgets(zLine, sizeof(zLine), stdin)!=0
33260 && cli_strcmp(zLine,"stop")==0
33261 ){
33262 exit(1);
33263 }
33264 }else{
33265#if defined(_WIN32) || defined(WIN32)
33267 __debugbreak();
33268#else
33269 DebugBreak();
33270#endif
33271#elif defined(SIGTRAP)
33272 raise(SIGTRAP);
33273#endif
33274 }
33275 }
33276#endif
33277 /* Register a valid signal handler early, before much else is done. */
33278#ifdef SIGINT
33279 signal(SIGINT, interrupt_handler);
33280#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
33281 if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
33282 eputz("No ^C handler.\n");
33283 }
33284#endif
33285
33286#if USE_SYSTEM_SQLITE+0!=1
33288 sqlite3_fprintf(stderr,
33289 "SQLite header and source version mismatch\n%s\n%s\n",
33291 exit(1);
33292 }
33293#endif
33294 main_init(&data);
33295
33296 /* On Windows, we must translate command-line arguments into UTF-8.
33297 ** The SQLite memory allocator subsystem has to be enabled in order to
33298 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
33299 ** subsequent sqlite3_config() calls will work. So copy all results into
33300 ** memory that does not come from the SQLite memory allocator.
33301 */
33304 argvToFree = malloc(sizeof(argv[0])*argc*2);
33305 shell_check_oom(argvToFree);
33306 argcToFree = argc;
33307 argv = argvToFree + argc;
33308 for(i=0; i<argc; i++){
33309 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
33310 i64 n;
33312 n = strlen(z);
33313 argv[i] = malloc( n+1 );
33314 shell_check_oom(argv[i]);
33315 memcpy(argv[i], z, n+1);
33316 argvToFree[i] = argv[i];
33318 }
33320#endif
33321
33322 assert( argc>=1 && argv && argv[0] );
33323 Argv0 = argv[0];
33324
33325#ifdef SQLITE_SHELL_DBNAME_PROC
33326 {
33327 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
33328 ** of a C-function that will provide the name of the database file. Use
33329 ** this compile-time option to embed this shell program in larger
33330 ** applications. */
33331 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
33332 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
33333 warnInmemoryDb = 0;
33334 }
33335#endif
33336
33337 /* Do an initial pass through the command-line argument to locate
33338 ** the name of the database file, the name of the initialization file,
33339 ** the size of the alternative malloc heap, options affecting commands
33340 ** or SQL run from the command line, and the first command to execute.
33341 */
33342#ifndef SQLITE_SHELL_FIDDLE
33343 verify_uninitialized();
33344#endif
33345 for(i=1; i<argc; i++){
33346 char *z;
33347 z = argv[i];
33348 if( z[0]!='-' || i>nOptsEnd ){
33349 if( data.aAuxDb->zDbFilename==0 ){
33350 data.aAuxDb->zDbFilename = z;
33351 }else{
33352 /* Excess arguments are interpreted as SQL (or dot-commands) and
33353 ** mean that nothing is read from stdin */
33354 readStdin = 0;
33355 nCmd++;
33356 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
33357 shell_check_oom(azCmd);
33358 azCmd[nCmd-1] = z;
33359 }
33360 continue;
33361 }
33362 if( z[1]=='-' ) z++;
33363 if( cli_strcmp(z, "-")==0 ){
33364 nOptsEnd = i;
33365 continue;
33366 }else if( cli_strcmp(z,"-separator")==0
33367 || cli_strcmp(z,"-nullvalue")==0
33368 || cli_strcmp(z,"-newline")==0
33369 || cli_strcmp(z,"-cmd")==0
33370 ){
33371 (void)cmdline_option_value(argc, argv, ++i);
33372 }else if( cli_strcmp(z,"-init")==0 ){
33373 zInitFile = cmdline_option_value(argc, argv, ++i);
33374 }else if( cli_strcmp(z,"-interactive")==0 ){
33375 }else if( cli_strcmp(z,"-batch")==0 ){
33376 /* Need to check for batch mode here to so we can avoid printing
33377 ** informational messages (like from process_sqliterc) before
33378 ** we do the actual processing of arguments later in a second pass.
33379 */
33381 }else if( cli_strcmp(z,"-utf8")==0 ){
33382 }else if( cli_strcmp(z,"-no-utf8")==0 ){
33383 }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
33384 int val = 0;
33386 assert( val==0 );
33387 }else if( cli_strcmp(z,"-heap")==0 ){
33388#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
33389 const char *zSize;
33390 sqlite3_int64 szHeap;
33391
33392 zSize = cmdline_option_value(argc, argv, ++i);
33393 szHeap = integerValue(zSize);
33394 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
33395 verify_uninitialized();
33396 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
33397#else
33398 (void)cmdline_option_value(argc, argv, ++i);
33399#endif
33400 }else if( cli_strcmp(z,"-pagecache")==0 ){
33401 sqlite3_int64 n, sz;
33402 sz = integerValue(cmdline_option_value(argc,argv,++i));
33403 if( sz>70000 ) sz = 70000;
33404 if( sz<0 ) sz = 0;
33405 n = integerValue(cmdline_option_value(argc,argv,++i));
33406 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
33407 n = 0xffffffffffffLL/sz;
33408 }
33409 verify_uninitialized();
33411 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
33413 }else if( cli_strcmp(z,"-lookaside")==0 ){
33414 int n, sz;
33415 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
33416 if( sz<0 ) sz = 0;
33417 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
33418 if( n<0 ) n = 0;
33419 verify_uninitialized();
33421 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
33422 }else if( cli_strcmp(z,"-threadsafe")==0 ){
33423 int n;
33424 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
33425 verify_uninitialized();
33426 switch( n ){
33430 }
33431 }else if( cli_strcmp(z,"-vfstrace")==0 ){
33432 bEnableVfstrace = 1;
33433#ifdef SQLITE_ENABLE_MULTIPLEX
33434 }else if( cli_strcmp(z,"-multiplex")==0 ){
33435 extern int sqlite3_multiplex_initialize(const char*,int);
33436 sqlite3_multiplex_initialize(0, 1);
33437#endif
33438 }else if( cli_strcmp(z,"-mmap")==0 ){
33439 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
33440 verify_uninitialized();
33442#if defined(SQLITE_ENABLE_SORTER_REFERENCES)
33443 }else if( cli_strcmp(z,"-sorterref")==0 ){
33444 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
33445 verify_uninitialized();
33446 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
33447#endif
33448 }else if( cli_strcmp(z,"-vfs")==0 ){
33449 zVfs = cmdline_option_value(argc, argv, ++i);
33450#ifdef SQLITE_HAVE_ZLIB
33451 }else if( cli_strcmp(z,"-zip")==0 ){
33452 data.openMode = SHELL_OPEN_ZIPFILE;
33453#endif
33454 }else if( cli_strcmp(z,"-append")==0 ){
33456#ifndef SQLITE_OMIT_DESERIALIZE
33457 }else if( cli_strcmp(z,"-deserialize")==0 ){
33459 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
33460 data.szMax = integerValue(argv[++i]);
33461#endif
33462 }else if( cli_strcmp(z,"-readonly")==0 ){
33464 }else if( cli_strcmp(z,"-nofollow")==0 ){
33466#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
33467 }else if( cli_strncmp(z, "-A",2)==0 ){
33468 /* All remaining command-line arguments are passed to the ".archive"
33469 ** command, so ignore them */
33470 break;
33471#endif
33472 }else if( cli_strcmp(z, "-memtrace")==0 ){
33474 }else if( cli_strcmp(z, "-pcachetrace")==0 ){
33476 }else if( cli_strcmp(z,"-bail")==0 ){
33477 bail_on_error = 1;
33478 }else if( cli_strcmp(z,"-nonce")==0 ){
33479 free(data.zNonce);
33480 data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
33481 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
33483 }else if( cli_strcmp(z,"-safe")==0 ){
33484 /* no-op - catch this on the second pass */
33485 }else if( cli_strcmp(z,"-escape")==0 && i+1<argc ){
33486 /* skip over the argument */
33487 i++;
33488 }
33489 }
33490#ifndef SQLITE_SHELL_FIDDLE
33491 if( !bEnableVfstrace ) verify_uninitialized();
33492#endif
33493
33494
33495#ifdef SQLITE_SHELL_INIT_PROC
33496 {
33497 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
33498 ** of a C-function that will perform initialization actions on SQLite that
33499 ** occur just before or after sqlite3_initialize(). Use this compile-time
33500 ** option to embed this shell program in larger applications. */
33501 extern void SQLITE_SHELL_INIT_PROC(void);
33502 SQLITE_SHELL_INIT_PROC();
33503 }
33504#else
33505 /* All the sqlite3_config() calls have now been made. So it is safe
33506 ** to call sqlite3_initialize() and process any command line -vfs option. */
33508#endif
33509
33510 if( zVfs ){
33511 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
33512 if( pVfs ){
33514 }else{
33515 sqlite3_fprintf(stderr,"no such VFS: \"%s\"\n", zVfs);
33516 exit(1);
33517 }
33518 }
33519
33520 if( data.pAuxDb->zDbFilename==0 ){
33521#ifndef SQLITE_OMIT_MEMORYDB
33522 data.pAuxDb->zDbFilename = ":memory:";
33523 warnInmemoryDb = argc==1;
33524#else
33525 sqlite3_fprintf(stderr,
33526 "%s: Error: no database filename specified\n", Argv0);
33527 return 1;
33528#endif
33529 }
33530 data.out = stdout;
33531 if( bEnableVfstrace ){
33532 vfstrace_register("trace",0,vfstraceOut, &data, 1);
33533 }
33534#ifndef SQLITE_SHELL_FIDDLE
33536#endif
33537
33538 /* Go ahead and open the database file if it already exists. If the
33539 ** file does not exist, delay opening it. This prevents empty database
33540 ** files from being created if a user mistypes the database name argument
33541 ** to the sqlite command-line tool.
33542 */
33543 if( access(data.pAuxDb->zDbFilename, 0)==0 ){
33544 open_db(&data, 0);
33545 }
33546
33547 /* Process the initialization file if there is one. If no -init option
33548 ** is given on the command line, look for a file named ~/.sqliterc and
33549 ** try to process it.
33550 */
33551 process_sqliterc(&data,zInitFile);
33552
33553 /* Make a second pass through the command-line argument and set
33554 ** options. This second pass is delayed until after the initialization
33555 ** file is processed so that the command-line arguments will override
33556 ** settings in the initialization file.
33557 */
33558 for(i=1; i<argc; i++){
33559 char *z = argv[i];
33560 if( z[0]!='-' || i>=nOptsEnd ) continue;
33561 if( z[1]=='-' ){ z++; }
33562 if( cli_strcmp(z,"-init")==0 ){
33563 i++;
33564 }else if( cli_strcmp(z,"-html")==0 ){
33565 data.mode = MODE_Html;
33566 }else if( cli_strcmp(z,"-list")==0 ){
33567 data.mode = MODE_List;
33568 }else if( cli_strcmp(z,"-quote")==0 ){
33569 data.mode = MODE_Quote;
33572 }else if( cli_strcmp(z,"-line")==0 ){
33573 data.mode = MODE_Line;
33574 }else if( cli_strcmp(z,"-column")==0 ){
33575 data.mode = MODE_Column;
33576 }else if( cli_strcmp(z,"-json")==0 ){
33577 data.mode = MODE_Json;
33578 }else if( cli_strcmp(z,"-markdown")==0 ){
33579 data.mode = MODE_Markdown;
33580 }else if( cli_strcmp(z,"-table")==0 ){
33581 data.mode = MODE_Table;
33582 }else if( cli_strcmp(z,"-box")==0 ){
33583 data.mode = MODE_Box;
33584 }else if( cli_strcmp(z,"-csv")==0 ){
33585 data.mode = MODE_Csv;
33586 memcpy(data.colSeparator,",",2);
33587 }else if( cli_strcmp(z,"-escape")==0 && i+1<argc ){
33588 /* See similar code at tag-20250224-1 */
33589 const char *zEsc = argv[++i];
33590 int k;
33591 for(k=0; k<ArraySize(shell_EscModeNames); k++){
33592 if( sqlite3_stricmp(zEsc,shell_EscModeNames[k])==0 ){
33593 data.eEscMode = k;
33594 break;
33595 }
33596 }
33597 if( k>=ArraySize(shell_EscModeNames) ){
33598 sqlite3_fprintf(stderr, "unknown control character escape mode \"%s\""
33599 " - choices:", zEsc);
33600 for(k=0; k<ArraySize(shell_EscModeNames); k++){
33601 sqlite3_fprintf(stderr, " %s", shell_EscModeNames[k]);
33602 }
33603 sqlite3_fprintf(stderr, "\n");
33604 exit(1);
33605 }
33606#ifdef SQLITE_HAVE_ZLIB
33607 }else if( cli_strcmp(z,"-zip")==0 ){
33608 data.openMode = SHELL_OPEN_ZIPFILE;
33609#endif
33610 }else if( cli_strcmp(z,"-append")==0 ){
33612#ifndef SQLITE_OMIT_DESERIALIZE
33613 }else if( cli_strcmp(z,"-deserialize")==0 ){
33615 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
33616 data.szMax = integerValue(argv[++i]);
33617#endif
33618 }else if( cli_strcmp(z,"-readonly")==0 ){
33620 }else if( cli_strcmp(z,"-nofollow")==0 ){
33622 }else if( cli_strcmp(z,"-ascii")==0 ){
33623 data.mode = MODE_Ascii;
33626 }else if( cli_strcmp(z,"-tabs")==0 ){
33627 data.mode = MODE_List;
33630 }else if( cli_strcmp(z,"-separator")==0 ){
33632 "%s",cmdline_option_value(argc,argv,++i));
33633 }else if( cli_strcmp(z,"-newline")==0 ){
33635 "%s",cmdline_option_value(argc,argv,++i));
33636 }else if( cli_strcmp(z,"-nullvalue")==0 ){
33638 "%s",cmdline_option_value(argc,argv,++i));
33639 }else if( cli_strcmp(z,"-header")==0 ){
33640 data.showHeader = 1;
33642 }else if( cli_strcmp(z,"-noheader")==0 ){
33643 data.showHeader = 0;
33645 }else if( cli_strcmp(z,"-echo")==0 ){
33646 ShellSetFlag(&data, SHFLG_Echo);
33647 }else if( cli_strcmp(z,"-eqp")==0 ){
33648 data.autoEQP = AUTOEQP_on;
33649 }else if( cli_strcmp(z,"-eqpfull")==0 ){
33650 data.autoEQP = AUTOEQP_full;
33651 }else if( cli_strcmp(z,"-stats")==0 ){
33652 data.statsOn = 1;
33653 }else if( cli_strcmp(z,"-scanstats")==0 ){
33654 data.scanstatsOn = 1;
33655 }else if( cli_strcmp(z,"-backslash")==0 ){
33656 /* Undocumented command-line option: -backslash
33657 ** Causes C-style backslash escapes to be evaluated in SQL statements
33658 ** prior to sending the SQL into SQLite. Useful for injecting
33659 ** crazy bytes in the middle of SQL statements for testing and debugging.
33660 */
33662 }else if( cli_strcmp(z,"-bail")==0 ){
33663 /* No-op. The bail_on_error flag should already be set. */
33664 }else if( cli_strcmp(z,"-version")==0 ){
33665 sqlite3_fprintf(stdout, "%s %s (%d-bit)\n",
33666 sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
33667 return 0;
33668 }else if( cli_strcmp(z,"-interactive")==0 ){
33669 /* Need to check for interactive override here to so that it can
33670 ** affect console setup (for Windows only) and testing thereof.
33671 */
33673 }else if( cli_strcmp(z,"-batch")==0 ){
33674 /* already handled */
33675 }else if( cli_strcmp(z,"-utf8")==0 ){
33676 /* already handled */
33677 }else if( cli_strcmp(z,"-no-utf8")==0 ){
33678 /* already handled */
33679 }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
33680 /* already handled */
33681 }else if( cli_strcmp(z,"-heap")==0 ){
33682 i++;
33683 }else if( cli_strcmp(z,"-pagecache")==0 ){
33684 i+=2;
33685 }else if( cli_strcmp(z,"-lookaside")==0 ){
33686 i+=2;
33687 }else if( cli_strcmp(z,"-threadsafe")==0 ){
33688 i+=2;
33689 }else if( cli_strcmp(z,"-nonce")==0 ){
33690 i += 2;
33691 }else if( cli_strcmp(z,"-mmap")==0 ){
33692 i++;
33693 }else if( cli_strcmp(z,"-memtrace")==0 ){
33694 i++;
33695 }else if( cli_strcmp(z,"-pcachetrace")==0 ){
33696 i++;
33697#ifdef SQLITE_ENABLE_SORTER_REFERENCES
33698 }else if( cli_strcmp(z,"-sorterref")==0 ){
33699 i++;
33700#endif
33701 }else if( cli_strcmp(z,"-vfs")==0 ){
33702 i++;
33703 }else if( cli_strcmp(z,"-vfstrace")==0 ){
33704 i++;
33705#ifdef SQLITE_ENABLE_MULTIPLEX
33706 }else if( cli_strcmp(z,"-multiplex")==0 ){
33707 i++;
33708#endif
33709 }else if( cli_strcmp(z,"-help")==0 ){
33710 usage(1);
33711 }else if( cli_strcmp(z,"-cmd")==0 ){
33712 /* Run commands that follow -cmd first and separately from commands
33713 ** that simply appear on the command-line. This seems goofy. It would
33714 ** be better if all commands ran in the order that they appear. But
33715 ** we retain the goofy behavior for historical compatibility. */
33716 if( i==argc-1 ) break;
33717 z = cmdline_option_value(argc,argv,++i);
33718 if( z[0]=='.' ){
33719 rc = do_meta_command(z, &data);
33720 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
33721 }else{
33722 open_db(&data, 0);
33723 rc = shell_exec(&data, z, &zErrMsg);
33724 if( zErrMsg!=0 ){
33725 shellEmitError(zErrMsg);
33726 if( bail_on_error ) return rc!=0 ? rc : 1;
33727 }else if( rc!=0 ){
33728 sqlite3_fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
33729 if( bail_on_error ) return rc;
33730 }
33731 }
33732#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
33733 }else if( cli_strncmp(z, "-A", 2)==0 ){
33734 if( nCmd>0 ){
33735 sqlite3_fprintf(stderr,"Error: cannot mix regular SQL or dot-commands"
33736 " with \"%s\"\n", z);
33737 return 1;
33738 }
33739 open_db(&data, OPEN_DB_ZIPFILE);
33740 if( z[2] ){
33741 argv[i] = &z[2];
33742 arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
33743 }else{
33744 arDotCommand(&data, 1, argv+i, argc-i);
33745 }
33746 readStdin = 0;
33747 break;
33748#endif
33749 }else if( cli_strcmp(z,"-safe")==0 ){
33750 data.bSafeMode = data.bSafeModePersist = 1;
33751 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
33752 /* Acted upon in first pass. */
33753 }else{
33754 sqlite3_fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
33755 eputz("Use -help for a list of options.\n");
33756 return 1;
33757 }
33758 data.cMode = data.mode;
33759 }
33760
33761 if( !readStdin ){
33762 /* Run all arguments that do not begin with '-' as if they were separate
33763 ** command-line inputs, except for the argToSkip argument which contains
33764 ** the database filename.
33765 */
33766 for(i=0; i<nCmd; i++){
33767 echo_group_input(&data, azCmd[i]);
33768 if( azCmd[i][0]=='.' ){
33769 rc = do_meta_command(azCmd[i], &data);
33770 if( rc ){
33771 if( rc==2 ) rc = 0;
33772 goto shell_main_exit;
33773 }
33774 }else{
33775 open_db(&data, 0);
33776 rc = shell_exec(&data, azCmd[i], &zErrMsg);
33777 if( zErrMsg || rc ){
33778 if( zErrMsg!=0 ){
33779 shellEmitError(zErrMsg);
33780 }else{
33781 sqlite3_fprintf(stderr,
33782 "Error: unable to process SQL: %s\n", azCmd[i]);
33783 }
33784 sqlite3_free(zErrMsg);
33785 if( rc==0 ) rc = 1;
33786 goto shell_main_exit;
33787 }
33788 }
33789 }
33790 }else{
33791 /* Run commands received from standard input
33792 */
33794 char *zHome;
33795 char *zHistory;
33796 int nHistory;
33797 sqlite3_fprintf(stdout,
33798 "SQLite version %s %.19s\n" /*extra-version-info*/
33799 "Enter \".help\" for usage hints.\n",
33801 if( warnInmemoryDb ){
33802 sputz(stdout, "Connected to a ");
33803 printBold("transient in-memory database");
33804 sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a"
33805 " persistent database.\n");
33806 }
33807 zHistory = getenv("SQLITE_HISTORY");
33808 if( zHistory ){
33809 zHistory = strdup(zHistory);
33810 }else if( (zHome = find_home_dir(0))!=0 ){
33811 nHistory = strlen30(zHome) + 20;
33812 if( (zHistory = malloc(nHistory))!=0 ){
33813 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
33814 }
33815 }
33816 if( zHistory ){ shell_read_history(zHistory); }
33817#if (HAVE_READLINE || HAVE_EDITLINE) && !defined(SQLITE_OMIT_READLINE_COMPLETION)
33818 rl_attempted_completion_function = readline_completion;
33819#elif HAVE_LINENOISE==1
33820 linenoiseSetCompletionCallback(linenoise_completion);
33821#elif HAVE_LINENOISE==2
33822 linenoiseSetCompletionCallback(linenoise_completion, NULL);
33823#endif
33824 data.in = 0;
33825 rc = process_input(&data);
33826 if( zHistory ){
33828 shell_write_history(zHistory);
33829 free(zHistory);
33830 }
33831 }else{
33832 data.in = stdin;
33833 rc = process_input(&data);
33834 }
33835 }
33836#ifndef SQLITE_SHELL_FIDDLE
33837 /* In WASM mode we have to leave the db state in place so that
33838 ** client code can "push" SQL into it after this call returns. */
33839#ifndef SQLITE_OMIT_VIRTUALTABLE
33840 if( data.expert.pExpert ){
33841 expertFinish(&data, 1, 0);
33842 }
33843#endif
33844 shell_main_exit:
33845 free(azCmd);
33846 set_table_name(&data, 0);
33847 if( data.db ){
33848 session_close_all(&data, -1);
33849 close_db(data.db);
33850 }
33851 for(i=0; i<ArraySize(data.aAuxDb); i++){
33852 sqlite3_free(data.aAuxDb[i].zFreeOnClose);
33853 if( data.aAuxDb[i].db ){
33854 session_close_all(&data, i);
33855 close_db(data.aAuxDb[i].db);
33856 }
33857 }
33858 find_home_dir(1);
33859 output_reset(&data);
33860 data.doXdgOpen = 0;
33861 clearTempFile(&data);
33863 for(i=0; i<argcToFree; i++) free(argvToFree[i]);
33864 free(argvToFree);
33865#endif
33866 free(data.colWidth);
33867 free(data.zNonce);
33868 /* Clear the global data structure so that valgrind will detect memory
33869 ** leaks */
33870 memset(&data, 0, sizeof(data));
33871 if( bEnableVfstrace ){
33872 vfstrace_unregister("trace");
33873 }
33874#ifdef SQLITE_DEBUG
33875 if( sqlite3_memory_used()>mem_main_enter ){
33876 sqlite3_fprintf(stderr,"Memory leaked: %u bytes\n",
33877 (unsigned int)(sqlite3_memory_used()-mem_main_enter));
33878 }
33879#endif
33880#else /* SQLITE_SHELL_FIDDLE... */
33881 shell_main_exit:
33882#endif
33883 return rc;
33884}
33885
33886
33887#ifdef SQLITE_SHELL_FIDDLE
33888/* Only for emcc experimentation purposes. */
33889int fiddle_experiment(int a,int b){
33890 return a + b;
33891}
33892
33893/*
33894** Returns a pointer to the current DB handle.
33895*/
33896sqlite3 * fiddle_db_handle(){
33897 return globalDb;
33898}
33899
33900/*
33901** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
33902** "main" is assumed. Returns 0 if no db with the given name is
33903** open.
33904*/
33905sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
33906 sqlite3_vfs * pVfs = 0;
33907 if(globalDb){
33908 sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
33909 SQLITE_FCNTL_VFS_POINTER, &pVfs);
33910 }
33911 return pVfs;
33912}
33913
33914/* Only for emcc experimentation purposes. */
33915sqlite3 * fiddle_db_arg(sqlite3 *arg){
33916 sqlite3_fprintf(stdout, "fiddle_db_arg(%p)\n", (const void*)arg);
33917 return arg;
33918}
33919
33920/*
33921** Intended to be called via a SharedWorker() while a separate
33922** SharedWorker() (which manages the wasm module) is performing work
33923** which should be interrupted. Unfortunately, SharedWorker is not
33924** portable enough to make real use of.
33925*/
33926void fiddle_interrupt(void){
33927 if( globalDb ) sqlite3_interrupt(globalDb);
33928}
33929
33930/*
33931** Returns the filename of the given db name, assuming "main" if
33932** zDbName is NULL. Returns NULL if globalDb is not opened.
33933*/
33934const char * fiddle_db_filename(const char * zDbName){
33935 return globalDb
33936 ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
33937 : NULL;
33938}
33939
33940/*
33941** Completely wipes out the contents of the currently-opened database
33942** but leaves its storage intact for reuse. If any transactions are
33943** active, they are forcibly rolled back.
33944*/
33945void fiddle_reset_db(void){
33946 if( globalDb ){
33947 int rc;
33948 while( sqlite3_txn_state(globalDb,0)>0 ){
33949 /*
33950 ** Resolve problem reported in
33951 ** https://sqlite.org/forum/forumpost/0b41a25d65
33952 */
33953 sqlite3_fputs("Rolling back in-progress transaction.\n", stdout);
33954 sqlite3_exec(globalDb,"ROLLBACK", 0, 0, 0);
33955 }
33956 rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
33957 if( 0==rc ) sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
33958 sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
33959 }
33960}
33961
33962/*
33963** Uses the current database's VFS xRead to stream the db file's
33964** contents out to the given callback. The callback gets a single
33965** chunk of size n (its 2nd argument) on each call and must return 0
33966** on success, non-0 on error. This function returns 0 on success,
33967** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
33968** code from the callback. Note that this is not thread-friendly: it
33969** expects that it will be the only thread reading the db file and
33970** takes no measures to ensure that is the case.
33971*/
33972int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
33973 sqlite3_int64 nSize = 0;
33974 sqlite3_int64 nPos = 0;
33975 sqlite3_file * pFile = 0;
33976 unsigned char buf[1024 * 8];
33977 int nBuf = (int)sizeof(buf);
33978 int rc = shellState.db
33979 ? sqlite3_file_control(shellState.db, "main",
33980 SQLITE_FCNTL_FILE_POINTER, &pFile)
33981 : SQLITE_NOTFOUND;
33982 if( rc ) return rc;
33983 rc = pFile->pMethods->xFileSize(pFile, &nSize);
33984 if( rc ) return rc;
33985 if(nSize % nBuf){
33986 /* DB size is not an even multiple of the buffer size. Reduce
33987 ** buffer size so that we do not unduly inflate the db size when
33988 ** exporting. */
33989 if(0 == nSize % 4096) nBuf = 4096;
33990 else if(0 == nSize % 2048) nBuf = 2048;
33991 else if(0 == nSize % 1024) nBuf = 1024;
33992 else nBuf = 512;
33993 }
33994 for( ; 0==rc && nPos<nSize; nPos += nBuf ){
33995 rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
33996 if(SQLITE_IOERR_SHORT_READ == rc){
33997 rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
33998 }
33999 if( 0==rc ) rc = xCallback(buf, nBuf);
34000 }
34001 return rc;
34002}
34003
34004/*
34005** Trivial exportable function for emscripten. It processes zSql as if
34006** it were input to the sqlite3 shell and redirects all output to the
34007** wasm binding. fiddle_main() must have been called before this
34008** is called, or results are undefined.
34009*/
34010void fiddle_exec(const char * zSql){
34011 if(zSql && *zSql){
34012 if('.'==*zSql) puts(zSql);
34013 shellState.wasm.zInput = zSql;
34014 shellState.wasm.zPos = zSql;
34015 process_input(&shellState);
34016 shellState.wasm.zInput = shellState.wasm.zPos = 0;
34017 }
34018}
34019#endif /* SQLITE_SHELL_FIDDLE */
static unsigned re_next_char(ReInput *p)
Definition shell.c:7224
static int decodeUtf8(const unsigned char *z, int *pU)
Definition shell.c:1118
#define MAX_INPUT_NESTING
Definition shell.c:21880
#define EXPERT_REPORT_PLAN
Definition shell.c:12742
static int stdout_is_console
Definition shell.c:832
static unsigned re_esc_char(ReCompiled *p)
Definition shell.c:7490
static void ieee754inc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:6123
static void decimalSumInverse(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4463
static void vfstraceDlError(sqlite3_vfs *, int nByte, char *zErrMsg)
Definition shell.c:17219
static void vfstrace_print_errcode(vfstrace_info *pInfo, const char *zFormat, int rc)
Definition shell.c:16541
static int vfstraceShmUnmap(sqlite3_file *, int)
Definition shell.c:17047
#define ToLower(X)
Definition shell.c:238
static int re_word_char(int c)
Definition shell.c:7256
#define SEP_Row
Definition shell.c:21868
static int idxCreateFromWhere(sqlite3expert *p, IdxScan *pScan, IdxConstraint *pTail)
Definition shell.c:13814
static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt,...)
Definition shell.c:8661
static int bail_on_error
Definition shell.c:819
#define B64_DARK_MAX
Definition shell.c:5202
static int vfstraceDeviceCharacteristics(sqlite3_file *)
Definition shell.c:16970
static int vfstraceFullPathname(sqlite3_vfs *, const char *zName, int, char *)
Definition shell.c:17185
#define MODE_Quote
Definition shell.c:21823
#define VTR_SLEEP
Definition shell.c:16397
static int completionNext(sqlite3_vtab_cursor *cur)
Definition shell.c:9216
static void sha3AggStep(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:3109
int sqlite3_intck_open(sqlite3 *db, const char *zDb, sqlite3_intck **ppOut)
Definition shell.c:15946
#define BOX_124
Definition shell.c:24134
#define RE_OP_FORK
Definition shell.c:7132
#define SHFLG_DumpDataOnly
Definition shell.c:21803
#define RE_OP_CC_VALUE
Definition shell.c:7137
#define VTR_OPEN
Definition shell.c:16388
unsigned int u32
Definition shell.c:37
#define SQLITE_SHELL_IS_UTF8
Definition shell.c:33199
#define VTR_DLCLOSE
Definition shell.c:16395
static void writefileFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:8463
static const char * idxHashSearch(IdxHash *pHash, const char *zKey, int nKey)
Definition shell.c:13042
#define IsSpace(X)
Definition shell.c:236
#define sputz(fp, z)
Definition shell.c:634
#define CONTINUE_PAREN_INCR(p, n)
Definition shell.c:906
int sqlite3CompletionVtabInit(sqlite3 *db)
Definition shell.c:9502
static int seriesClose(sqlite3_vtab_cursor *cur)
Definition shell.c:6502
static void readFileContents(sqlite3_context *ctx, const char *zName)
Definition shell.c:8110
static void setupSequence(SequenceSpec *pss)
Definition shell.c:6349
static Decimal * decimalFromDouble(double)
Definition shell.c:4296
int sqlite3_stmtrand_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:16191
static int vfstraceDelete(sqlite3_vfs *, const char *zName, int syncDir)
Definition shell.c:17146
static int apndShmMap(sqlite3_file *, int iPg, int pgsz, int, void volatile **)
Definition shell.c:9909
void dummyUDFvalue(sqlite3_context *up1)
Definition shell.c:14686
void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName)
Definition shell.c:14670
static int apndSectorSize(sqlite3_file *)
Definition shell.c:9895
#define MODE_Explain
Definition shell.c:21826
#define RE_OP_SPACE
Definition shell.c:7143
static int idxHashString(const char *z, int n)
Definition shell.c:12971
#define APND_ALIGN_MASK
Definition shell.c:9607
#define SHA_ROT(x, l, r)
Definition shell.c:3230
#define VTR_DLSYM
Definition shell.c:16394
static void SHA1Transform(unsigned int state[5], const unsigned char buffer[64])
Definition shell.c:3262
static int vfstraceSetSystemCall(sqlite3_vfs *, const char *, sqlite3_syscall_ptr)
Definition shell.c:17315
static Decimal * decimal_new(sqlite3_context *pCtx, sqlite3_value *pIn, int bTextOnly)
Definition shell.c:3877
static int completionClose(sqlite3_vtab_cursor *cur)
Definition shell.c:9196
int iFirst
Definition shell.c:1012
static int idxFindIndexes(sqlite3expert *p, char **pzErr)
Definition shell.c:13942
static void intckFindObject(sqlite3_intck *p)
Definition shell.c:15437
static int expertDbContainsObject(sqlite3 *db, const char *zTab, int *pbContains)
Definition shell.c:14158
int sqlite3_ieee_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:6145
static void vfstrace_printf(vfstrace_info *pInfo, const char *zFormat,...)
Definition shell.c:16459
static void memtraceFree(void *p)
Definition shell.c:2078
static int re_append(ReCompiled *p, int op, int arg)
Definition shell.c:7455
static sqlite3_pcache_methods2 ersaztPcacheMethods
Definition shell.c:2288
#define re_match
Definition shell.c:7118
static sqlite3_syscall_ptr vfstraceGetSystemCall(sqlite3_vfs *, const char *)
Definition shell.c:17324
#define RE_OP_DIGIT
Definition shell.c:7141
static int intckStep(sqlite3_intck *p, sqlite3_stmt *pStmt)
Definition shell.c:15295
#define END_TIMER(X)
Definition shell.c:717
#define QSS_INPLAIN(qss)
Definition shell.c:32455
#define VTR_FETCH
Definition shell.c:16400
#define a20
static void intckParseCreateIndexFunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal)
Definition shell.c:15614
#define SEP_Comma
Definition shell.c:21871
static int apndDeviceCharacteristics(sqlite3_file *)
Definition shell.c:9903
#define UNIQUE_TABLE_NAME
Definition shell.c:12809
#define d
static int percentIsInfinity(double r)
Definition shell.c:4746
static int apndOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int *)
Definition shell.c:10035
static int apndFullPathname(sqlite3_vfs *, const char *zName, int, char *zOut)
Definition shell.c:10117
static void idxHashInit(IdxHash *pHash)
Definition shell.c:12946
#define R1(v, w, x, y, z, i)
Definition shell.c:3250
#define MODE_Line
Definition shell.c:21817
#define e
int sqlite3_expert_count(sqlite3expert *)
Definition shell.c:14940
#define STRLEN
Definition shell.c:12802
static void freeText(ShellText *p)
Definition shell.c:1473
static sqlite3_mem_methods ersaztMethods
Definition shell.c:2111
static void pcachetraceUnpin(sqlite3_pcache *p, sqlite3_pcache_page *pPg, int bDiscard)
Definition shell.c:2245
static int fsdirRegister(sqlite3 *db)
Definition shell.c:8944
static void apndShmBarrier(sqlite3_file *)
Definition shell.c:9927
static FILE * memtraceOut
Definition shell.c:2068
int sqlite3_series_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:7030
static int apndCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64 *)
Definition shell.c:10149
static FILE * openChrSource(const char *zFile)
Definition shell.c:1286
static int expertEof(sqlite3_vtab_cursor *cur)
Definition shell.c:13317
static int completionFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv)
Definition shell.c:9376
#define MODE_Html
Definition shell.c:21821
static void * idxMalloc(int *pRc, int nByte)
Definition shell.c:12930
#define ORIGVFS(p)
Definition shell.c:9619
#define SQLITE_SHELL_HAVE_RECOVER
Definition shell.c:17427
static int vfstraceFileSize(sqlite3_file *, sqlite3_int64 *pSize)
Definition shell.c:16679
static void stmtrandFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:16154
static void decimal_expand(Decimal *p, int nDigit, int nFrac)
Definition shell.c:4111
#define SHFLG_Pagecache
Definition shell.c:21795
#define BX_DV_PROTO(c)
Definition shell.c:5195
static int fileLinkStat(const char *zPath, STRUCT_STAT *pStatBuf)
Definition shell.c:8278
int sqlite3PcacheTraceActivate(FILE *out)
Definition shell.c:2305
#define BOX_12
Definition shell.c:24129
#define COMPLETION_COLUMN_PREFIX
#define BOX_24
Definition shell.c:24125
#define VTR_CLOSE
Definition shell.c:16372
#define SHA3_BYTEORDER
Definition shell.c:2464
int cli_wcwidth(int c)
Definition shell.c:1088
static void * memtraceRealloc(void *p, int n)
Definition shell.c:2085
#define CHAR_BIT
Definition shell.c:32447
#define VTR_SECSZ
Definition shell.c:16382
#define a24
static const char * vfstrace_errcode_name(int rc)
Definition shell.c:16478
#define a14
static void base85(sqlite3_context *context, int na, sqlite3_value *av[])
Definition shell.c:5682
#define RE_OP_ATSTART
Definition shell.c:7146
static void decimalSumValue(sqlite3_context *context)
Definition shell.c:4479
static int pcachetraceInit(void *pArg)
Definition shell.c:2182
static void sha3AggFinal(sqlite3_context *context)
Definition shell.c:3134
#define ShellSetFlag(P, X)
Definition shell.c:21811
static int apndAccess(sqlite3_vfs *, const char *zName, int flags, int *)
Definition shell.c:10109
#define EXPERT_REPORT_CANDIDATES
Definition shell.c:12743
#define FSDIR_COLUMN_PATH
Definition shell.c:8061
#define MODE_EQP
Definition shell.c:21829
static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr)
Definition shell.c:14405
#define SHFLG_Backslash
Definition shell.c:21797
static void intckSaveKey(sqlite3_intck *p)
Definition shell.c:15337
static int apndDelete(sqlite3_vfs *, const char *zName, int syncDir)
Definition shell.c:10102
#define COMPLETION_COLUMN_PHASE
#define SHELL_OPEN_APPENDVFS
Definition shell.c:21766
static void apndDlError(sqlite3_vfs *, int nByte, char *zErrMsg)
Definition shell.c:10128
#define RE_EOF
Definition shell.c:7123
#define COMPLETION_DATABASES
Definition shell.c:9104
#define a32
static sqlite3_mem_methods memtraceBase
Definition shell.c:2067
static int idxProcessOneTrigger(sqlite3expert *p, IdxWrite *pWrite, char **pzErr)
Definition shell.c:14050
static void idxHashClear(IdxHash *pHash)
Definition shell.c:12953
static int intckGetToken(const char *z)
Definition shell.c:15483
static int idxAuthCallback(void *pCtx, int eOp, const char *z3, const char *z4, const char *zDb, const char *zTrigger)
Definition shell.c:14012
static sqlite3_vfs apnd_vfs
Definition shell.c:9705
#define UNUSED_PARAMETER(x)
Definition shell.c:808
#define QSS_SEMITERM(qss)
Definition shell.c:32458
#define MODE_Insert
Definition shell.c:21822
static int progressSequence(SequenceSpec *pss)
Definition shell.c:6403
static int strlen30(const char *z)
Definition shell.c:1263
static char quoteChar(const char *zName)
Definition shell.c:1530
#define FSDIR_COLUMN_DIR
Definition shell.c:8062
static int fileStat(const char *zPath, STRUCT_STAT *pStatBuf)
Definition shell.c:8254
#define a04
static SQLITE_EXTENSION_INIT1 void ieee754func(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:5953
#define STMTRAND_KEY
Definition shell.c:16147
#define BOX_234
Definition shell.c:24133
static Decimal * decimalNewFromText(const char *zIn, int n)
Definition shell.c:3762
static char * local_getline(char *zLine, FILE *in)
Definition shell.c:1324
#define rol(x, k)
Definition shell.c:3231
static int apndSync(sqlite3_file *, int flags)
Definition shell.c:9838
#define SHFLG_PreserveRowid
Definition shell.c:21798
static int percentSameValue(double a, double b)
Definition shell.c:4756
#define re_compile
Definition shell.c:7119
#define FSDIR_SCHEMA
Definition shell.c:8056
sqlite3expert * sqlite3_expert_new(sqlite3 *db, char **pzErr)
Definition shell.c:14741
static int fsdirFilter(sqlite3_vtab_cursor *cur, int idxNum, const char *idxStr, int argc, sqlite3_value **argv)
Definition shell.c:8822
#define APND_START_ROUNDUP(fsz)
Definition shell.c:9608
static int vfstraceOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int *)
Definition shell.c:17085
#define SHELL_TRACE_PLAIN
Definition shell.c:21774
#define SQLITE_OS_WINRT
Definition shell.c:57
#define SEP_Tab
Definition shell.c:21869
static int apndFileControl(sqlite3_file *, int op, void *pArg)
Definition shell.c:9880
static void sha3QueryFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:3041
static int vfstraceSectorSize(sqlite3_file *)
Definition shell.c:16956
static int fsdirBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo)
Definition shell.c:8878
#define SHELL_PROGRESS_QUIET
Definition shell.c:21779
#define ArraySize(X)
Definition shell.c:813
#define a22
static char * toBase64(u8 *pIn, int nbIn, char *pOut)
Definition shell.c:5207
static char * shellFakeSchema(sqlite3 *db, const char *zSchema, const char *zName)
Definition shell.c:1544
static int re_resize(ReCompiled *p, int N)
Definition shell.c:7424
static int idxPopulateStat1(sqlite3expert *p, char **pzErr)
Definition shell.c:14556
int sqlite3_expert_config(sqlite3expert *p, int op,...)
Definition shell.c:14822
struct sqlite3_vfs ApndVfs
Definition shell.c:9613
static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv)
Definition shell.c:4816
static int apndShmUnmap(sqlite3_file *, int deleteFlag)
Definition shell.c:9933
const char * sqlite3_intck_message(sqlite3_intck *pCk)
Definition shell.c:16056
static int vfstraceUnfetch(sqlite3_file *pFile, i64 iOff, void *ptr)
Definition shell.c:17069
#define HAS_TIMER
Definition shell.c:718
static void decimal_clear(Decimal *p)
Definition shell.c:3744
static int seriesNext(sqlite3_vtab_cursor *cur)
Definition shell.c:6511
static int idxPrepareStmt(sqlite3 *db, sqlite3_stmt **ppStmt, char **pzErrmsg, const char *zSql)
Definition shell.c:13079
#define LARGEST_INT64
Definition shell.c:6539
#define RE_START
Definition shell.c:7124
static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid)
Definition shell.c:8801
static void decimal_free(Decimal *p)
Definition shell.c:3751
static int apndShmLock(sqlite3_file *, int offset, int n, int flags)
Definition shell.c:9921
#define QSS_PLAINWHITE(qss)
Definition shell.c:32456
#define VTR_DLOPEN
Definition shell.c:16392
#define VTR_ACCESS
Definition shell.c:16390
#define MODE_Count
Definition shell.c:21834
#define AUTOEQP_full
Definition shell.c:21760
static int apndRandomness(sqlite3_vfs *, int nByte, char *zOut)
Definition shell.c:10137
static void percentSort(double *a, unsigned int n)
Definition shell.c:4923
static int fsdirColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i)
Definition shell.c:8736
#define RE_OP_ANY
Definition shell.c:7130
sqlite3_uint64 u64
Definition shell.c:123
int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr)
Definition shell.c:14895
static void sha3Func(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:2908
#define APND_ROUNDUP
Definition shell.c:9605
static int seriesConnect(sqlite3 *db, void *pUnused, int argcUnused, const char *const *argvUnused, sqlite3_vtab **ppVtab, char **pzErrUnused)
Definition shell.c:6446
#define IsAlpha(X)
Definition shell.c:240
#define SHELL_ESC_SYMBOL
Definition shell.c:21787
#define MODE_ScanExp
Definition shell.c:21836
#define VTR_TRUNC
Definition shell.c:16375
static int stdin_is_interactive
Definition shell.c:825
static void readfileFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:8152
#define MODE_Box
Definition shell.c:21833
#define SHELL_OPEN_HEXDB
Definition shell.c:21770
#define SHELL_ESC_OFF
Definition shell.c:21788
static void re_copy(ReCompiled *p, int iStart, int N)
Definition shell.c:7462
#define ColModeOpts_default_qbox
Definition shell.c:21662
static void re_sql_func(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:7799
static void sha1Func(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:3429
static void vfstraceOnOff(vfstrace_info *pInfo, unsigned int mMask)
Definition shell.c:16574
#define VTR_CURTIME
Definition shell.c:16398
#define SHFLG_Lookaside
Definition shell.c:21796
static void shell_strcpy(char *dest, const char *src)
Definition shell.c:878
const char * sqlite3_expert_report(sqlite3expert *, int iStmt, int eReport)
Definition shell.c:14949
static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast)
Definition shell.c:13900
#define WS
Definition shell.c:5163
#define MODE_Json
Definition shell.c:21830
int sqlite3_regexp_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:7905
#define SHELL_STRINGIFY_(f)
Definition shell.c:46
#define SHELL_ESC_ASCII
Definition shell.c:21786
static Decimal * decimalPow2(int N)
Definition shell.c:4261
#define STRUCT_STAT
Definition shell.c:8030
static const char apvfsSqliteHdr[]
Definition shell.c:9989
static sqlite3_module completionModule
Definition shell.c:9472
static int apndUnfetch(sqlite3_file *, sqlite3_int64 iOfst, void *p)
Definition shell.c:9954
static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid)
Definition shell.c:9355
#define SERIES_COLUMN_STEP
#define MODE_Off
Definition shell.c:21835
static void pcachetraceShutdown(void *pArg)
Definition shell.c:2193
#define VTR_FSIZE
Definition shell.c:16377
int sqlite3_intck_error(sqlite3_intck *pCk, const char **pzErr)
Definition shell.c:16070
int sqlite3_appendvfs_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:10177
#define PC
Definition shell.c:5162
#define a02
static sqlite3_stmt * intckPrepareFmt(sqlite3_intck *p, const char *zFmt,...)
Definition shell.c:15264
static char * expertDequote(const char *zIn)
Definition shell.c:13135
static int completionColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i)
Definition shell.c:9324
static int re_hex(int c, int *pV)
Definition shell.c:7473
static int memtraceInit(void *p)
Definition shell.c:2103
int vfstrace_register(const char *zTraceName, const char *zOldVfsName, int(*xOut)(const char *, void *), void *pOutArg, int makeDefault)
Definition shell.c:17347
#define EXPERT_REPORT_SQL
Definition shell.c:12740
static int apndSleep(sqlite3_vfs *, int microseconds)
Definition shell.c:10140
static const char * re_subcompile_string(ReCompiled *)
Definition shell.c:7561
static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile)
Definition shell.c:9994
static const char * vfstraceNextSystemCall(sqlite3_vfs *, const char *zName)
Definition shell.c:17332
static int re_space_char(int c)
Definition shell.c:7267
#define RE_OP_BOUNDARY
Definition shell.c:7145
#define SERIES_COLUMN_START
#define a34
static void sha3_step_vformat(SHA3Context *p, const char *zFormat,...)
Definition shell.c:2940
#define IsAlnum(X)
Definition shell.c:239
#define COMPLETION_COLUMNS
Definition shell.c:9106
static int expertNext(sqlite3_vtab_cursor *cur)
Definition shell.c:13325
#define ND
Definition shell.c:5164
#define ALWAYS(X)
Definition shell.c:12781
static void pcachetraceDestroy(sqlite3_pcache *p)
Definition shell.c:2274
#define OPEN_DB_KEEPALIVE
Definition shell.c:25968
static void utf8_width_print(FILE *out, int w, const char *zUtf)
Definition shell.c:1195
#define a40
static sqlite3_int64 integerValue(const char *zArg)
Definition shell.c:1414
static const char * lockName(int eLock)
Definition shell.c:16694
#define VTR_SHMLOCK
Definition shell.c:16384
static char continuePrompt[PROMPT_LEN_MAX]
Definition shell.c:860
#define IDX_HASH_SIZE
Definition shell.c:12891
static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor)
Definition shell.c:6489
static int writeFile(sqlite3_context *pCtx, const char *zFile, sqlite3_value *pData, mode_t mode, sqlite3_int64 mtime)
Definition shell.c:8340
static void vfstraceShmBarrier(sqlite3_file *)
Definition shell.c:17040
static void SHA3Update(SHA3Context *p, const unsigned char *aData, unsigned int nData)
Definition shell.c:2839
static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize)
Definition shell.c:2212
static int makeDirectory(const char *zFile)
Definition shell.c:8300
#define MODE_Www
Definition shell.c:21837
#define SQLITE_SERIES_CONSTRAINT_VERIFY
Definition shell.c:6567
#define SEP_Record
Definition shell.c:21874
static void lsModeFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:8513
static int re_insert(ReCompiled *p, int iBefore, int op, int arg)
Definition shell.c:7440
static SQLITE_EXTENSION_INIT1 sqlite3_int64 genSeqMember(sqlite3_int64 smBase, sqlite3_int64 smStep, sqlite3_uint64 ix)
Definition shell.c:6304
static void percentError(sqlite3_context *pCtx, const char *zFormat,...)
Definition shell.c:4797
static void intckFinalize(sqlite3_intck *p, sqlite3_stmt *pStmt)
Definition shell.c:15284
int sqlite3_uint_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:3684
#define VTR_DEVCHAR
Definition shell.c:16383
#define CONTINUE_PROMPT_PSTATE
Definition shell.c:908
static int apndWriteMark(ApndFile *paf, sqlite3_file *pFile, sqlite_int64 iWriteEnd)
Definition shell.c:9779
#define U8_TYPEDEF
Definition shell.c:5169
#define SHFLG_DumpNoSys
Definition shell.c:21804
static const PercentileFunc aPercentFunc[]
Definition shell.c:4736
#define VTR_UNLOCK
Definition shell.c:16379
static int seriesColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i)
Definition shell.c:6521
#define AUTOEQP_trigger
Definition shell.c:21759
static void decimalPow2Func(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4525
#define SHELL_OPEN_UNSPEC
Definition shell.c:21764
static void * memtraceMalloc(int n)
Definition shell.c:2071
#define SHELL_OPEN_DESERIALIZE
Definition shell.c:21769
#define GETPID
Definition shell.c:137
#define RE_OP_WORD
Definition shell.c:7139
#define ShellClearFlag(P, X)
Definition shell.c:21812
static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor)
Definition shell.c:8613
#define R2(v, w, x, y, z, i)
Definition shell.c:3252
static int idxGetTableInfo(sqlite3 *db, const char *zTab, IdxTable **ppOut, char **pzErrmsg)
Definition shell.c:13448
static int expertClose(sqlite3_vtab_cursor *cur)
Definition shell.c:13304
int sqlite3_fileio_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:8983
static int apndSetSystemCall(sqlite3_vfs *, const char *, sqlite3_syscall_ptr)
Definition shell.c:10152
#define SCAN_TRACKER_REFTYPE
Definition shell.c:910
static unsigned char * SHA3Final(SHA3Context *p)
Definition shell.c:2879
int sqlite3MemTraceDeactivate(void)
Definition shell.c:2136
#define SHELL_TRACE_EXPANDED
Definition shell.c:21775
#define SMALLEST_INT64
Definition shell.c:6541
#define PROMPT_LEN_MAX
Definition shell.c:856
#define RE_OP_CC_RANGE
Definition shell.c:7138
const char * sqlite3_intck_test_sql(sqlite3_intck *pCk, const char *zObj)
Definition shell.c:16093
static sqlite3_module seriesModule
Definition shell.c:6997
#define a12
#define MODE_List
Definition shell.c:21819
unsigned short ReStateNumber
Definition shell.c:7175
static int apndLock(sqlite3_file *, int)
Definition shell.c:9856
static int vfstraceFileControl(sqlite3_file *, int op, void *pArg)
Definition shell.c:16754
#define RE_OP_MATCH
Definition shell.c:7129
static void percentFinal(sqlite3_context *pCtx)
Definition shell.c:5055
#define a13
int sqlite3_shathree_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:3148
static int isVt100(const unsigned char *z)
Definition shell.c:1175
#define shell_stifle_history(X)
Definition shell.c:180
static void re_add_state(ReStateSet *pSet, int newState)
Definition shell.c:7213
#define RE_OP_GOTO
Definition shell.c:7133
#define B85_DARK_MAX
Definition shell.c:5534
static IdxHashEntry * idxHashFind(IdxHash *pHash, const char *zKey, int nKey)
Definition shell.c:13022
static int vfstraceCurrentTime(sqlite3_vfs *, double *)
Definition shell.c:17276
#define BOX_34
Definition shell.c:24128
static void idxConstraintFree(IdxConstraint *pConstraint)
Definition shell.c:13870
#define OPEN_DB_ZIPFILE
Definition shell.c:25969
static void intckExec(sqlite3_intck *p, const char *zSql)
Definition shell.c:15305
static char * shell_strncpy(char *dest, const char *src, size_t n)
Definition shell.c:867
static void hash_step(SHA1Context *p, const unsigned char *data, unsigned int len)
Definition shell.c:3340
#define a01
static void sha1QueryFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:3468
static int apndRead(sqlite3_file *, void *, int iAmt, sqlite3_int64 iOfst)
Definition shell.c:9763
#define a41
#define ColModeOpts_default
Definition shell.c:21661
#define APND_MAX_SIZE
Definition shell.c:9599
static void decimalMul(Decimal *pA, Decimal *pB)
Definition shell.c:4213
#define a42
#define B85_DNOS(c)
Definition shell.c:5520
#define BOX_23
Definition shell.c:24127
void sqlite3_intck_close(sqlite3_intck *pCk)
Definition shell.c:15980
static sqlite3_pcache_methods2 pcacheBase
Definition shell.c:2178
#define COMPLETION_COLUMN_CANDIDATE
#define VTR_READ
Definition shell.c:16373
static const char * apndNextSystemCall(sqlite3_vfs *, const char *zName)
Definition shell.c:10165
static int completionDisconnect(sqlite3_vtab *pVtab)
Definition shell.c:9165
#define SHFLG_Newlines
Definition shell.c:21799
static void percentCompute(sqlite3_context *pCtx, int bIsFinal)
Definition shell.c:5021
static int expertFilter(sqlite3_vtab_cursor *cur, int idxNum, const char *idxStr, int argc, sqlite3_value **argv)
Definition shell.c:13366
#define ShellHasFlag(P, X)
Definition shell.c:21810
int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst)
Definition shell.c:14694
int sqlite3_percentile_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:5065
static int apndWrite(sqlite3_file *, const void *, int iAmt, sqlite3_int64 iOfst)
Definition shell.c:9805
#define a
static void * apndDlOpen(sqlite3_vfs *, const char *zFilename)
Definition shell.c:10125
static void decimalSumStep(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4437
#define BX_NUMERAL(dv)
Definition shell.c:5200
#define SHELL_OPEN_READONLY
Definition shell.c:21768
#define re_free
Definition shell.c:7120
static int strlenChar(const char *z)
Definition shell.c:1273
void sqlite3_expert_destroy(sqlite3expert *)
Definition shell.c:14975
#define SHFLG_Echo
Definition shell.c:21801
#define VTR_CRL
Definition shell.c:16380
static int apndClose(sqlite3_file *)
Definition shell.c:9755
static int decimal_cmp(const Decimal *pA, const Decimal *pB)
Definition shell.c:4055
#define COMPLETION_KEYWORDS
Definition shell.c:9098
static int cli_strcmp(const char *a, const char *b)
Definition shell.c:640
static char * toBase85(u8 *pIn, int nbIn, char *pOut, char *pSep)
Definition shell.c:5564
#define VTR_SYNC
Definition shell.c:16376
static int cli_strncmp(const char *a, const char *b, size_t n)
Definition shell.c:645
#define CTIMEOPT_VAL(opt)
#define COMPLETION_TABLES
Definition shell.c:9105
static void * vfstraceDlOpen(sqlite3_vfs *, const char *zFilename)
Definition shell.c:17206
static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p)
Definition shell.c:13806
static void idxSampleFunc(sqlite3_context *pCtx, int argc, sqlite3_value **argv)
Definition shell.c:14288
int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5)
Definition shell.c:14660
#define CTIMEOPT_VAL_(opt)
static void trackParenLevel(struct DynaPrompt *p, int ni)
Definition shell.c:920
static void shellDtostr(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal)
Definition shell.c:1613
static void appendText(ShellText *p, const char *zAppend, char quote)
Definition shell.c:1486
int sqlite3PcacheTraceDeactivate(void)
Definition shell.c:2318
#define FSDIR_COLUMN_MTIME
Definition shell.c:8059
static int re_digit_char(int c)
Definition shell.c:7262
#define shell_write_history(X)
Definition shell.c:179
static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile)
Definition shell.c:9969
static int expertConnect(sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlite3_vtab **ppVtab, char **pzErr)
Definition shell.c:13167
static void shell_check_oom(const void *p)
Definition shell.c:977
static int completionConnect(sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlite3_vtab **ppVtab, char **pzErr)
Definition shell.c:9123
#define MODE_Table
Definition shell.c:21832
static u8 * fromBase64(char *pIn, int ncIn, u8 *pOut)
Definition shell.c:5251
static char * putcs(char *pc, char *s)
Definition shell.c:5554
#define STAT_CHR_SRC(mode)
static void hash_finish(SHA1Context *p, char *zOut, int bAsBinary)
Definition shell.c:3385
sqlite3_int64 i64
Definition shell.c:122
static unsigned char rePeek(ReCompiled *p)
Definition shell.c:7531
#define VTR_SHMBAR
Definition shell.c:16386
#define RE_OP_CC_INC
Definition shell.c:7135
static int completionEof(sqlite3_vtab_cursor *cur)
Definition shell.c:9365
#define a11
static void ieee754func_to_blob(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:6088
static sqlite3_pcache_page * pcachetraceFetch(sqlite3_pcache *p, unsigned key, int crFg)
Definition shell.c:2229
#define FSDIR_COLUMN_DATA
Definition shell.c:8060
static void decimal_result(sqlite3_context *pCtx, Decimal *p)
Definition shell.c:3933
static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor)
Definition shell.c:13292
static int fsdirConnect(sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlite3_vtab **ppVtab, char **pzErr)
Definition shell.c:8578
#define VTR_WRITE
Definition shell.c:16374
static void decimalAddFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4402
#define a30
unsigned short int u16
Definition shell.c:38
#define a10
#define AUTOCOLUMN_SEP
Definition shell.c:28549
#define RE_OP_NOTSPACE
Definition shell.c:7144
static int seriesBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pIdxInfo)
Definition shell.c:6821
#define COMPLETION_COLUMN_WHOLELINE
#define MODE_Column
Definition shell.c:21818
#define blk0le(i)
Definition shell.c:3234
static int vfstraceAccess(sqlite3_vfs *, const char *zName, int flags, int *)
Definition shell.c:17162
static char * intckMprintf(sqlite3_intck *p, const char *zFmt,...)
Definition shell.c:15316
static int seriesEof(sqlite3_vtab_cursor *cur)
Definition shell.c:6557
#define ROL64(a, x)
static void decimalSumFinalize(sqlite3_context *context)
Definition shell.c:4484
static void KeccakF1600Step(SHA3Context *p)
Definition shell.c:2487
static void ieee754func_from_blob(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:6068
static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid)
Definition shell.c:6547
#define Rl0(v, w, x, y, z, i)
Definition shell.c:3246
static const char * intckParseCreateIndex(const char *z, int iCol, int *pnByte)
Definition shell.c:15529
static sqlite3_stmt * intckPrepare(sqlite3_intck *p, const char *zSql)
Definition shell.c:15242
#define APND_MARK_FOS_SZ
Definition shell.c:9592
static int intckIsSpace(char c)
Definition shell.c:15510
static void idxTableFree(IdxTable *pTab)
Definition shell.c:13914
static char * intckCheckObjectSql(sqlite3_intck *p, const char *zObj, const char *zPrev, int *pnKeyVal)
Definition shell.c:15673
#define APND_MARK_PREFIX_SZ
Definition shell.c:9591
#define SERIES_COLUMN_ROWID
#define AUTOEQP_on
Definition shell.c:21758
static int expertDisconnect(sqlite3_vtab *pVtab)
Definition shell.c:13203
#define FSDIR_COLUMN_MODE
Definition shell.c:8058
static void(*)(void) apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym)
Definition shell.c:9694
static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor)
Definition shell.c:9173
static int percentBinarySearch(Percentile *p, double y, int bExact)
Definition shell.c:4772
#define BOX_13
Definition shell.c:24126
static volatile int seenInterrupt
Definition shell.c:844
#define MODE_Csv
Definition shell.c:21825
int sqlite3MemTraceActivate(FILE *out)
Definition shell.c:2123
#define IS_B85(c)
Definition shell.c:5523
static const u8 b64DigitValues[128]
Definition shell.c:5173
unsigned char w
Definition shell.c:1011
static int decimalCollFunc(void *notUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2)
Definition shell.c:4374
static int idxIdentifierRequiresQuotes(const char *zId)
Definition shell.c:13577
#define APND_MARK_SIZE
Definition shell.c:9593
#define c
static IdxConstraint * idxNewConstraint(int *pRc, const char *zColl)
Definition shell.c:13052
#define a31
static int vfstraceShmLock(sqlite3_file *, int, int, int)
Definition shell.c:16985
static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg)
Definition shell.c:14211
static const char b64Numerals[64+1]
Definition shell.c:5193
static void idxScanFree(IdxScan *pScan, IdxScan *pLast)
Definition shell.c:13884
#define SEP_Unit
Definition shell.c:21873
static int vfstraceCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64 *)
Definition shell.c:17286
static void SHA3Init(SHA3Context *p, int iSize)
Definition shell.c:2809
#define a21
#define b
static void pcachetraceRekey(sqlite3_pcache *p, sqlite3_pcache_page *pPg, unsigned oldKey, unsigned newKey)
Definition shell.c:2256
static void fsdirResetCursor(fsdir_cursor *pCur)
Definition shell.c:8628
static int apndGetLastError(sqlite3_vfs *, int, char *)
Definition shell.c:10146
static int vfstraceLock(sqlite3_file *, int)
Definition shell.c:16708
static void hash_init(SHA1Context *p)
Definition shell.c:3329
static int vfstraceCheckReservedLock(sqlite3_file *, int *)
Definition shell.c:16738
static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n)
Definition shell.c:2268
static int idxBuildSampleTable(sqlite3expert *p, const char *zTab)
Definition shell.c:14532
#define RE_OP_CC_EXC
Definition shell.c:7136
#define VTR_FCTRL
Definition shell.c:16381
#define sqlite3_base_init
Definition shell.c:5092
static void strappend(char *z, int *pI, const char *zAppend)
Definition shell.c:16564
#define CONTINUATION_PROMPT
Definition shell.c:899
#define IS_BX_DIGIT(bdp)
Definition shell.c:5197
#define B85_CLASS(c)
Definition shell.c:5516
#define SHFLG_CountChanges
Definition shell.c:21800
#define SERIES_COLUMN_STOP
int sqlite3_decimal_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:4541
#define a43
static int pcachetracePagecount(sqlite3_pcache *p)
Definition shell.c:2218
#define a00
#define a03
static int vfstraceRead(sqlite3_file *, void *, int iAmt, sqlite3_int64 iOfst)
Definition shell.c:16599
#define blk(i)
Definition shell.c:3237
static void decimalSubFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4415
static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i)
Definition shell.c:13353
static int intckIsIndex(sqlite3_intck *p, const char *zObj)
Definition shell.c:15649
static int seriesFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStrUnused, int argc, sqlite3_value **argv)
Definition shell.c:6597
int sqlite3_completion_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:9513
static int memtraceSize(void *p)
Definition shell.c:2097
#define CONTINUE_PROMPT_AWAITS(p, s)
Definition shell.c:902
static const char * fileTail(const char *z)
Definition shell.c:16448
static int apndTruncate(sqlite3_file *, sqlite3_int64 size)
Definition shell.c:9826
#define a44
static int vfstraceClose(sqlite3_file *)
Definition shell.c:16581
#define SHELL_USE_LOCAL_GETLINE
Definition shell.c:182
static void percentValue(sqlite3_context *pCtx)
Definition shell.c:5058
#define R3(v, w, x, y, z, i)
Definition shell.c:3254
#define COMPLETION_FIRST_PHASE
Definition shell.c:9097
int sqlite3_intck_unlock(sqlite3_intck *pCk)
Definition shell.c:16079
static int apndCurrentTime(sqlite3_vfs *, double *)
Definition shell.c:10143
static u8 * fromBase85(char *pIn, int ncIn, u8 *pOut)
Definition shell.c:5605
#define _SQLITE3_STDIO_H_
Definition shell.c:285
static char * skipNonB85(char *s, int nc)
Definition shell.c:5537
static char * dynamicContinuePrompt(void)
Definition shell.c:938
#define PAD_CHAR
Definition shell.c:5165
#define VTR_SHMMAP
Definition shell.c:16385
#define EXPERT_CONFIG_SAMPLE
Definition shell.c:12644
#define VTR_LASTERR
Definition shell.c:16399
#define RE_OP_ACCEPT
Definition shell.c:7134
static int vfstraceWrite(sqlite3_file *, const void *, int iAmt, sqlite3_int64)
Definition shell.c:16619
static u8 b85_cOffset[]
Definition shell.c:5519
static int idxCreateCandidates(sqlite3expert *p)
Definition shell.c:13853
static int enableTimer
Definition shell.c:637
static int fsdirClose(sqlite3_vtab_cursor *cur)
Definition shell.c:8649
#define EXPERT_REPORT_INDEXES
Definition shell.c:12741
#define MODE_Tcl
Definition shell.c:21824
#define SHFLG_HeaderSet
Definition shell.c:21802
static int idxRegisterVtab(sqlite3expert *p)
Definition shell.c:13394
#define SQLITE_EXTENSION_INIT2(X)
Definition shell.c:1707
#define blk0be(i)
Definition shell.c:3236
#define CONTINUE_PROMPT_AWAITC(p, c)
Definition shell.c:904
#define RE_OP_NOTWORD
Definition shell.c:7140
#define SEP_Space
Definition shell.c:21870
#define SHFLG_TestingMode
Definition shell.c:21805
static void decimalFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4354
static void base64(sqlite3_context *context, int na, sqlite3_value *av[])
Definition shell.c:5302
#define COMPLETION_EOF
Definition shell.c:9108
static void shellAddSchemaName(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal)
Definition shell.c:1646
#define MODE_Markdown
Definition shell.c:21831
static int seriesDisconnect(sqlite3_vtab *pVtab)
Definition shell.c:6481
static int countNonzeros(void *pCount, int nc, char *azResults[], char *azColumns[])
Definition shell.c:13709
static int apndCheckReservedLock(sqlite3_file *, int *pResOut)
Definition shell.c:9872
#define MODE_Pretty
Definition shell.c:21828
#define Rb0(v, w, x, y, z, i)
Definition shell.c:3248
static int idxHashAdd(int *pRc, IdxHash *pHash, const char *zKey, const char *zVal)
Definition shell.c:12985
static void decimalCmpFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4085
#define BOX_134
Definition shell.c:24132
static int idxPopulateOneStat1(sqlite3expert *p, sqlite3_stmt *pIndexXInfo, sqlite3_stmt *pWriteStat, const char *zTab, const char *zIdx, char **pzErr)
Definition shell.c:14425
#define VTR_DLERR
Definition shell.c:16393
static void idxDatabaseError(sqlite3 *db, char **pzErrmsg)
Definition shell.c:13069
static int hexDigitValue(char c)
Definition shell.c:1404
static sqlite3_pcache * pcachetraceCreate(int szPage, int szExtra, int bPurge)
Definition shell.c:2199
#define BOX_1234
Definition shell.c:24135
static int isNumber(const char *z, int *realnum)
Definition shell.c:1235
static void completionCursorReset(completion_cursor *pCur)
Definition shell.c:9186
#define RE_OP_ANYSTAR
Definition shell.c:7131
#define OMIT_BASE85_CHECKER
Definition shell.c:5393
static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile)
Definition shell.c:10019
static int memtraceRoundup(int n)
Definition shell.c:2100
static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo)
Definition shell.c:13209
#define SHELL_PROGRESS_RESET
Definition shell.c:21780
static void vfstraceDlClose(sqlite3_vfs *, void *)
Definition shell.c:17241
static int completionBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo)
Definition shell.c:9427
static void pcachetraceShrink(sqlite3_pcache *p)
Definition shell.c:2280
static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs *, const char *z)
Definition shell.c:10159
static void apndDlClose(sqlite3_vfs *, void *)
Definition shell.c:10134
static int idxCreateFromCons(sqlite3expert *p, IdxScan *pScan, IdxConstraint *pEq, IdxConstraint *pTail)
Definition shell.c:13718
#define a33
#define SWAP_DOUBLE(X, Y)
Definition shell.c:4909
static void idxRemFunc(sqlite3_context *pCtx, int argc, sqlite3_value **argv)
Definition shell.c:14329
static void shellStrtod(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal)
Definition shell.c:1595
static char * Argv0
Definition shell.c:850
static void idxWriteFree(IdxWrite *pTab)
Definition shell.c:13926
static void shell_out_of_memory(void)
Definition shell.c:969
#define SEP_CrLf
Definition shell.c:21872
static void intckSaveErrmsg(sqlite3_intck *p)
Definition shell.c:15228
static int idxFindCompatible(int *pRc, sqlite3 *dbm, IdxScan *pScan, IdxConstraint *pEq, IdxConstraint *pTail)
Definition shell.c:13637
static int expertUpdate(sqlite3_vtab *pVtab, int nData, sqlite3_value **azData, sqlite_int64 *pRowid)
Definition shell.c:13276
static void setLexemeOpen(struct DynaPrompt *p, char *s, char c)
Definition shell.c:927
#define BOX_123
Definition shell.c:24131
static int fsdirNext(sqlite3_vtab_cursor *cur)
Definition shell.c:8672
#define BOX_14
Definition shell.c:24130
static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt,...)
Definition shell.c:8168
#define FSDIR_COLUMN_NAME
Definition shell.c:8057
#define VTR_DELETE
Definition shell.c:16389
static const char * re_subcompile_re(ReCompiled *p)
Definition shell.c:7539
struct DynaPrompt * t_DynaPromptRef
Definition shell.c:909
#define SHELL_OPEN_NORMAL
Definition shell.c:21765
static int vfstraceUnlock(sqlite3_file *, int)
Definition shell.c:16723
void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3)
Definition shell.c:14680
static void initText(ShellText *p)
Definition shell.c:1470
static sqlite3 * globalDb
Definition shell.c:839
static void decimalMulFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
Definition shell.c:4496
static char * idxAppendColDefn(int *pRc, char *zIn, IdxTable *pTab, IdxConstraint *pCons)
Definition shell.c:13599
static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid)
Definition shell.c:13344
static void decimal_add(Decimal *pA, Decimal *pB)
Definition shell.c:4140
int sqlite3_sha_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi)
Definition shell.c:3574
static int apndUnlock(sqlite3_file *, int)
Definition shell.c:9864
static void(*)(void) vfstraceDlSym(sqlite3_vfs *, void *, const char *zSymbol)
Definition shell.c:16431
#define CONTINUE_PROMPT_RESET
Definition shell.c:900
static int idxPrintfPrepareStmt(sqlite3 *db, sqlite3_stmt **ppStmt, char **pzErrmsg, const char *zFmt,...)
Definition shell.c:13096
#define SERIES_COLUMN_VALUE
#define SHELL_OPEN_ZIPFILE
Definition shell.c:21767
#define ORIGFILE(p)
Definition shell.c:9620
#define SEP_Column
Definition shell.c:21867
#define VTR_RAND
Definition shell.c:16396
static char mainPrompt[PROMPT_LEN_MAX]
Definition shell.c:858
static int fsdirEof(sqlite3_vtab_cursor *cur)
Definition shell.c:8811
static unsigned re_next_char_nocase(ReInput *p)
Definition shell.c:7249
#define VTR_SHMUNMAP
Definition shell.c:16387
static void percentInverse(sqlite3_context *pCtx, int argc, sqlite3_value **argv)
Definition shell.c:4974
#define QSS_SETV(qss, newst)
Definition shell.c:32454
#define SHELL_PROGRESS_ONCE
Definition shell.c:21781
#define session_close_all(X, Y)
Definition shell.c:25760
static const sqlite3_io_methods apnd_io_methods
Definition shell.c:9730
#define BEGIN_TIMER
Definition shell.c:716
static int idxProcessTriggers(sqlite3expert *p, char **pzErr)
Definition shell.c:14133
int sqlite3_intck_step(sqlite3_intck *pCk)
Definition shell.c:15998
void vfstrace_unregister(const char *zTraceName)
Definition shell.c:17414
static FILE * pcachetraceOut
Definition shell.c:2179
#define eputz(z)
Definition shell.c:633
static int apndFetch(sqlite3_file *, sqlite3_int64 iOfst, int iAmt, void **pp)
Definition shell.c:9939
unsigned char u8
Definition shell.c:124
static int vfstraceShmMap(sqlite3_file *, int, int, int, void volatile **)
Definition shell.c:17023
#define VTR_FULLPATH
Definition shell.c:16391
#define MODE_Semi
Definition shell.c:21820
#define MODE_Ascii
Definition shell.c:21827
int sqlite3_expert_sql(sqlite3expert *p, const char *zSql, char **pzErr)
Definition shell.c:14846
#define VTR_LOCK
Definition shell.c:16378
static int expertSchemaSql(sqlite3 *db, const char *zSql, char **pzErr)
Definition shell.c:14193
static char * idxAppendText(int *pRc, char *zIn, const char *zFmt,...)
Definition shell.c:13545
static int fsdirDisconnect(sqlite3_vtab *pVtab)
Definition shell.c:8605
static void memtraceShutdown(void *p)
Definition shell.c:2106
static int vfstraceSleep(sqlite3_vfs *, int microseconds)
Definition shell.c:17265
static int apndFileSize(sqlite3_file *, sqlite3_int64 *pSize)
Definition shell.c:9847
static int intckGetAutoIndex(sqlite3_intck *p)
Definition shell.c:15635
static void sha3UpdateFromValue(SHA3Context *p, sqlite3_value *pVal)
Definition shell.c:2958
static int vfstraceGetLastError(sqlite3_vfs *, int, char *)
Definition shell.c:17300
#define shell_read_history(X)
Definition shell.c:178
static char * one_input_line(FILE *in, char *zPrior, int isContinuation)
Definition shell.c:1368
static int vfstraceRandomness(sqlite3_vfs *, int nByte, char *zOut)
Definition shell.c:17253
#define R4(v, w, x, y, z, i)
Definition shell.c:3256
static SQLITE_EXTENSION_INIT1 int uintCollFunc(void *notUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2)
Definition shell.c:3640
#define RE_OP_NOTDIGIT
Definition shell.c:7142
static int vfstraceTruncate(sqlite3_file *, sqlite3_int64 size)
Definition shell.c:16639
#define IsDigit(X)
Definition shell.c:237
static char * skipNonB64(char *s, int nc)
Definition shell.c:5244
static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p)
Definition shell.c:3988
static sqlite3_int64 timeOfDay(void)
Definition shell.c:652
#define base85Numeral(dn)
Definition shell.c:5550
static void idxFinalize(int *pRc, sqlite3_stmt *pStmt)
Definition shell.c:13433
static int vfstraceSync(sqlite3_file *, int flags)
Definition shell.c:16654
#define APND_MARK_PREFIX
Definition shell.c:9590
#define ror(x, k)
Definition shell.c:3232
static void hash_step_vformat(SHA1Context *p, const char *zFormat,...)
Definition shell.c:3366
#define a23
#define deliberate_fall_through
Definition shell.c:190
static int vfstraceFetch(sqlite3_file *pFile, i64 iOff, int nAmt, void **pptr)
Definition shell.c:17058
#define SQLITE_EXTENSION_INIT1
Definition shell.c:1706
#define SQLITE_STMTSTATUS_MEMUSED
Definition sqlite3.c:9435
#define SQLITE_LAST_ERRNO
Definition sqlite3.c:1592
#define SQLITE_IOERR_SHMSIZE
Definition sqlite3.c:837
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
Definition sqlite3.c:2972
#define SQLITE_INTERRUPT
Definition sqlite3.c:775
#define SQLITE_FCNTL_DATA_VERSION
Definition sqlite3.c:1578
#define SQLITE_DESERIALIZE_FREEONCLOSE
Definition sqlite3.c:11372
#define SQLITE_FCNTL_SIZE_LIMIT
Definition sqlite3.c:1579
#define SQLITE_OPEN_CREATE
Definition sqlite3.c:916
#define SQLITE_DBSTATUS_CACHE_HIT
Definition sqlite3.c:9327
#define SQLITE_TESTCTRL_ALWAYS
Definition sqlite3.c:8858
#define SQLITE_OK_LOAD_PERMANENTLY
Definition sqlite3.c:891
#define SQLITE_INSERT
Definition sqlite3.c:3788
#define SQLITE_FULL
Definition sqlite3.c:779
#define SQLITE_FLOAT
Definition sqlite3.c:5563
#define SQLITE_IOERR_GETTEMPPATH
Definition sqlite3.c:843
#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
Definition sqlite3.c:9325
#define SQLITE_DBSTATUS_STMT_USED
Definition sqlite3.c:9323
#define SQLITE_INDEX_CONSTRAINT_LT
Definition sqlite3.c:8069
#define SQLITE_CDECL
Definition sqlite3.c:397
#define SQLITE_SCHEMA
Definition sqlite3.c:783
#define SQLITE_LIMIT_ATTACHED
Definition sqlite3.c:4648
#define SQLITE_STMTSTATUS_FILTER_HIT
Definition sqlite3.c:9434
#define SQLITE_DBCONFIG_ENABLE_COMMENTS
Definition sqlite3.c:2989
#define SQLITE_FUNCTION
Definition sqlite3.c:3801
#define SQLITE_DBCONFIG_DEFENSIVE
Definition sqlite3.c:2977
#define SQLITE_TESTCTRL_LOCALTIME_FAULT
Definition sqlite3.c:8866
#define SQLITE_TESTCTRL_IMPOSTER
Definition sqlite3.c:8874
#define SQLITE_SHM_LOCK
Definition sqlite3.c:1894
#define SQLITE_DBCONFIG_DQS_DDL
Definition sqlite3.c:2981
#define SQLITE_READONLY
Definition sqlite3.c:774
#define SQLITE_DETERMINISTIC
Definition sqlite3.c:6144
#define SQLITE_INDEX_CONSTRAINT_LE
Definition sqlite3.c:8068
#define SQLITE_LIMIT_COLUMN
Definition sqlite3.c:4643
#define SQLITE_INDEX_CONSTRAINT_IS
Definition sqlite3.c:8079
#define SQLITE_CONFIG_PCACHE2
Definition sqlite3.c:2525
#define SQLITE_STATUS_PAGECACHE_USED
Definition sqlite3.c:9172
#define SQLITE_BUSY
Definition sqlite3.c:771
#define SQLITE_STATUS_MALLOC_SIZE
Definition sqlite3.c:9176
#define SQLITE_IOERR_WRITE
Definition sqlite3.c:821
#define SQLITE_BLOB
Definition sqlite3.c:5564
#define SQLITE_FCNTL_SIZE_HINT
Definition sqlite3.c:1549
#define SQLITE_DBCONFIG_ENABLE_TRIGGER
Definition sqlite3.c:2970
#define SQLITE_IOERR_CLOSE
Definition sqlite3.c:834
#define SQLITE_FCNTL_EXTERNAL_READER
Definition sqlite3.c:1583
#define SQLITE_SYNC_NORMAL
Definition sqlite3.c:1042
#define SQLITE_NOTFOUND
Definition sqlite3.c:778
#define SQLITE_INDEX_CONSTRAINT_GE
Definition sqlite3.c:8070
#define SQLITE_SOURCE_ID
Definition sqlite3.c:470
#define SQLITE_MISUSE
Definition sqlite3.c:787
#define SQLITE_LIMIT_WORKER_THREADS
Definition sqlite3.c:4652
#define SQLITE_IOERR_CONVPATH
Definition sqlite3.c:844
#define SQLITE_IOERR_SHMOPEN
Definition sqlite3.c:836
#define SQLITE_FCNTL_WIN32_GET_HANDLE
Definition sqlite3.c:1572
#define SQLITE_INDEX_CONSTRAINT_OFFSET
Definition sqlite3.c:8081
#define SQLITE_OPEN_MAIN_DB
Definition sqlite3.c:922
#define SQLITE_OPEN_READWRITE
Definition sqlite3.c:915
#define SQLITE_FCNTL_CKPT_START
Definition sqlite3.c:1582
#define SQLITE_LIMIT_COMPOUND_SELECT
Definition sqlite3.c:4645
#define SQLITE_VTAB_INNOCUOUS
Definition sqlite3.c:10379
#define SQLITE_TESTCTRL_SORTER_MMAP
Definition sqlite3.c:8873
#define SQLITE_STMTSTATUS_SORT
Definition sqlite3.c:9428
#define SQLITE_SET_LOCKPROXYFILE
Definition sqlite3.c:1591
#define SQLITE_IOERR_TRUNCATE
Definition sqlite3.c:824
#define SQLITE_INDEX_SCAN_HEX
Definition sqlite3.c:8025
#define SQLITE_FCNTL_TRACE
Definition sqlite3.c:1562
#define SQLITE_TESTCTRL_PRNG_SAVE
Definition sqlite3.c:8849
#define SQLITE_IOERR
Definition sqlite3.c:776
#define SQLITE_TESTCTRL_FK_NO_ACTION
Definition sqlite3.c:8852
#define SQLITE_CONFIG_PAGECACHE
Definition sqlite3.c:2514
#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
Definition sqlite3.c:9326
#define SQLITE_DIRECTONLY
Definition sqlite3.c:6145
#define SQLITE_CORRUPT
Definition sqlite3.c:777
#define SQLITE_FCNTL_WIN32_SET_HANDLE
Definition sqlite3.c:1566
#define SQLITE_FCNTL_MMAP_SIZE
Definition sqlite3.c:1561
#define SQLITE_STMTSTATUS_AUTOINDEX
Definition sqlite3.c:9429
#define SQLITE_LIMIT_FUNCTION_ARG
Definition sqlite3.c:4647
#define SQLITE_LIMIT_VDBE_OP
Definition sqlite3.c:4646
#define SQLITE_IOERR_SHORT_READ
Definition sqlite3.c:820
#define SQLITE_FCNTL_FILE_POINTER
Definition sqlite3.c:1551
#define SQLITE_CONFIG_GETMALLOC
Definition sqlite3.c:2512
#define SQLITE_IOERR_NOMEM
Definition sqlite3.c:830
#define SQLITE_DBCONFIG_ENABLE_FKEY
Definition sqlite3.c:2969
#define SQLITE_TESTCTRL_PENDING_BYTE
Definition sqlite3.c:8856
#define SQLITE_CONFIG_LOG
Definition sqlite3.c:2523
#define SQLITE_TESTCTRL_PRNG_SEED
Definition sqlite3.c:8877
#define SQLITE_FCNTL_CHUNK_SIZE
Definition sqlite3.c:1550
#define SQLITE_DBSTATUS_CACHE_USED
Definition sqlite3.c:9321
#define SQLITE3_H
Definition sqlite3.c:353
#define SQLITE_CONSTRAINT
Definition sqlite3.c:785
#define SQLITE_SHM_SHARED
Definition sqlite3.c:1895
#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
Definition sqlite3.c:2971
#define SQLITE_CONFIG_MULTITHREAD
Definition sqlite3.c:2509
#define SQLITE_ROW
Definition sqlite3.c:795
#define SQLITE_FCNTL_COMMIT_PHASETWO
Definition sqlite3.c:1565
#define SQLITE_BUSY_TIMEOUT
Definition sqlite3.c:857
#define SQLITE_LIMIT_SQL_LENGTH
Definition sqlite3.c:4642
#define SQLITE_OK
Definition sqlite3.c:765
#define SQLITE_FCNTL_VFSNAME
Definition sqlite3.c:1556
#define SQLITE_NOLFS
Definition sqlite3.c:788
#define SQLITE_LIMIT_EXPR_DEPTH
Definition sqlite3.c:4644
#define SQLITE_FCNTL_LOCK_TIMEOUT
Definition sqlite3.c:1577
#define SQLITE_TRACE_PROFILE
Definition sqlite3.c:3896
#define SQLITE_FCNTL_RBU
Definition sqlite3.c:1569
#define SQLITE_TESTCTRL_PRNG_RESTORE
Definition sqlite3.c:8850
#define SQLITE_READONLY_DBMOVED
Definition sqlite3.c:870
#define SQLITE_UTF16BE
Definition sqlite3.c:6040
#define SQLITE_IOERR_DELETE
Definition sqlite3.c:828
#define SQLITE_CONFIG_MALLOC
Definition sqlite3.c:2511
#define SQLITE_STATUS_PAGECACHE_OVERFLOW
Definition sqlite3.c:9173
#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS
Definition sqlite3.c:8878
#define SQLITE_DBSTATUS_LOOKASIDE_HIT
Definition sqlite3.c:9324
#define SQLITE_TESTCTRL_NEVER_CORRUPT
Definition sqlite3.c:8869
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA
Definition sqlite3.c:2984
#define SQLITE_DBCONFIG_RESET_DATABASE
Definition sqlite3.c:2976
#define SQLITE_INTEGER
Definition sqlite3.c:5562
#define SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE
Definition sqlite3.c:2987
#define SQLITE_VTAB_DIRECTONLY
Definition sqlite3.c:10380
#define SQLITE_GET_LOCKPROXYFILE
Definition sqlite3.c:1590
#define SQLITE_DBCONFIG_DQS_DML
Definition sqlite3.c:2980
#define SQLITE_INTERNAL
Definition sqlite3.c:768
#define SQLITE_IOERR_SHMMAP
Definition sqlite3.c:839
#define SQLITE_IOERR_LOCK
Definition sqlite3.c:833
#define SQLITE_MISMATCH
Definition sqlite3.c:786
#define SQLITE_TESTCTRL_GETOPT
Definition sqlite3.c:8863
#define SQLITE_TRACE_ROW
Definition sqlite3.c:3897
#define SQLITE_DESERIALIZE_RESIZEABLE
Definition sqlite3.c:11373
#define SQLITE_UTF8
Definition sqlite3.c:6038
#define SQLITE_IOERR_BLOCKED
Definition sqlite3.c:829
#define SQLITE_TESTCTRL_ASSERT
Definition sqlite3.c:8857
#define SQLITE_LOCKED_SHAREDCACHE
Definition sqlite3.c:853
#define SQLITE_STATUS_MEMORY_USED
Definition sqlite3.c:9171
#define SQLITE_TESTCTRL_OPTIMIZATIONS
Definition sqlite3.c:8861
#define SQLITE_CONFIG_LOOKASIDE
Definition sqlite3.c:2520
#define SQLITE_SHM_UNLOCK
Definition sqlite3.c:1893
#define SQLITE_IOERR_UNLOCK
Definition sqlite3.c:826
#define SQLITE_INDEX_CONSTRAINT_EQ
Definition sqlite3.c:8066
#define SQLITE_DBCONFIG_ENABLE_QPSG
Definition sqlite3.c:2974
#define SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE
Definition sqlite3.c:2988
#define SQLITE_TOOBIG
Definition sqlite3.c:784
#define SQLITE_IOERR_DIR_FSYNC
Definition sqlite3.c:823
#define SQLITE_TESTCTRL_JSON_SELFCHECK
Definition sqlite3.c:8860
#define SQLITE_FCNTL_POWERSAFE_OVERWRITE
Definition sqlite3.c:1557
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH
Definition sqlite3.c:4649
#define SQLITE_INNOCUOUS
Definition sqlite3.c:6147
#define SQLITE_STMTSTATUS_RUN
Definition sqlite3.c:9432
#define SQLITE_FCNTL_VFS_POINTER
Definition sqlite3.c:1570
#define SQLITE_CONFIG_URI
Definition sqlite3.c:2524
#define SQLITE_IOERR_DIR_CLOSE
Definition sqlite3.c:835
#define SQLITE_IOERR_FSTAT
Definition sqlite3.c:825
#define SQLITE_FCNTL_HAS_MOVED
Definition sqlite3.c:1563
#define SQLITE_TESTCTRL_SEEK_COUNT
Definition sqlite3.c:8879
#define SQLITE_STATIC
Definition sqlite3.c:6586
#define SQLITE_CONFIG_MMAP_SIZE
Definition sqlite3.c:2529
#define SQLITE_FCNTL_TEMPFILENAME
Definition sqlite3.c:1560
#define SQLITE_PROTOCOL
Definition sqlite3.c:781
#define SQLITE_DBCONFIG_WRITABLE_SCHEMA
Definition sqlite3.c:2978
#define SQLITE_NOMEM
Definition sqlite3.c:773
#define SQLITE_UTF16LE
Definition sqlite3.c:6039
#define SQLITE_OPEN_READONLY
Definition sqlite3.c:914
#define SQLITE_TESTCTRL_TUNE
Definition sqlite3.c:8881
#define SQLITE_FCNTL_SYNC
Definition sqlite3.c:1564
#define SQLITE_IOERR_READ
Definition sqlite3.c:819
#define SQLITE_DBCONFIG_STMT_SCANSTATUS
Definition sqlite3.c:2985
#define SQLITE_DBSTATUS_SCHEMA_USED
Definition sqlite3.c:9322
#define SQLITE_FCNTL_CKPT_DONE
Definition sqlite3.c:1580
#define SQLITE_FCNTL_RESET_CACHE
Definition sqlite3.c:1585
#define SQLITE_IOERR_SEEK
Definition sqlite3.c:840
#define SQLITE_SYNC_FULL
Definition sqlite3.c:1043
#define SQLITE_CONFIG_ROWID_IN_VIEW
Definition sqlite3.c:2537
#define SQLITE_ABORT
Definition sqlite3.c:770
#define SQLITE_LOCKED
Definition sqlite3.c:772
#define SQLITE_FCNTL_JOURNAL_POINTER
Definition sqlite3.c:1571
#define SQLITE_CONFIG_SERIALIZED
Definition sqlite3.c:2510
#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
Definition sqlite3.c:2979
#define SQLITE_UPDATE
Definition sqlite3.c:3793
#define SQLITE_INDEX_CONSTRAINT_GT
Definition sqlite3.c:8067
#define SQLITE_IOERR_ACCESS
Definition sqlite3.c:831
#define SQLITE_LIMIT_TRIGGER_DEPTH
Definition sqlite3.c:4651
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
Definition sqlite3.c:2973
#define SQLITE_IOERR_RDLOCK
Definition sqlite3.c:827
#define SQLITE_FCNTL_OVERWRITE
Definition sqlite3.c:1555
#define SQLITE_TXN_NONE
Definition sqlite3.c:7244
#define SQLITE_OPEN_NOFOLLOW
Definition sqlite3.c:934
#define SQLITE_FCNTL_WAL_BLOCK
Definition sqlite3.c:1567
#define SQLITE_FCNTL_BUSYHANDLER
Definition sqlite3.c:1559
#define SQLITE_TEXT
Definition sqlite3.c:5569
#define SQLITE_STMTSTATUS_REPREPARE
Definition sqlite3.c:9431
#define SQLITE_DBCONFIG_REVERSE_SCANORDER
Definition sqlite3.c:2986
#define SQLITE_TRACE_CLOSE
Definition sqlite3.c:3898
#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
Definition sqlite3.c:2983
#define SQLITE_DBSTATUS_CACHE_WRITE
Definition sqlite3.c:9329
#define SQLITE_LIMIT_VARIABLE_NUMBER
Definition sqlite3.c:4650
#define SQLITE_SYNC_DATAONLY
Definition sqlite3.c:1044
#define SQLITE_FCNTL_PERSIST_WAL
Definition sqlite3.c:1554
#define SQLITE_DELETE
Definition sqlite3.c:3779
#define SQLITE_STATUS_PAGECACHE_SIZE
Definition sqlite3.c:9178
#define SQLITE_DBSTATUS_CACHE_SPILL
Definition sqlite3.c:9332
#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE
Definition sqlite3.c:1574
#define SQLITE_EMPTY
Definition sqlite3.c:782
#define SQLITE_STMTSTATUS_FILTER_MISS
Definition sqlite3.c:9433
#define SQLITE_DBCONFIG_ENABLE_VIEW
Definition sqlite3.c:2982
#define SQLITE_BUSY_RECOVERY
Definition sqlite3.c:855
#define SQLITE_FCNTL_CKSM_FILE
Definition sqlite3.c:1584
#define SQLITE_TRANSIENT
Definition sqlite3.c:6587
#define SQLITE_STMTSTATUS_VM_STEP
Definition sqlite3.c:9430
#define SQLITE_FCNTL_LOCKSTATE
Definition sqlite3.c:1545
#define SQLITE_CONFIG_SINGLETHREAD
Definition sqlite3.c:2508
#define SQLITE_DBSTATUS_LOOKASIDE_USED
Definition sqlite3.c:9320
#define SQLITE_FCNTL_RESERVE_BYTES
Definition sqlite3.c:1581
#define SQLITE_FCNTL_WIN32_AV_RETRY
Definition sqlite3.c:1553
#define SQLITE_TRACE_STMT
Definition sqlite3.c:3895
#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE
Definition sqlite3.c:1576
#define SQLITE_TESTCTRL_FAULT_INSTALL
Definition sqlite3.c:8854
#define SQLITE_LIMIT_LENGTH
Definition sqlite3.c:4641
#define SQLITE_INDEX_CONSTRAINT_LIMIT
Definition sqlite3.c:8080
#define SQLITE_TESTCTRL_TRACEFLAGS
Definition sqlite3.c:8880
#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE
Definition sqlite3.c:1575
#define SQLITE_TESTCTRL_BYTEORDER
Definition sqlite3.c:8871
#define SQLITE_TXN_READ
Definition sqlite3.c:7245
#define SQLITE_DBSTATUS_CACHE_MISS
Definition sqlite3.c:9328
#define SQLITE_IOERR_FSYNC
Definition sqlite3.c:822
#define SQLITE_IOERR_CHECKRESERVEDLOCK
Definition sqlite3.c:832
#define SQLITE_CONFIG_GETPCACHE2
Definition sqlite3.c:2526
#define SQLITE_PERM
Definition sqlite3.c:769
#define SQLITE_STMTSTATUS_FULLSCAN_STEP
Definition sqlite3.c:9427
#define SQLITE_DBCONFIG_TRIGGER_EQP
Definition sqlite3.c:2975
#define SQLITE_STATUS_MALLOC_COUNT
Definition sqlite3.c:9180
#define SQLITE_ATTACH
Definition sqlite3.c:3794
#define SQLITE_FCNTL_ZIPVFS
Definition sqlite3.c:1568
#define SQLITE_FCNTL_PDB
Definition sqlite3.c:1573
#define SQLITE_SHM_EXCLUSIVE
Definition sqlite3.c:1896
#define SQLITE_SELFORDER1
Definition sqlite3.c:6149
#define SQLITE_FCNTL_PRAGMA
Definition sqlite3.c:1558
#define SQLITE_NULL
Definition sqlite3.c:5565
#define SQLITE_DONE
Definition sqlite3.c:796
#define SQLITE_CANTOPEN
Definition sqlite3.c:780
#define SQLITE_ERROR
Definition sqlite3.c:767
#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS
Definition sqlite3.c:8865
#define SQLITE_CANTOPEN_NOTEMPDIR
Definition sqlite3.c:858
#define SQLITE_IOERR_SHMLOCK
Definition sqlite3.c:838
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92826
SQLITE_API sqlite3 * sqlite3_db_handle(sqlite3_stmt *)
Definition sqlite3.c:93434
SQLITE_API sqlite3_vfs * sqlite3_vfs_find(const char *zVfsName)
Definition sqlite3.c:26892
SQLITE_API void * sqlite3_malloc64(sqlite3_uint64)
Definition sqlite3.c:31066
SQLITE_API int sqlite3_table_column_metadata(sqlite3 *db, const char *zDbName, const char *zTableName, const char *zColumnName, char const **pzDataType, char const **pzCollSeq, int *pNotNull, int *pPrimaryKey, int *pAutoinc)
Definition sqlite3.c:186546
SQLITE_API int sqlite3_trace_v2(sqlite3 *, unsigned uMask, int(*xCallback)(unsigned, void *, void *, void *), void *pCtx)
Definition sqlite3.c:184858
SQLITE_API char * sqlite3_vsnprintf(int, char *, const char *, va_list)
Definition sqlite3.c:32958
sqlite_int64 sqlite3_int64
Definition sqlite3.h:304
SQLITE_API int sqlite3_keyword_check(const char *, int)
Definition sqlite3.c:181445
SQLITE_API int sqlite3_limit(sqlite3 *, int id, int newVal)
Definition sqlite3.c:185541
SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *, int n)
Definition sqlite3.c:92099
SQLITE_API int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs)
Definition sqlite3.c:186236
SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr)
Definition sqlite3.c:131209
SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage)
Definition sqlite3.c:83373
SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p)
Definition sqlite3.c:83630
sqlite_uint64 sqlite3_uint64
Definition sqlite3.h:305
SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *)
Definition sqlite3.c:26966
SQLITE_API void sqlite3_result_int(sqlite3_context *, int)
Definition sqlite3.c:91949
SQLITE_API sqlite3_backup * sqlite3_backup_init(sqlite3 *pDest, const char *zDestName, sqlite3 *pSource, const char *zSourceName)
Definition sqlite3.c:83199
SQLITE_API void sqlite3_result_blob64(sqlite3_context *, const void *, sqlite3_uint64, void(*)(void *))
Definition sqlite3.c:91904
SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt)
Definition sqlite3.c:93450
SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *)
Definition sqlite3.c:94770
SQLITE_API int sqlite3_status64(int op, sqlite3_int64 *pCurrent, sqlite3_int64 *pHighwater, int resetFlag)
Definition sqlite3.c:24441
SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc)
Definition sqlite3.c:131223
SQLITE_API void sqlite3_result_text(sqlite3_context *, const char *, int, void(*)(void *))
Definition sqlite3.c:92011
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt)
Definition sqlite3.c:92701
SQLITE_API int sqlite3_file_control(sqlite3 *, const char *zDbName, int op, void *)
Definition sqlite3.c:186690
SQLITE_API int sqlite3_db_config(sqlite3 *, int op,...)
Definition sqlite3.c:183543
SQLITE_API double sqlite3_column_double(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92836
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92846
SQLITE_API const char * sqlite3_sourceid(void)
Definition sqlite3.c:262849
SQLITE_API void * sqlite3_realloc64(void *, sqlite3_uint64)
Definition sqlite3.c:31314
SQLITE_API int sqlite3_column_type(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92872
SQLITE_API int sqlite3_error_offset(sqlite3 *db)
Definition sqlite3.c:185309
SQLITE_API int sqlite3_test_control(int op,...)
Definition sqlite3.c:186743
SQLITE_API double sqlite3_value_double(sqlite3_value *)
Definition sqlite3.c:91654
SQLITE_API int sqlite3_strnicmp(const char *, const char *, int)
Definition sqlite3.c:35939
SQLITE_API int sqlite3_create_function(sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void(*xFunc)(sqlite3_context *, int, sqlite3_value **), void(*xStep)(sqlite3_context *, int, sqlite3_value **), void(*xFinal)(sqlite3_context *))
Definition sqlite3.c:184698
SQLITE_API const char * sqlite3_vtab_collation(sqlite3_index_info *, int)
Definition sqlite3.c:168870
SQLITE_API int sqlite3_txn_state(sqlite3 *, const char *zSchema)
Definition sqlite3.c:183901
SQLITE_API const char * sqlite3_libversion(void)
Definition sqlite3.c:182691
SQLITE_API char * sqlite3_mprintf(const char *,...)
Definition sqlite3.c:32933
SQLITE_API sqlite3 * sqlite3_context_db_handle(sqlite3_context *)
Definition sqlite3.c:92420
SQLITE_API const char * sqlite3_column_decltype(sqlite3_stmt *, int)
Definition sqlite3.c:93008
SQLITE_API void sqlite3_result_double(sqlite3_context *, double)
Definition sqlite3.c:91924
SQLITE_API void sqlite3_result_error(sqlite3_context *, const char *, int)
Definition sqlite3.c:91931
SQLITE_API const char * sqlite3_sql(sqlite3_stmt *pStmt)
Definition sqlite3.c:93557
SQLITE_API int sqlite3_value_int(sqlite3_value *)
Definition sqlite3.c:91657
SQLITE_API int sqlite3_deserialize(sqlite3 *db, const char *zSchema, unsigned char *pData, sqlite3_int64 szDb, sqlite3_int64 szBuf, unsigned mFlags)
Definition sqlite3.c:54646
SQLITE_API void sqlite3_set_auxdata(sqlite3_context *, int N, void *, void(*)(void *))
Definition sqlite3.c:92635
SQLITE_API int sqlite3_declare_vtab(sqlite3 *, const char *zSQL)
Definition sqlite3.c:158332
SQLITE_API void sqlite3_free(void *)
Definition sqlite3.c:31135
SQLITE_API char * sqlite3_expanded_sql(sqlite3_stmt *pStmt)
Definition sqlite3.c:93571
SQLITE_API int sqlite3_bind_null(sqlite3_stmt *, int)
Definition sqlite3.c:93215
SQLITE_API void sqlite3_str_appendall(sqlite3_str *, const char *zIn)
Definition sqlite3.c:32734
SQLITE_API int sqlite3_column_int(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92841
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt *, int, const void *, int n, void(*)(void *))
Definition sqlite3.c:93168
SQLITE_API int sqlite3_vtab_config(sqlite3 *, int op,...)
Definition sqlite3.c:158853
SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *, int makeDflt)
Definition sqlite3.c:26938
SQLITE_API int sqlite3_set_authorizer(sqlite3 *, int(*xAuth)(void *, int, const char *, const char *, const char *, const char *), void *pUserData)
Definition sqlite3.c:122778
SQLITE_API int sqlite3_config(int,...)
Definition sqlite3.c:183019
SQLITE_API int sqlite3_extended_errcode(sqlite3 *db)
Definition sqlite3.c:185375
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt)
Definition sqlite3.c:91581
SQLITE_API void sqlite3_progress_handler(sqlite3 *, int, int(*)(void *), void *)
Definition sqlite3.c:184393
SQLITE_API int sqlite3_errcode(sqlite3 *db)
Definition sqlite3.c:185366
SQLITE_API int sqlite3_bind_text(sqlite3_stmt *, int, const char *, int, void(*)(void *))
Definition sqlite3.c:93244
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt)
Definition sqlite3.c:91552
SQLITE_API void * sqlite3_realloc(void *, int)
Definition sqlite3.c:31307
SQLITE_API int sqlite3_libversion_number(void)
Definition sqlite3.c:182704
SQLITE_API int sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail)
Definition sqlite3.c:144649
SQLITE_API int sqlite3_get_autocommit(sqlite3 *)
Definition sqlite3.c:186473
SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *, int op, int resetFlg)
Definition sqlite3.c:93525
SQLITE_API int sqlite3_keyword_name(int, const char **, int *)
Definition sqlite3.c:181437
SQLITE_API const char * sqlite3_bind_parameter_name(sqlite3_stmt *, int)
Definition sqlite3.c:93361
SQLITE_API int sqlite3_bind_double(sqlite3_stmt *, int, double)
Definition sqlite3.c:93190
SQLITE_API int sqlite3_create_window_function(sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void(*xStep)(sqlite3_context *, int, sqlite3_value **), void(*xFinal)(sqlite3_context *), void(*xValue)(sqlite3_context *), void(*xInverse)(sqlite3_context *, int, sqlite3_value **), void(*xDestroy)(void *))
Definition sqlite3.c:184725
SQLITE_API int sqlite3_bind_value(sqlite3_stmt *, int, const sqlite3_value *)
Definition sqlite3.c:93279
SQLITE_API void * sqlite3_aggregate_context(sqlite3_context *, int nBytes)
Definition sqlite3.c:92583
SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName)
Definition sqlite3.c:187524
SQLITE_API int sqlite3_exec(sqlite3 *, const char *sql, int(*callback)(void *, int, char **, char **), void *, char **errmsg)
Definition sqlite3.c:138206
SQLITE_API int sqlite3_open(const char *filename, sqlite3 **ppDb)
Definition sqlite3.c:186229
void(* sqlite3_syscall_ptr)(void)
Definition sqlite3.h:1488
SQLITE_API int sqlite3_complete(const char *sql)
Definition sqlite3.c:182307
SQLITE_API void sqlite3_result_int64(sqlite3_context *, sqlite3_int64)
Definition sqlite3.c:91956
SQLITE_API int sqlite3_load_extension(sqlite3 *db, const char *zFile, const char *zProc, char **pzErrMsg)
Definition sqlite3.c:139753
SQLITE_API int sqlite3_bind_text64(sqlite3_stmt *, int, const char *, sqlite3_uint64, void(*)(void *), unsigned char encoding)
Definition sqlite3.c:93253
SQLITE_API char * sqlite3_snprintf(int, char *, const char *,...)
Definition sqlite3.c:32973
SQLITE_API void sqlite3_result_blob(sqlite3_context *, const void *, int, void(*)(void *))
Definition sqlite3.c:91888
SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *)
Definition sqlite3.c:92147
SQLITE_API void sqlite3_randomness(int N, void *P)
Definition sqlite3.c:34526
SQLITE_API int sqlite3_bind_int(sqlite3_stmt *, int, int)
Definition sqlite3.c:93201
SQLITE_API int sqlite3_stricmp(const char *, const char *)
Definition sqlite3.c:35912
SQLITE_API void sqlite3_str_appendf(sqlite3_str *, const char *zFormat,...)
Definition sqlite3.c:33069
SQLITE_API int sqlite3_initialize(void)
Definition sqlite3.c:182783
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt)
Definition sqlite3.c:93442
SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value *)
Definition sqlite3.c:91660
SQLITE_API int sqlite3_db_status(sqlite3 *, int op, int *pCur, int *pHiwtr, int resetFlg)
Definition sqlite3.c:24510
SQLITE_API void sqlite3_interrupt(sqlite3 *)
Definition sqlite3.c:184478
SQLITE_API int sqlite3_create_module(sqlite3 *db, const char *zName, const sqlite3_module *p, void *pClientData)
Definition sqlite3.c:157629
SQLITE_API int sqlite3_step(sqlite3_stmt *)
Definition sqlite3.c:92348
SQLITE_API int sqlite3_close(sqlite3 *)
Definition sqlite3.c:183936
SQLITE_API int sqlite3_value_type(sqlite3_value *)
Definition sqlite3.c:91698
SQLITE_API void * sqlite3_malloc(int)
Definition sqlite3.c:31060
SQLITE_API void sqlite3_result_error_code(sqlite3_context *, int)
Definition sqlite3.c:92121
SQLITE_API char * sqlite3_str_finish(sqlite3_str *)
Definition sqlite3.c:32795
SQLITE_API int sqlite3_keyword_count(void)
Definition sqlite3.c:181444
SQLITE_API void * sqlite3_get_auxdata(sqlite3_context *, int N)
Definition sqlite3.c:92604
SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *)
Definition sqlite3.c:93350
SQLITE_API int sqlite3_create_collation_v2(sqlite3 *, const char *zName, int eTextRep, void *pArg, int(*xCompare)(void *, int, const void *, int, const void *), void(*xDestroy)(void *))
Definition sqlite3.c:186301
SQLITE_API const void * sqlite3_column_blob(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92816
SQLITE_API int sqlite3_sleep(int)
Definition sqlite3.c:186661
SQLITE_API void * sqlite3_user_data(sqlite3_context *)
Definition sqlite3.c:92402
SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode)
Definition sqlite3.c:93457
SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3 *)
Definition sqlite3.c:183726
SQLITE_API const char * sqlite3_column_name(sqlite3_stmt *, int N)
Definition sqlite3.c:92985
SQLITE_API const char * sqlite3_errmsg(sqlite3 *)
Definition sqlite3.c:185283
SQLITE_API void sqlite3_result_null(sqlite3_context *)
Definition sqlite3.c:91963
SQLITE_API int sqlite3_create_collation(sqlite3 *, const char *zName, int eTextRep, void *pArg, int(*xCompare)(void *, int, const void *, int, const void *))
Definition sqlite3.c:186288
SQLITE_API sqlite3_str * sqlite3_str_new(sqlite3 *)
Definition sqlite3.c:32861
SQLITE_API void sqlite3_str_append(sqlite3_str *, const char *zIn, int N)
Definition sqlite3.c:32717
SQLITE_API int sqlite3_shutdown(void)
Definition sqlite3.c:182965
SQLITE_API const unsigned char * sqlite3_column_text(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92851
SQLITE_API int sqlite3_value_bytes(sqlite3_value *)
Definition sqlite3.c:91648
SQLITE_API const unsigned char * sqlite3_value_text(sqlite3_value *)
Definition sqlite3.c:91680
SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff)
Definition sqlite3.c:139784
SQLITE_API const void * sqlite3_value_blob(sqlite3_value *)
Definition sqlite3.c:91635
SQLITE_API void sqlite3_result_value(sqlite3_context *, sqlite3_value *)
Definition sqlite3.c:92081
SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3 *)
Definition sqlite3.c:183742
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *, int, sqlite3_int64)
Definition sqlite3.c:93204
SQLITE_API char * sqlite3_vmprintf(const char *, va_list)
Definition sqlite3.c:32909
SQLITE_API sqlite3_value * sqlite3_column_value(sqlite3_stmt *, int iCol)
Definition sqlite3.c:92856
SQLITE_API int sqlite3_collation_needed(sqlite3 *, void *, void(*)(void *, sqlite3 *, int eTextRep, const char *))
Definition sqlite3.c:186356
SQLITE_API int sqlite3_busy_timeout(sqlite3 *, int ms)
Definition sqlite3.c:184424
SQLITE_API void sqlite3_result_text64(sqlite3_context *, const char *, sqlite3_uint64, void(*)(void *), unsigned char encoding)
Definition sqlite3.c:92026
sqlite3_int64 iMark
Definition shell.c:9659
sqlite3_file base
Definition shell.c:9657
sqlite3_int64 iPgOne
Definition shell.c:9658
int nDigit
Definition shell.c:3736
char isNull
Definition shell.c:3734
char isInit
Definition shell.c:3735
signed char * a
Definition shell.c:3738
char oom
Definition shell.c:3733
int nFrac
Definition shell.c:3737
char sign
Definition shell.c:3732
int inParenLevel
Definition shell.c:915
char dynamicPrompt[PROMPT_LEN_MAX]
Definition shell.c:913
char * zScannerAwaits
Definition shell.c:916
char acAwait[2]
Definition shell.c:914
char zPrefix[100]
Definition shell.c:21652
EQPGraphRow * pLast
Definition shell.c:21651
EQPGraphRow * pRow
Definition shell.c:21650
int iParentId
Definition shell.c:21642
EQPGraphRow * pNext
Definition shell.c:21643
char zText[1]
Definition shell.c:21644
sqlite3_vtab_cursor base
Definition shell.c:13131
sqlite3_stmt * pData
Definition shell.c:13132
sqlite3expert * pExpert
Definition shell.c:21634
int bVerbose
Definition shell.c:21635
sqlite3_vtab base
Definition shell.c:13124
IdxTable * pTab
Definition shell.c:13125
sqlite3expert * pExpert
Definition shell.c:13126
DIR * pDir
Definition shell.c:8551
char * zDir
Definition shell.c:8552
char * zColl
Definition shell.c:12848
int iPk
Definition shell.c:12849
char * zName
Definition shell.c:12847
IdxConstraint * pLink
Definition shell.c:12826
char * zColl
Definition shell.c:12820
IdxConstraint * pNext
Definition shell.c:12825
Definition shell.c:12894
char * zKey
Definition shell.c:12895
IdxHashEntry * pNext
Definition shell.c:12899
IdxHashEntry * pHashNext
Definition shell.c:12898
char * zVal2
Definition shell.c:12897
char * zVal
Definition shell.c:12896
IdxHashEntry * pFirst
Definition shell.c:12902
IdxHashEntry * aHash[IDX_HASH_SIZE]
Definition shell.c:12903
int nSlot
Definition shell.c:14315
double target
Definition shell.c:14283
double nRow
Definition shell.c:14284
double nRet
Definition shell.c:14285
IdxScan * pNextScan
Definition shell.c:12839
IdxConstraint * pEq
Definition shell.c:12837
int iDb
Definition shell.c:12834
IdxConstraint * pRange
Definition shell.c:12838
i64 covering
Definition shell.c:12835
IdxTable * pTab
Definition shell.c:12833
IdxConstraint * pOrder
Definition shell.c:12836
char * zIdx
Definition shell.c:12876
IdxStatement * pNext
Definition shell.c:12878
char * zSql
Definition shell.c:12875
char * zEQP
Definition shell.c:12877
IdxColumn * aCol
Definition shell.c:12854
IdxTable * pNext
Definition shell.c:12855
int nCol
Definition shell.c:12852
char * zName
Definition shell.c:12853
IdxTable * pTab
Definition shell.c:12864
IdxWrite * pNext
Definition shell.c:12866
int eOp
Definition shell.c:12865
const char * zName
Definition shell.c:4731
char bDiscrete
Definition shell.c:4734
double rPct
Definition shell.c:4724
unsigned nAlloc
Definition shell.c:4719
unsigned nUsed
Definition shell.c:4720
char bSorted
Definition shell.c:4721
double * a
Definition shell.c:4725
char bPctValid
Definition shell.c:4723
char bKeepSorted
Definition shell.c:4722
unsigned nAlloc
Definition shell.c:7209
unsigned char zInit[12]
Definition shell.c:7206
int nInit
Definition shell.c:7207
char * aOp
Definition shell.c:7203
int * aArg
Definition shell.c:7204
ReInput sIn
Definition shell.c:7201
const char * zErr
Definition shell.c:7202
unsigned(* xNextChar)(ReInput *)
Definition shell.c:7205
unsigned nState
Definition shell.c:7208
const unsigned char * z
Definition shell.c:7191
int i
Definition shell.c:7192
int mx
Definition shell.c:7193
unsigned nState
Definition shell.c:7183
ReStateNumber * aState
Definition shell.c:7184
unsigned char buffer[64]
Definition shell.c:3227
unsigned int state[5]
Definition shell.c:3225
unsigned int count[2]
Definition shell.c:3226
unsigned iSize
Definition shell.c:2481
unsigned nRate
Definition shell.c:2478
unsigned ixMask
Definition shell.c:2480
unsigned nLoaded
Definition shell.c:2479
u64 s[25]
Definition shell.c:2475
unsigned char x[1600]
Definition shell.c:2476
u8 isReversing
Definition shell.c:6341
sqlite3_int64 iValueNow
Definition shell.c:6339
sqlite3_int64 iBase
Definition shell.c:6334
sqlite3_int64 iTerm
Definition shell.c:6335
sqlite3_int64 iOTerm
Definition shell.c:6333
sqlite3_uint64 uSeqIndexNow
Definition shell.c:6338
sqlite3_int64 iStep
Definition shell.c:6336
sqlite3_int64 iOBase
Definition shell.c:6332
sqlite3_uint64 uSeqIndexMax
Definition shell.c:6337
const char * zDbFilename
Definition shell.c:21727
char * zFreeOnClose
Definition shell.c:21728
sqlite3 * db
Definition shell.c:21726
int * aiIndent
Definition shell.c:21735
unsigned mEqpLines
Definition shell.c:21687
int modePrior
Definition shell.c:21698
int iIndent
Definition shell.c:21737
int nCheck
Definition shell.c:21703
u8 autoExplain
Definition shell.c:21671
char * zDestTable
Definition shell.c:21710
int * colWidth
Definition shell.c:21717
sqlite3_int64 szMax
Definition shell.c:21709
FILE * traceOut
Definition shell.c:21695
sqlite3_stmt * pStmt
Definition shell.c:21723
char rowSeparator[20]
Definition shell.c:21714
unsigned priorShFlgs
Definition shell.c:21708
u8 autoEQPtest
Definition shell.c:21673
u8 bSafeModePersist
Definition shell.c:21681
char colSepPrior[20]
Definition shell.c:21715
u8 bSafeMode
Definition shell.c:21680
char nullValue[20]
Definition shell.c:21720
unsigned nProgress
Definition shell.c:21704
u8 nEqpLevel
Definition shell.c:21678
int * actualWidth
Definition shell.c:21718
int inputNesting
Definition shell.c:21688
int nIndent
Definition shell.c:21736
ExpertInfo expert
Definition shell.c:21740
int writableSchema
Definition shell.c:21701
u8 eRestoreState
Definition shell.c:21682
u8 eEscMode
Definition shell.c:21684
int cMode
Definition shell.c:21699
int lineno
Definition shell.c:21691
char zTestcase[30]
Definition shell.c:21712
unsigned mxProgress
Definition shell.c:21705
unsigned shellFlgs
Definition shell.c:21707
char rowSepPrior[20]
Definition shell.c:21716
EQPGraph sGraph
Definition shell.c:21739
FILE * pLog
Definition shell.c:21724
unsigned statsOn
Definition shell.c:21686
int outCount
Definition shell.c:21689
char outfile[FILENAME_MAX]
Definition shell.c:21722
u8 eTraceType
Definition shell.c:21679
u8 scanstatsOn
Definition shell.c:21675
u8 doXdgOpen
Definition shell.c:21677
int normalMode
Definition shell.c:21700
char * zTempFile
Definition shell.c:21711
u8 autoEQPtrace
Definition shell.c:21674
ColModeOpts cmOpts
Definition shell.c:21685
unsigned flgProgress
Definition shell.c:21706
char * zNonce
Definition shell.c:21738
u8 openMode
Definition shell.c:21676
int showHeader
Definition shell.c:21702
FILE * in
Definition shell.c:21693
char colSeparator[20]
Definition shell.c:21713
int openFlags
Definition shell.c:21692
FILE * out
Definition shell.c:21694
u8 crlfMode
Definition shell.c:21683
int nWidth
Definition shell.c:21719
sqlite3 * db
Definition shell.c:21670
int nAlloc
Definition shell.c:1464
int n
Definition shell.c:1463
char * z
Definition shell.c:1462
unsigned int x
Definition shell.c:16143
unsigned int y
Definition shell.c:16143
sqlite3 * db
Definition shell.c:9083
sqlite3_int64 iRowid
Definition shell.c:9090
sqlite3_vtab_cursor base
Definition shell.c:9082
sqlite3_stmt * pStmt
Definition shell.c:9089
const char * zCurrentRow
Definition shell.c:9087
sqlite3 * db
Definition shell.c:9073
sqlite3_vtab base
Definition shell.c:9072
char * zPath
Definition shell.c:8566
STRUCT_STAT sStat
Definition shell.c:8565
const char * zBase
Definition shell.c:8562
sqlite3_vtab_cursor base
Definition shell.c:8556
FsdirLevel * aLvl
Definition shell.c:8560
sqlite3_int64 iRowid
Definition shell.c:8567
sqlite3_vtab base
Definition shell.c:8572
SequenceSpec ss
Definition shell.c:6430
sqlite3_vtab_cursor base
Definition shell.c:6429
const struct sqlite3_io_methods * pMethods
Definition sqlite3.h:740
sqlite3_int64 estimatedRows
Definition sqlite3.h:7691
char * zKey
Definition shell.c:15212
sqlite3_stmt * pCheck
Definition shell.c:15211
sqlite3 * db
Definition shell.c:15207
char * zTestSql
Definition shell.c:15220
char * zMessage
Definition shell.c:15215
char * zObj
Definition shell.c:15209
int bCorruptSchema
Definition shell.c:15216
const char * zDb
Definition shell.c:15208
char * zErr
Definition shell.c:15219
int(* xRead)(sqlite3_file *, void *, int iAmt, sqlite3_int64 iOfst)
Definition sqlite3.h:849
int(* xClose)(sqlite3_file *)
Definition sqlite3.h:848
int(* xLock)(sqlite3_file *, int)
Definition sqlite3.h:854
int(* xShmMap)(sqlite3_file *, int iPg, int pgsz, int, void volatile **)
Definition sqlite3.h:861
int(* xShmLock)(sqlite3_file *, int offset, int n, int flags)
Definition sqlite3.h:862
int(* xFileControl)(sqlite3_file *, int op, void *pArg)
Definition sqlite3.h:857
int(* xWrite)(sqlite3_file *, const void *, int iAmt, sqlite3_int64 iOfst)
Definition sqlite3.h:850
int(* xUnfetch)(sqlite3_file *, sqlite3_int64 iOfst, void *p)
Definition sqlite3.h:867
int(* xSectorSize)(sqlite3_file *)
Definition sqlite3.h:858
int(* xSync)(sqlite3_file *, int flags)
Definition sqlite3.h:852
int(* xCheckReservedLock)(sqlite3_file *, int *pResOut)
Definition sqlite3.h:856
int(* xTruncate)(sqlite3_file *, sqlite3_int64 size)
Definition sqlite3.h:851
int(* xUnlock)(sqlite3_file *, int)
Definition sqlite3.h:855
int(* xDeviceCharacteristics)(sqlite3_file *)
Definition sqlite3.h:859
int(* xFileSize)(sqlite3_file *, sqlite3_int64 *pSize)
Definition sqlite3.h:853
int(* xFetch)(sqlite3_file *, sqlite3_int64 iOfst, int iAmt, void **pp)
Definition sqlite3.h:866
void(* xShmBarrier)(sqlite3_file *)
Definition sqlite3.h:863
int(* xShmUnmap)(sqlite3_file *, int deleteFlag)
Definition sqlite3.h:864
void *(* xRealloc)(void *, int)
Definition sqlite3.h:1792
int(* xSize)(void *)
Definition sqlite3.h:1793
void(* xShutdown)(void *)
Definition sqlite3.h:1796
int(* xRoundup)(int)
Definition sqlite3.h:1794
void(* xFree)(void *)
Definition sqlite3.h:1791
void *(* xMalloc)(int)
Definition sqlite3.h:1790
int(* xInit)(void *)
Definition sqlite3.h:1795
void(* xShutdown)(void *)
Definition sqlite3.h:9311
void(* xDestroy)(sqlite3_pcache *)
Definition sqlite3.h:9320
void(* xRekey)(sqlite3_pcache *, sqlite3_pcache_page *, unsigned oldKey, unsigned newKey)
Definition sqlite3.h:9317
void(* xCachesize)(sqlite3_pcache *, int nCachesize)
Definition sqlite3.h:9313
int(* xPagecount)(sqlite3_pcache *)
Definition sqlite3.h:9314
void(* xTruncate)(sqlite3_pcache *, unsigned iLimit)
Definition sqlite3.h:9319
int(* xInit)(void *)
Definition sqlite3.h:9310
void(* xUnpin)(sqlite3_pcache *, sqlite3_pcache_page *, int discard)
Definition sqlite3.h:9316
void(* xShrink)(sqlite3_pcache *)
Definition sqlite3.h:9321
const char * zName
Definition sqlite3.h:1494
int(* xFullPathname)(sqlite3_vfs *, const char *zName, int nOut, char *zOut)
Definition sqlite3.h:1500
void(*(* xDlSym)(sqlite3_vfs *, void *, const char *zSymbol))(void)
Definition sqlite3.h:1503
int(* xOpen)(sqlite3_vfs *, sqlite3_filename zName, sqlite3_file *, int flags, int *pOutFlags)
Definition sqlite3.h:1496
void(* xDlError)(sqlite3_vfs *, int nByte, char *zErrMsg)
Definition sqlite3.h:1502
int(* xGetLastError)(sqlite3_vfs *, int, char *)
Definition sqlite3.h:1508
sqlite3_vfs * pNext
Definition sqlite3.h:1493
int(* xDelete)(sqlite3_vfs *, const char *zName, int syncDir)
Definition sqlite3.h:1498
int(* xSetSystemCall)(sqlite3_vfs *, const char *zName, sqlite3_syscall_ptr)
Definition sqlite3.h:1518
void * pAppData
Definition sqlite3.h:1495
int(* xSleep)(sqlite3_vfs *, int microseconds)
Definition sqlite3.h:1506
int(* xCurrentTimeInt64)(sqlite3_vfs *, sqlite3_int64 *)
Definition sqlite3.h:1513
int(* xAccess)(sqlite3_vfs *, const char *zName, int flags, int *pResOut)
Definition sqlite3.h:1499
int(* xCurrentTime)(sqlite3_vfs *, double *)
Definition sqlite3.h:1507
const char *(* xNextSystemCall)(sqlite3_vfs *, const char *zName)
Definition sqlite3.h:1520
int(* xRandomness)(sqlite3_vfs *, int nByte, char *zOut)
Definition sqlite3.h:1505
void *(* xDlOpen)(sqlite3_vfs *, const char *zFilename)
Definition sqlite3.h:1501
void(* xDlClose)(sqlite3_vfs *, void *)
Definition sqlite3.h:1504
int mxPathname
Definition sqlite3.h:1492
sqlite3_vtab * pVtab
Definition sqlite3.h:7871
char * zErrMsg
Definition sqlite3.h:7849
sqlite3 * dbm
Definition shell.c:12912
IdxStatement * pStatement
Definition shell.c:12917
IdxHash hIdx
Definition shell.c:12921
IdxWrite * pWrite
Definition shell.c:12916
IdxTable * pTable
Definition shell.c:12914
sqlite3 * dbv
Definition shell.c:12913
sqlite3 * db
Definition shell.c:12911
IdxScan * pScan
Definition shell.c:12915
char ** pzErrmsg
Definition shell.c:12919
char * zCandidates
Definition shell.c:12922
sqlite3_file base
Definition shell.c:16363
sqlite3_file * pReal
Definition shell.c:16366
vfstrace_info * pInfo
Definition shell.c:16364
const char * zFName
Definition shell.c:16365
void * pOutArg
Definition shell.c:16353
sqlite3_vfs * pTraceVfs
Definition shell.c:16355
unsigned int mTrace
Definition shell.c:16351
sqlite3_vfs * pRootVfs
Definition shell.c:16349
int(* xOut)(const char *, void *)
Definition shell.c:16350
const char * zVfsName
Definition shell.c:16354