4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases.
15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS
21 ** Enable large-file support for fopen() and friends on unix.
23 #ifndef SQLITE_DISABLE_LFS
24 # define _LARGE_FILE 1
25 # ifndef _FILE_OFFSET_BITS
26 # define _FILE_OFFSET_BITS 64
28 # define _LARGEFILE_SOURCE 1
39 #if !defined(_WIN32) && !defined(WIN32)
41 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
45 # include <sys/types.h>
49 # include <editline/editline.h>
51 #if defined(HAVE_READLINE) && HAVE_READLINE==1
52 # include <readline/readline.h>
53 # include <readline/history.h>
55 #if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
56 # define add_history(X)
57 # define read_history(X)
58 # define write_history(X)
59 # define stifle_history(X)
62 #if defined(_WIN32) || defined(WIN32)
64 #define isatty(h) _isatty(h)
65 #define access(f,m) _access((f),(m))
69 #define pclose _pclose
71 /* Make sure isatty() has a prototype.
73 extern int isatty(int);
75 /* popen and pclose are not C89 functions and so are sometimes omitted from
76 ** the <stdio.h> header */
77 extern FILE *popen(const char*,const char*);
78 extern int pclose(FILE*);
81 #if defined(_WIN32_WCE)
82 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
83 * thus we always assume that we have a console. That can be
84 * overridden with the -batch command line option.
89 /* ctype macros that work with signed characters */
90 #define IsSpace(X) isspace((unsigned char)X)
91 #define IsDigit(X) isdigit((unsigned char)X)
92 #define ToLower(X) (char)tolower((unsigned char)X)
95 /* True if the timer is enabled */
96 static int enableTimer
= 0;
98 /* Return the current wall-clock time */
99 static sqlite3_int64
timeOfDay(void){
100 static sqlite3_vfs
*clockVfs
= 0;
102 if( clockVfs
==0 ) clockVfs
= sqlite3_vfs_find(0);
103 if( clockVfs
->iVersion
>=1 && clockVfs
->xCurrentTimeInt64
!=0 ){
104 clockVfs
->xCurrentTimeInt64(clockVfs
, &t
);
107 clockVfs
->xCurrentTime(clockVfs
, &r
);
108 t
= (sqlite3_int64
)(r
*86400000.0);
113 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
115 #include <sys/time.h>
116 #include <sys/resource.h>
118 /* Saved resource information for the beginning of an operation */
119 static struct rusage sBegin
; /* CPU time at start */
120 static sqlite3_int64 iBegin
; /* Wall-clock time at start */
123 ** Begin timing an operation
125 static void beginTimer(void){
127 getrusage(RUSAGE_SELF
, &sBegin
);
128 iBegin
= timeOfDay();
132 /* Return the difference of two time_structs in seconds */
133 static double timeDiff(struct timeval
*pStart
, struct timeval
*pEnd
){
134 return (pEnd
->tv_usec
- pStart
->tv_usec
)*0.000001 +
135 (double)(pEnd
->tv_sec
- pStart
->tv_sec
);
139 ** Print the timing results.
141 static void endTimer(void){
144 sqlite3_int64 iEnd
= timeOfDay();
145 getrusage(RUSAGE_SELF
, &sEnd
);
146 printf("Run Time: real %.3f user %f sys %f\n",
147 (iEnd
- iBegin
)*0.001,
148 timeDiff(&sBegin
.ru_utime
, &sEnd
.ru_utime
),
149 timeDiff(&sBegin
.ru_stime
, &sEnd
.ru_stime
));
153 #define BEGIN_TIMER beginTimer()
154 #define END_TIMER endTimer()
157 #elif (defined(_WIN32) || defined(WIN32))
161 /* Saved resource information for the beginning of an operation */
162 static HANDLE hProcess
;
163 static FILETIME ftKernelBegin
;
164 static FILETIME ftUserBegin
;
165 static sqlite3_int64 ftWallBegin
;
166 typedef BOOL (WINAPI
*GETPROCTIMES
)(HANDLE
, LPFILETIME
, LPFILETIME
, LPFILETIME
, LPFILETIME
);
167 static GETPROCTIMES getProcessTimesAddr
= NULL
;
170 ** Check to see if we have timer support. Return 1 if necessary
171 ** support found (or found previously).
173 static int hasTimer(void){
174 if( getProcessTimesAddr
){
177 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
178 ** See if the version we are running on has it, and if it does, save off
179 ** a pointer to it and the current process handle.
181 hProcess
= GetCurrentProcess();
183 HINSTANCE hinstLib
= LoadLibrary(TEXT("Kernel32.dll"));
184 if( NULL
!= hinstLib
){
185 getProcessTimesAddr
= (GETPROCTIMES
) GetProcAddress(hinstLib
, "GetProcessTimes");
186 if( NULL
!= getProcessTimesAddr
){
189 FreeLibrary(hinstLib
);
197 ** Begin timing an operation
199 static void beginTimer(void){
200 if( enableTimer
&& getProcessTimesAddr
){
201 FILETIME ftCreation
, ftExit
;
202 getProcessTimesAddr(hProcess
, &ftCreation
, &ftExit
, &ftKernelBegin
, &ftUserBegin
);
203 ftWallBegin
= timeOfDay();
207 /* Return the difference of two FILETIME structs in seconds */
208 static double timeDiff(FILETIME
*pStart
, FILETIME
*pEnd
){
209 sqlite_int64 i64Start
= *((sqlite_int64
*) pStart
);
210 sqlite_int64 i64End
= *((sqlite_int64
*) pEnd
);
211 return (double) ((i64End
- i64Start
) / 10000000.0);
215 ** Print the timing results.
217 static void endTimer(void){
218 if( enableTimer
&& getProcessTimesAddr
){
219 FILETIME ftCreation
, ftExit
, ftKernelEnd
, ftUserEnd
;
220 sqlite3_int64 ftWallEnd
= timeOfDay();
221 getProcessTimesAddr(hProcess
, &ftCreation
, &ftExit
, &ftKernelEnd
, &ftUserEnd
);
222 printf("Run Time: real %.3f user %f sys %f\n",
223 (ftWallEnd
- ftWallBegin
)*0.001,
224 timeDiff(&ftUserBegin
, &ftUserEnd
),
225 timeDiff(&ftKernelBegin
, &ftKernelEnd
));
229 #define BEGIN_TIMER beginTimer()
230 #define END_TIMER endTimer()
231 #define HAS_TIMER hasTimer()
240 ** Used to prevent warnings about unused parameters
242 #define UNUSED_PARAMETER(x) (void)(x)
245 ** If the following flag is set, then command execution stops
246 ** at an error if we are not interactive.
248 static int bail_on_error
= 0;
251 ** Threat stdin as an interactive input if the following variable
252 ** is true. Otherwise, assume stdin is connected to a file or pipe.
254 static int stdin_is_interactive
= 1;
257 ** The following is the open SQLite database. We make a pointer
258 ** to this database a static variable so that it can be accessed
259 ** by the SIGINT handler to interrupt database processing.
261 static sqlite3
*db
= 0;
264 ** True if an interrupt (Control-C) has been received.
266 static volatile int seenInterrupt
= 0;
269 ** This is the name of our program. It is set in main(), used
270 ** in a number of other places, mostly for error messages.
275 ** Prompt strings. Initialized in main. Settable with
276 ** .prompt main continue
278 static char mainPrompt
[20]; /* First line prompt. default: "sqlite> "*/
279 static char continuePrompt
[20]; /* Continuation prompt. default: " ...> " */
282 ** Write I/O traces to the following stream.
284 #ifdef SQLITE_ENABLE_IOTRACE
285 static FILE *iotrace
= 0;
289 ** This routine works like printf in that its first argument is a
290 ** format string and subsequent arguments are values to be substituted
291 ** in place of % fields. The result of formatting this string
292 ** is written to iotrace.
294 #ifdef SQLITE_ENABLE_IOTRACE
295 static void iotracePrintf(const char *zFormat
, ...){
298 if( iotrace
==0 ) return;
299 va_start(ap
, zFormat
);
300 z
= sqlite3_vmprintf(zFormat
, ap
);
302 fprintf(iotrace
, "%s", z
);
309 ** Determines if a string is a number of not.
311 static int isNumber(const char *z
, int *realnum
){
312 if( *z
=='-' || *z
=='+' ) z
++;
317 if( realnum
) *realnum
= 0;
318 while( IsDigit(*z
) ){ z
++; }
321 if( !IsDigit(*z
) ) return 0;
322 while( IsDigit(*z
) ){ z
++; }
323 if( realnum
) *realnum
= 1;
325 if( *z
=='e' || *z
=='E' ){
327 if( *z
=='+' || *z
=='-' ) z
++;
328 if( !IsDigit(*z
) ) return 0;
329 while( IsDigit(*z
) ){ z
++; }
330 if( realnum
) *realnum
= 1;
336 ** A global char* and an SQL function to access its current value
337 ** from within an SQL statement. This program used to use the
338 ** sqlite_exec_printf() API to substitue a string into an SQL statement.
339 ** The correct way to do this with sqlite3 is to use the bind API, but
340 ** since the shell is built around the callback paradigm it would be a lot
341 ** of work. Instead just use this hack, which is quite harmless.
343 static const char *zShellStatic
= 0;
344 static void shellstaticFunc(
345 sqlite3_context
*context
,
350 assert( zShellStatic
);
351 UNUSED_PARAMETER(argc
);
352 UNUSED_PARAMETER(argv
);
353 sqlite3_result_text(context
, zShellStatic
, -1, SQLITE_STATIC
);
358 ** This routine reads a line of text from FILE in, stores
359 ** the text in memory obtained from malloc() and returns a pointer
360 ** to the text. NULL is returned at end of file, or if malloc()
363 ** If zLine is not NULL then it is a malloced buffer returned from
364 ** a previous call to this routine that may be reused.
366 static char *local_getline(char *zLine
, FILE *in
){
367 int nLine
= zLine
==0 ? 0 : 100;
372 nLine
= nLine
*2 + 100;
373 zLine
= realloc(zLine
, nLine
);
374 if( zLine
==0 ) return 0;
376 if( fgets(&zLine
[n
], nLine
- n
, in
)==0 ){
384 while( zLine
[n
] ) n
++;
385 if( n
>0 && zLine
[n
-1]=='\n' ){
387 if( n
>0 && zLine
[n
-1]=='\r' ) n
--;
396 ** Retrieve a single line of input text.
398 ** If in==0 then read from standard input and prompt before each line.
399 ** If isContinuation is true, then a continuation prompt is appropriate.
400 ** If isContinuation is zero, then the main prompt should be used.
402 ** If zPrior is not NULL then it is a buffer from a prior call to this
403 ** routine that can be reused.
405 ** The result is stored in space obtained from malloc() and must either
406 ** be freed by the caller or else passed back into this routine via the
407 ** zPrior argument for reuse.
409 static char *one_input_line(FILE *in
, char *zPrior
, int isContinuation
){
413 zResult
= local_getline(zPrior
, in
);
415 zPrompt
= isContinuation
? continuePrompt
: mainPrompt
;
416 #if defined(HAVE_READLINE) && HAVE_READLINE==1
418 zResult
= readline(zPrompt
);
419 if( zResult
&& *zResult
) add_history(zResult
);
421 printf("%s", zPrompt
);
423 zResult
= local_getline(zPrior
, stdin
);
429 struct previous_mode_data
{
430 int valid
; /* Is there legit data in here? */
437 ** An pointer to an instance of this structure is passed from
438 ** the main program to the callback. This is used to communicate
439 ** state and mode information.
441 struct callback_data
{
442 sqlite3
*db
; /* The database */
443 int echoOn
; /* True to echo input commands */
444 int statsOn
; /* True to display memory stats before each finalize */
445 int cnt
; /* Number of records displayed so far */
446 FILE *out
; /* Write results here */
447 FILE *traceOut
; /* Output for sqlite3_trace() */
448 int nErr
; /* Number of errors seen */
449 int mode
; /* An output mode setting */
450 int writableSchema
; /* True if PRAGMA writable_schema=ON */
451 int showHeader
; /* True to show column names in List or Column mode */
452 char *zDestTable
; /* Name of destination table when MODE_Insert */
453 char separator
[20]; /* Separator character for MODE_List */
454 int colWidth
[100]; /* Requested width of each column when in column mode*/
455 int actualWidth
[100]; /* Actual width of each column */
456 char nullvalue
[20]; /* The text to print when a NULL comes back from
458 struct previous_mode_data explainPrev
;
459 /* Holds the mode information just before
461 char outfile
[FILENAME_MAX
]; /* Filename for *out */
462 const char *zDbFilename
; /* name of the database file */
463 char *zFreeOnClose
; /* Filename to free when closing */
464 const char *zVfs
; /* Name of VFS to use */
465 sqlite3_stmt
*pStmt
; /* Current statement if any. */
466 FILE *pLog
; /* Write log output here */
467 int *aiIndent
; /* Array of indents used in MODE_Explain */
468 int nIndent
; /* Size of array aiIndent[] */
469 int iIndent
; /* Index of current op in aiIndent[] */
473 ** These are the allowed modes.
475 #define MODE_Line 0 /* One column per line. Blank line between records */
476 #define MODE_Column 1 /* One record per line in neat columns */
477 #define MODE_List 2 /* One record per line with a separator */
478 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
479 #define MODE_Html 4 /* Generate an XHTML table */
480 #define MODE_Insert 5 /* Generate SQL "insert" statements */
481 #define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
482 #define MODE_Csv 7 /* Quote strings, numbers are plain */
483 #define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
485 static const char *modeDescr
[] = {
498 ** Number of elements in an array
500 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
503 ** Compute a string length that is limited to what can be stored in
504 ** lower 30 bits of a 32-bit signed integer.
506 static int strlen30(const char *z
){
508 while( *z2
){ z2
++; }
509 return 0x3fffffff & (int)(z2
- z
);
513 ** A callback for the sqlite3_log() interface.
515 static void shellLog(void *pArg
, int iErrCode
, const char *zMsg
){
516 struct callback_data
*p
= (struct callback_data
*)pArg
;
517 if( p
->pLog
==0 ) return;
518 fprintf(p
->pLog
, "(%d) %s\n", iErrCode
, zMsg
);
523 ** Output the given string as a hex-encoded blob (eg. X'1234' )
525 static void output_hex_blob(FILE *out
, const void *pBlob
, int nBlob
){
527 char *zBlob
= (char *)pBlob
;
529 for(i
=0; i
<nBlob
; i
++){ fprintf(out
,"%02x",zBlob
[i
]&0xff); }
534 ** Output the given string as a quoted string using SQL quoting conventions.
536 static void output_quoted_string(FILE *out
, const char *z
){
540 if( z
[i
]=='\'' ) nSingle
++;
543 fprintf(out
,"'%s'",z
);
547 for(i
=0; z
[i
] && z
[i
]!='\''; i
++){}
551 }else if( z
[i
]=='\'' ){
552 fprintf(out
,"%.*s''",i
,z
);
564 ** Output the given string as a quoted according to C or TCL quoting rules.
566 static void output_c_string(FILE *out
, const char *z
){
569 while( (c
= *(z
++))!=0 ){
585 }else if( !isprint(c
&0xff) ){
586 fprintf(out
, "\\%03o", c
&0xff);
595 ** Output the given string with characters that are special to
598 static void output_html_string(FILE *out
, const char *z
){
610 fprintf(out
,"%.*s",i
,z
);
614 }else if( z
[i
]=='&' ){
615 fprintf(out
,"&");
616 }else if( z
[i
]=='>' ){
618 }else if( z
[i
]=='\"' ){
619 fprintf(out
,""");
620 }else if( z
[i
]=='\'' ){
621 fprintf(out
,"'");
630 ** If a field contains any character identified by a 1 in the following
631 ** array, then the string must be quoted for CSV.
633 static const char needCsvQuote
[] = {
634 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
635 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
636 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 ** Output a single term of CSV. Actually, p->separator is used for
654 ** the separator, which may or may not be a comma. p->nullvalue is
655 ** the null value. Strings are quoted if necessary.
657 static void output_csv(struct callback_data
*p
, const char *z
, int bSep
){
660 fprintf(out
,"%s",p
->nullvalue
);
663 int nSep
= strlen30(p
->separator
);
665 if( needCsvQuote
[((unsigned char*)z
)[i
]]
666 || (z
[i
]==p
->separator
[0] &&
667 (nSep
==1 || memcmp(z
, p
->separator
, nSep
)==0)) ){
675 if( z
[i
]=='"' ) putc('"', out
);
680 fprintf(out
, "%s", z
);
684 fprintf(p
->out
, "%s", p
->separator
);
690 ** This routine runs when the user presses Ctrl-C
692 static void interrupt_handler(int NotUsed
){
693 UNUSED_PARAMETER(NotUsed
);
695 if( db
) sqlite3_interrupt(db
);
700 ** This is the callback routine that the shell
701 ** invokes for each row of a query result.
703 static int shell_callback(void *pArg
, int nArg
, char **azArg
, char **azCol
, int *aiType
){
705 struct callback_data
*p
= (struct callback_data
*)pArg
;
710 if( azArg
==0 ) break;
711 for(i
=0; i
<nArg
; i
++){
712 int len
= strlen30(azCol
[i
] ? azCol
[i
] : "");
715 if( p
->cnt
++>0 ) fprintf(p
->out
,"\n");
716 for(i
=0; i
<nArg
; i
++){
717 fprintf(p
->out
,"%*s = %s\n", w
, azCol
[i
],
718 azArg
[i
] ? azArg
[i
] : p
->nullvalue
);
725 for(i
=0; i
<nArg
; i
++){
727 if( i
<ArraySize(p
->colWidth
) ){
733 w
= strlen30(azCol
[i
] ? azCol
[i
] : "");
735 n
= strlen30(azArg
&& azArg
[i
] ? azArg
[i
] : p
->nullvalue
);
738 if( i
<ArraySize(p
->actualWidth
) ){
739 p
->actualWidth
[i
] = w
;
743 fprintf(p
->out
,"%*.*s%s",-w
,-w
,azCol
[i
], i
==nArg
-1 ? "\n": " ");
745 fprintf(p
->out
,"%-*.*s%s",w
,w
,azCol
[i
], i
==nArg
-1 ? "\n": " ");
750 for(i
=0; i
<nArg
; i
++){
752 if( i
<ArraySize(p
->actualWidth
) ){
753 w
= p
->actualWidth
[i
];
758 fprintf(p
->out
,"%-*.*s%s",w
,w
,"-----------------------------------"
759 "----------------------------------------------------------",
760 i
==nArg
-1 ? "\n": " ");
764 if( azArg
==0 ) break;
765 for(i
=0; i
<nArg
; i
++){
767 if( i
<ArraySize(p
->actualWidth
) ){
768 w
= p
->actualWidth
[i
];
772 if( p
->mode
==MODE_Explain
&& azArg
[i
] && strlen30(azArg
[i
])>w
){
773 w
= strlen30(azArg
[i
]);
775 if( i
==1 && p
->aiIndent
&& p
->pStmt
){
776 if( p
->iIndent
<p
->nIndent
){
777 fprintf(p
->out
, "%*.s", p
->aiIndent
[p
->iIndent
], "");
782 fprintf(p
->out
,"%*.*s%s",-w
,-w
,
783 azArg
[i
] ? azArg
[i
] : p
->nullvalue
, i
==nArg
-1 ? "\n": " ");
785 fprintf(p
->out
,"%-*.*s%s",w
,w
,
786 azArg
[i
] ? azArg
[i
] : p
->nullvalue
, i
==nArg
-1 ? "\n": " ");
793 if( p
->cnt
++==0 && p
->showHeader
){
794 for(i
=0; i
<nArg
; i
++){
795 fprintf(p
->out
,"%s%s",azCol
[i
], i
==nArg
-1 ? "\n" : p
->separator
);
798 if( azArg
==0 ) break;
799 for(i
=0; i
<nArg
; i
++){
801 if( z
==0 ) z
= p
->nullvalue
;
802 fprintf(p
->out
, "%s", z
);
804 fprintf(p
->out
, "%s", p
->separator
);
805 }else if( p
->mode
==MODE_Semi
){
806 fprintf(p
->out
, ";\n");
808 fprintf(p
->out
, "\n");
814 if( p
->cnt
++==0 && p
->showHeader
){
815 fprintf(p
->out
,"<TR>");
816 for(i
=0; i
<nArg
; i
++){
817 fprintf(p
->out
,"<TH>");
818 output_html_string(p
->out
, azCol
[i
]);
819 fprintf(p
->out
,"</TH>\n");
821 fprintf(p
->out
,"</TR>\n");
823 if( azArg
==0 ) break;
824 fprintf(p
->out
,"<TR>");
825 for(i
=0; i
<nArg
; i
++){
826 fprintf(p
->out
,"<TD>");
827 output_html_string(p
->out
, azArg
[i
] ? azArg
[i
] : p
->nullvalue
);
828 fprintf(p
->out
,"</TD>\n");
830 fprintf(p
->out
,"</TR>\n");
834 if( p
->cnt
++==0 && p
->showHeader
){
835 for(i
=0; i
<nArg
; i
++){
836 output_c_string(p
->out
,azCol
[i
] ? azCol
[i
] : "");
837 if(i
<nArg
-1) fprintf(p
->out
, "%s", p
->separator
);
839 fprintf(p
->out
,"\n");
841 if( azArg
==0 ) break;
842 for(i
=0; i
<nArg
; i
++){
843 output_c_string(p
->out
, azArg
[i
] ? azArg
[i
] : p
->nullvalue
);
844 if(i
<nArg
-1) fprintf(p
->out
, "%s", p
->separator
);
846 fprintf(p
->out
,"\n");
850 if( p
->cnt
++==0 && p
->showHeader
){
851 for(i
=0; i
<nArg
; i
++){
852 output_csv(p
, azCol
[i
] ? azCol
[i
] : "", i
<nArg
-1);
854 fprintf(p
->out
,"\n");
856 if( azArg
==0 ) break;
857 for(i
=0; i
<nArg
; i
++){
858 output_csv(p
, azArg
[i
], i
<nArg
-1);
860 fprintf(p
->out
,"\n");
865 if( azArg
==0 ) break;
866 fprintf(p
->out
,"INSERT INTO %s VALUES(",p
->zDestTable
);
867 for(i
=0; i
<nArg
; i
++){
868 char *zSep
= i
>0 ? ",": "";
869 if( (azArg
[i
]==0) || (aiType
&& aiType
[i
]==SQLITE_NULL
) ){
870 fprintf(p
->out
,"%sNULL",zSep
);
871 }else if( aiType
&& aiType
[i
]==SQLITE_TEXT
){
872 if( zSep
[0] ) fprintf(p
->out
,"%s",zSep
);
873 output_quoted_string(p
->out
, azArg
[i
]);
874 }else if( aiType
&& (aiType
[i
]==SQLITE_INTEGER
|| aiType
[i
]==SQLITE_FLOAT
) ){
875 fprintf(p
->out
,"%s%s",zSep
, azArg
[i
]);
876 }else if( aiType
&& aiType
[i
]==SQLITE_BLOB
&& p
->pStmt
){
877 const void *pBlob
= sqlite3_column_blob(p
->pStmt
, i
);
878 int nBlob
= sqlite3_column_bytes(p
->pStmt
, i
);
879 if( zSep
[0] ) fprintf(p
->out
,"%s",zSep
);
880 output_hex_blob(p
->out
, pBlob
, nBlob
);
881 }else if( isNumber(azArg
[i
], 0) ){
882 fprintf(p
->out
,"%s%s",zSep
, azArg
[i
]);
884 if( zSep
[0] ) fprintf(p
->out
,"%s",zSep
);
885 output_quoted_string(p
->out
, azArg
[i
]);
888 fprintf(p
->out
,");\n");
896 ** This is the callback routine that the SQLite library
897 ** invokes for each row of a query result.
899 static int callback(void *pArg
, int nArg
, char **azArg
, char **azCol
){
900 /* since we don't have type info, call the shell_callback with a NULL value */
901 return shell_callback(pArg
, nArg
, azArg
, azCol
, NULL
);
905 ** Set the destination table field of the callback_data structure to
906 ** the name of the table given. Escape any quote characters in the
909 static void set_table_name(struct callback_data
*p
, const char *zName
){
918 if( zName
==0 ) return;
919 needQuote
= !isalpha((unsigned char)*zName
) && *zName
!='_';
920 for(i
=n
=0; zName
[i
]; i
++, n
++){
921 if( !isalnum((unsigned char)zName
[i
]) && zName
[i
]!='_' ){
923 if( zName
[i
]=='\'' ) n
++;
926 if( needQuote
) n
+= 2;
927 z
= p
->zDestTable
= malloc( n
+1 );
929 fprintf(stderr
,"Error: out of memory\n");
933 if( needQuote
) z
[n
++] = '\'';
934 for(i
=0; zName
[i
]; i
++){
936 if( zName
[i
]=='\'' ) z
[n
++] = '\'';
938 if( needQuote
) z
[n
++] = '\'';
942 /* zIn is either a pointer to a NULL-terminated string in memory obtained
943 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
944 ** added to zIn, and the result returned in memory obtained from malloc().
945 ** zIn, if it was not NULL, is freed.
947 ** If the third argument, quote, is not '\0', then it is used as a
948 ** quote character for zAppend.
950 static char *appendText(char *zIn
, char const *zAppend
, char quote
){
953 int nAppend
= strlen30(zAppend
);
954 int nIn
= (zIn
?strlen30(zIn
):0);
959 for(i
=0; i
<nAppend
; i
++){
960 if( zAppend
[i
]==quote
) len
++;
964 zIn
= (char *)realloc(zIn
, len
);
970 char *zCsr
= &zIn
[nIn
];
972 for(i
=0; i
<nAppend
; i
++){
973 *zCsr
++ = zAppend
[i
];
974 if( zAppend
[i
]==quote
) *zCsr
++ = quote
;
978 assert( (zCsr
-zIn
)==len
);
980 memcpy(&zIn
[nIn
], zAppend
, nAppend
);
989 ** Execute a query statement that will generate SQL output. Print
990 ** the result columns, comma-separated, on a line and then add a
991 ** semicolon terminator to the end of that line.
993 ** If the number of columns is 1 and that column contains text "--"
994 ** then write the semicolon on a separate line. That way, if a
995 ** "--" comment occurs at the end of the statement, the comment
996 ** won't consume the semicolon terminator.
998 static int run_table_dump_query(
999 struct callback_data
*p
, /* Query context */
1000 const char *zSelect
, /* SELECT statement to extract content */
1001 const char *zFirstRow
/* Print before first row, if not NULL */
1003 sqlite3_stmt
*pSelect
;
1008 rc
= sqlite3_prepare(p
->db
, zSelect
, -1, &pSelect
, 0);
1009 if( rc
!=SQLITE_OK
|| !pSelect
){
1010 fprintf(p
->out
, "/**** ERROR: (%d) %s *****/\n", rc
, sqlite3_errmsg(p
->db
));
1011 if( (rc
&0xff)!=SQLITE_CORRUPT
) p
->nErr
++;
1014 rc
= sqlite3_step(pSelect
);
1015 nResult
= sqlite3_column_count(pSelect
);
1016 while( rc
==SQLITE_ROW
){
1018 fprintf(p
->out
, "%s", zFirstRow
);
1021 z
= (const char*)sqlite3_column_text(pSelect
, 0);
1022 fprintf(p
->out
, "%s", z
);
1023 for(i
=1; i
<nResult
; i
++){
1024 fprintf(p
->out
, ",%s", sqlite3_column_text(pSelect
, i
));
1027 while( z
[0] && (z
[0]!='-' || z
[1]!='-') ) z
++;
1029 fprintf(p
->out
, "\n;\n");
1031 fprintf(p
->out
, ";\n");
1033 rc
= sqlite3_step(pSelect
);
1035 rc
= sqlite3_finalize(pSelect
);
1036 if( rc
!=SQLITE_OK
){
1037 fprintf(p
->out
, "/**** ERROR: (%d) %s *****/\n", rc
, sqlite3_errmsg(p
->db
));
1038 if( (rc
&0xff)!=SQLITE_CORRUPT
) p
->nErr
++;
1044 ** Allocate space and save off current error string.
1046 static char *save_err_msg(
1047 sqlite3
*db
/* Database to query */
1049 int nErrMsg
= 1+strlen30(sqlite3_errmsg(db
));
1050 char *zErrMsg
= sqlite3_malloc(nErrMsg
);
1052 memcpy(zErrMsg
, sqlite3_errmsg(db
), nErrMsg
);
1058 ** Display memory stats.
1060 static int display_stats(
1061 sqlite3
*db
, /* Database to query */
1062 struct callback_data
*pArg
, /* Pointer to struct callback_data */
1063 int bReset
/* True to reset the stats */
1068 if( pArg
&& pArg
->out
){
1071 sqlite3_status(SQLITE_STATUS_MEMORY_USED
, &iCur
, &iHiwtr
, bReset
);
1072 fprintf(pArg
->out
, "Memory Used: %d (max %d) bytes\n", iCur
, iHiwtr
);
1074 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT
, &iCur
, &iHiwtr
, bReset
);
1075 fprintf(pArg
->out
, "Number of Outstanding Allocations: %d (max %d)\n", iCur
, iHiwtr
);
1077 ** Not currently used by the CLI.
1078 ** iHiwtr = iCur = -1;
1079 ** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1080 ** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1083 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW
, &iCur
, &iHiwtr
, bReset
);
1084 fprintf(pArg
->out
, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur
, iHiwtr
);
1086 ** Not currently used by the CLI.
1087 ** iHiwtr = iCur = -1;
1088 ** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1089 ** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1092 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW
, &iCur
, &iHiwtr
, bReset
);
1093 fprintf(pArg
->out
, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur
, iHiwtr
);
1095 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE
, &iCur
, &iHiwtr
, bReset
);
1096 fprintf(pArg
->out
, "Largest Allocation: %d bytes\n", iHiwtr
);
1098 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE
, &iCur
, &iHiwtr
, bReset
);
1099 fprintf(pArg
->out
, "Largest Pcache Allocation: %d bytes\n", iHiwtr
);
1101 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE
, &iCur
, &iHiwtr
, bReset
);
1102 fprintf(pArg
->out
, "Largest Scratch Allocation: %d bytes\n", iHiwtr
);
1103 #ifdef YYTRACKMAXSTACKDEPTH
1105 sqlite3_status(SQLITE_STATUS_PARSER_STACK
, &iCur
, &iHiwtr
, bReset
);
1106 fprintf(pArg
->out
, "Deepest Parser Stack: %d (max %d)\n", iCur
, iHiwtr
);
1110 if( pArg
&& pArg
->out
&& db
){
1112 sqlite3_db_status(db
, SQLITE_DBSTATUS_LOOKASIDE_USED
, &iCur
, &iHiwtr
, bReset
);
1113 fprintf(pArg
->out
, "Lookaside Slots Used: %d (max %d)\n", iCur
, iHiwtr
);
1114 sqlite3_db_status(db
, SQLITE_DBSTATUS_LOOKASIDE_HIT
, &iCur
, &iHiwtr
, bReset
);
1115 fprintf(pArg
->out
, "Successful lookaside attempts: %d\n", iHiwtr
);
1116 sqlite3_db_status(db
, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
, &iCur
, &iHiwtr
, bReset
);
1117 fprintf(pArg
->out
, "Lookaside failures due to size: %d\n", iHiwtr
);
1118 sqlite3_db_status(db
, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
, &iCur
, &iHiwtr
, bReset
);
1119 fprintf(pArg
->out
, "Lookaside failures due to OOM: %d\n", iHiwtr
);
1121 sqlite3_db_status(db
, SQLITE_DBSTATUS_CACHE_USED
, &iCur
, &iHiwtr
, bReset
);
1122 fprintf(pArg
->out
, "Pager Heap Usage: %d bytes\n", iCur
); iHiwtr
= iCur
= -1;
1123 sqlite3_db_status(db
, SQLITE_DBSTATUS_CACHE_HIT
, &iCur
, &iHiwtr
, 1);
1124 fprintf(pArg
->out
, "Page cache hits: %d\n", iCur
);
1126 sqlite3_db_status(db
, SQLITE_DBSTATUS_CACHE_MISS
, &iCur
, &iHiwtr
, 1);
1127 fprintf(pArg
->out
, "Page cache misses: %d\n", iCur
);
1129 sqlite3_db_status(db
, SQLITE_DBSTATUS_CACHE_WRITE
, &iCur
, &iHiwtr
, 1);
1130 fprintf(pArg
->out
, "Page cache writes: %d\n", iCur
);
1132 sqlite3_db_status(db
, SQLITE_DBSTATUS_SCHEMA_USED
, &iCur
, &iHiwtr
, bReset
);
1133 fprintf(pArg
->out
, "Schema Heap Usage: %d bytes\n", iCur
);
1135 sqlite3_db_status(db
, SQLITE_DBSTATUS_STMT_USED
, &iCur
, &iHiwtr
, bReset
);
1136 fprintf(pArg
->out
, "Statement Heap/Lookaside Usage: %d bytes\n", iCur
);
1139 if( pArg
&& pArg
->out
&& db
&& pArg
->pStmt
){
1140 iCur
= sqlite3_stmt_status(pArg
->pStmt
, SQLITE_STMTSTATUS_FULLSCAN_STEP
, bReset
);
1141 fprintf(pArg
->out
, "Fullscan Steps: %d\n", iCur
);
1142 iCur
= sqlite3_stmt_status(pArg
->pStmt
, SQLITE_STMTSTATUS_SORT
, bReset
);
1143 fprintf(pArg
->out
, "Sort Operations: %d\n", iCur
);
1144 iCur
= sqlite3_stmt_status(pArg
->pStmt
, SQLITE_STMTSTATUS_AUTOINDEX
, bReset
);
1145 fprintf(pArg
->out
, "Autoindex Inserts: %d\n", iCur
);
1146 iCur
= sqlite3_stmt_status(pArg
->pStmt
, SQLITE_STMTSTATUS_VM_STEP
, bReset
);
1147 fprintf(pArg
->out
, "Virtual Machine Steps: %d\n", iCur
);
1154 ** Parameter azArray points to a zero-terminated array of strings. zStr
1155 ** points to a single nul-terminated string. Return non-zero if zStr
1156 ** is equal, according to strcmp(), to any of the strings in the array.
1157 ** Otherwise, return zero.
1159 static int str_in_array(const char *zStr
, const char **azArray
){
1161 for(i
=0; azArray
[i
]; i
++){
1162 if( 0==strcmp(zStr
, azArray
[i
]) ) return 1;
1168 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1169 ** and populate the callback_data.aiIndent[] array with the number of
1170 ** spaces each opcode should be indented before it is output.
1172 ** The indenting rules are:
1174 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1175 ** all opcodes that occur between the p2 jump destination and the opcode
1176 ** itself by 2 spaces.
1178 ** * For each "Goto", if the jump destination is earlier in the program
1179 ** and ends on one of:
1180 ** Yield SeekGt SeekLt RowSetRead Rewind
1181 ** then indent all opcodes between the earlier instruction
1182 ** and "Goto" by 2 spaces.
1184 static void explain_data_prepare(struct callback_data
*p
, sqlite3_stmt
*pSql
){
1185 const char *zSql
; /* The text of the SQL statement */
1186 const char *z
; /* Used to check if this is an EXPLAIN */
1187 int *abYield
= 0; /* True if op is an OP_Yield */
1188 int nAlloc
= 0; /* Allocated size of p->aiIndent[], abYield */
1189 int iOp
; /* Index of operation in p->aiIndent[] */
1191 const char *azNext
[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
1192 const char *azYield
[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
1193 const char *azGoto
[] = { "Goto", 0 };
1195 /* Try to figure out if this is really an EXPLAIN statement. If this
1196 ** cannot be verified, return early. */
1197 zSql
= sqlite3_sql(pSql
);
1198 if( zSql
==0 ) return;
1199 for(z
=zSql
; *z
==' ' || *z
=='\t' || *z
=='\n' || *z
=='\f' || *z
=='\r'; z
++);
1200 if( sqlite3_strnicmp(z
, "explain", 7) ) return;
1202 for(iOp
=0; SQLITE_ROW
==sqlite3_step(pSql
); iOp
++){
1204 int iAddr
= sqlite3_column_int(pSql
, 0);
1205 const char *zOp
= (const char*)sqlite3_column_text(pSql
, 1);
1207 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1208 ** p2 is an instruction address, set variable p2op to the index of that
1209 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1210 ** the current instruction is part of a sub-program generated by an
1211 ** SQL trigger or foreign key. */
1212 int p2
= sqlite3_column_int(pSql
, 3);
1213 int p2op
= (p2
+ (iOp
-iAddr
));
1215 /* Grow the p->aiIndent array as required */
1218 p
->aiIndent
= (int*)sqlite3_realloc(p
->aiIndent
, nAlloc
*sizeof(int));
1219 abYield
= (int*)sqlite3_realloc(abYield
, nAlloc
*sizeof(int));
1221 abYield
[iOp
] = str_in_array(zOp
, azYield
);
1222 p
->aiIndent
[iOp
] = 0;
1225 if( str_in_array(zOp
, azNext
) ){
1226 for(i
=p2op
; i
<iOp
; i
++) p
->aiIndent
[i
] += 2;
1228 if( str_in_array(zOp
, azGoto
) && p2op
<p
->nIndent
&& abYield
[p2op
] ){
1229 for(i
=p2op
+1; i
<iOp
; i
++) p
->aiIndent
[i
] += 2;
1234 sqlite3_free(abYield
);
1235 sqlite3_reset(pSql
);
1239 ** Free the array allocated by explain_data_prepare().
1241 static void explain_data_delete(struct callback_data
*p
){
1242 sqlite3_free(p
->aiIndent
);
1249 ** Execute a statement or set of statements. Print
1250 ** any result rows/columns depending on the current mode
1251 ** set via the supplied callback.
1253 ** This is very similar to SQLite's built-in sqlite3_exec()
1254 ** function except it takes a slightly different callback
1255 ** and callback data argument.
1257 static int shell_exec(
1258 sqlite3
*db
, /* An open database */
1259 const char *zSql
, /* SQL to be evaluated */
1260 int (*xCallback
)(void*,int,char**,char**,int*), /* Callback function */
1261 /* (not the same as sqlite3_exec) */
1262 struct callback_data
*pArg
, /* Pointer to struct callback_data */
1263 char **pzErrMsg
/* Error msg written here */
1265 sqlite3_stmt
*pStmt
= NULL
; /* Statement to execute. */
1266 int rc
= SQLITE_OK
; /* Return Code */
1268 const char *zLeftover
; /* Tail of unprocessed SQL */
1274 while( zSql
[0] && (SQLITE_OK
== rc
) ){
1275 rc
= sqlite3_prepare_v2(db
, zSql
, -1, &pStmt
, &zLeftover
);
1276 if( SQLITE_OK
!= rc
){
1278 *pzErrMsg
= save_err_msg(db
);
1282 /* this happens for a comment or white-space */
1284 while( IsSpace(zSql
[0]) ) zSql
++;
1288 /* save off the prepared statment handle and reset row count */
1290 pArg
->pStmt
= pStmt
;
1294 /* echo the sql statement if echo on */
1295 if( pArg
&& pArg
->echoOn
){
1296 const char *zStmtSql
= sqlite3_sql(pStmt
);
1297 fprintf(pArg
->out
, "%s\n", zStmtSql
? zStmtSql
: zSql
);
1300 /* Output TESTCTRL_EXPLAIN text of requested */
1301 if( pArg
&& pArg
->mode
==MODE_Explain
){
1302 const char *zExplain
= 0;
1303 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT
, pStmt
, &zExplain
);
1304 if( zExplain
&& zExplain
[0] ){
1305 fprintf(pArg
->out
, "%s", zExplain
);
1309 /* If the shell is currently in ".explain" mode, gather the extra
1310 ** data required to add indents to the output.*/
1311 if( pArg
&& pArg
->mode
==MODE_Explain
){
1312 explain_data_prepare(pArg
, pStmt
);
1315 /* perform the first step. this will tell us if we
1316 ** have a result set or not and how wide it is.
1318 rc
= sqlite3_step(pStmt
);
1319 /* if we have a result set... */
1320 if( SQLITE_ROW
== rc
){
1321 /* if we have a callback... */
1323 /* allocate space for col name ptr, value ptr, and type */
1324 int nCol
= sqlite3_column_count(pStmt
);
1325 void *pData
= sqlite3_malloc(3*nCol
*sizeof(const char*) + 1);
1329 char **azCols
= (char **)pData
; /* Names of result columns */
1330 char **azVals
= &azCols
[nCol
]; /* Results */
1331 int *aiTypes
= (int *)&azVals
[nCol
]; /* Result types */
1333 assert(sizeof(int) <= sizeof(char *));
1334 /* save off ptrs to column names */
1335 for(i
=0; i
<nCol
; i
++){
1336 azCols
[i
] = (char *)sqlite3_column_name(pStmt
, i
);
1339 /* extract the data and data types */
1340 for(i
=0; i
<nCol
; i
++){
1341 aiTypes
[i
] = x
= sqlite3_column_type(pStmt
, i
);
1342 if( x
==SQLITE_BLOB
&& pArg
&& pArg
->mode
==MODE_Insert
){
1345 azVals
[i
] = (char*)sqlite3_column_text(pStmt
, i
);
1347 if( !azVals
[i
] && (aiTypes
[i
]!=SQLITE_NULL
) ){
1349 break; /* from for */
1353 /* if data and types extracted successfully... */
1354 if( SQLITE_ROW
== rc
){
1355 /* call the supplied callback with the result row data */
1356 if( xCallback(pArg
, nCol
, azVals
, azCols
, aiTypes
) ){
1359 rc
= sqlite3_step(pStmt
);
1362 } while( SQLITE_ROW
== rc
);
1363 sqlite3_free(pData
);
1367 rc
= sqlite3_step(pStmt
);
1368 } while( rc
== SQLITE_ROW
);
1372 explain_data_delete(pArg
);
1374 /* print usage stats if stats on */
1375 if( pArg
&& pArg
->statsOn
){
1376 display_stats(db
, pArg
, 0);
1379 /* Finalize the statement just executed. If this fails, save a
1380 ** copy of the error message. Otherwise, set zSql to point to the
1381 ** next statement to execute. */
1382 rc2
= sqlite3_finalize(pStmt
);
1383 if( rc
!=SQLITE_NOMEM
) rc
= rc2
;
1384 if( rc
==SQLITE_OK
){
1386 while( IsSpace(zSql
[0]) ) zSql
++;
1387 }else if( pzErrMsg
){
1388 *pzErrMsg
= save_err_msg(db
);
1391 /* clear saved stmt handle */
1403 ** This is a different callback routine used for dumping the database.
1404 ** Each row received by this callback consists of a table name,
1405 ** the table type ("index" or "table") and SQL to create the table.
1406 ** This routine should print text sufficient to recreate the table.
1408 static int dump_callback(void *pArg
, int nArg
, char **azArg
, char **azCol
){
1413 const char *zPrepStmt
= 0;
1414 struct callback_data
*p
= (struct callback_data
*)pArg
;
1416 UNUSED_PARAMETER(azCol
);
1417 if( nArg
!=3 ) return 1;
1422 if( strcmp(zTable
, "sqlite_sequence")==0 ){
1423 zPrepStmt
= "DELETE FROM sqlite_sequence;\n";
1424 }else if( sqlite3_strglob("sqlite_stat?", zTable
)==0 ){
1425 fprintf(p
->out
, "ANALYZE sqlite_master;\n");
1426 }else if( strncmp(zTable
, "sqlite_", 7)==0 ){
1428 }else if( strncmp(zSql
, "CREATE VIRTUAL TABLE", 20)==0 ){
1430 if( !p
->writableSchema
){
1431 fprintf(p
->out
, "PRAGMA writable_schema=ON;\n");
1432 p
->writableSchema
= 1;
1434 zIns
= sqlite3_mprintf(
1435 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1436 "VALUES('table','%q','%q',0,'%q');",
1437 zTable
, zTable
, zSql
);
1438 fprintf(p
->out
, "%s\n", zIns
);
1442 fprintf(p
->out
, "%s;\n", zSql
);
1445 if( strcmp(zType
, "table")==0 ){
1446 sqlite3_stmt
*pTableInfo
= 0;
1448 char *zTableInfo
= 0;
1452 zTableInfo
= appendText(zTableInfo
, "PRAGMA table_info(", 0);
1453 zTableInfo
= appendText(zTableInfo
, zTable
, '"');
1454 zTableInfo
= appendText(zTableInfo
, ");", 0);
1456 rc
= sqlite3_prepare(p
->db
, zTableInfo
, -1, &pTableInfo
, 0);
1458 if( rc
!=SQLITE_OK
|| !pTableInfo
){
1462 zSelect
= appendText(zSelect
, "SELECT 'INSERT INTO ' || ", 0);
1463 /* Always quote the table name, even if it appears to be pure ascii,
1464 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1465 zTmp
= appendText(zTmp
, zTable
, '"');
1467 zSelect
= appendText(zSelect
, zTmp
, '\'');
1470 zSelect
= appendText(zSelect
, " || ' VALUES(' || ", 0);
1471 rc
= sqlite3_step(pTableInfo
);
1472 while( rc
==SQLITE_ROW
){
1473 const char *zText
= (const char *)sqlite3_column_text(pTableInfo
, 1);
1474 zSelect
= appendText(zSelect
, "quote(", 0);
1475 zSelect
= appendText(zSelect
, zText
, '"');
1476 rc
= sqlite3_step(pTableInfo
);
1477 if( rc
==SQLITE_ROW
){
1478 zSelect
= appendText(zSelect
, "), ", 0);
1480 zSelect
= appendText(zSelect
, ") ", 0);
1484 rc
= sqlite3_finalize(pTableInfo
);
1485 if( rc
!=SQLITE_OK
|| nRow
==0 ){
1489 zSelect
= appendText(zSelect
, "|| ')' FROM ", 0);
1490 zSelect
= appendText(zSelect
, zTable
, '"');
1492 rc
= run_table_dump_query(p
, zSelect
, zPrepStmt
);
1493 if( rc
==SQLITE_CORRUPT
){
1494 zSelect
= appendText(zSelect
, " ORDER BY rowid DESC", 0);
1495 run_table_dump_query(p
, zSelect
, 0);
1503 ** Run zQuery. Use dump_callback() as the callback routine so that
1504 ** the contents of the query are output as SQL statements.
1506 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
1507 ** "ORDER BY rowid DESC" to the end.
1509 static int run_schema_dump_query(
1510 struct callback_data
*p
,
1515 rc
= sqlite3_exec(p
->db
, zQuery
, dump_callback
, p
, &zErr
);
1516 if( rc
==SQLITE_CORRUPT
){
1518 int len
= strlen30(zQuery
);
1519 fprintf(p
->out
, "/****** CORRUPTION ERROR *******/\n");
1521 fprintf(p
->out
, "/****** %s ******/\n", zErr
);
1525 zQ2
= malloc( len
+100 );
1526 if( zQ2
==0 ) return rc
;
1527 sqlite3_snprintf(len
+100, zQ2
, "%s ORDER BY rowid DESC", zQuery
);
1528 rc
= sqlite3_exec(p
->db
, zQ2
, dump_callback
, p
, &zErr
);
1530 fprintf(p
->out
, "/****** ERROR: %s ******/\n", zErr
);
1532 rc
= SQLITE_CORRUPT
;
1541 ** Text of a help message
1543 static char zHelp
[] =
1544 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
1545 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
1546 ".databases List names and files of attached databases\n"
1547 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
1548 " If TABLE specified, only dump tables matching\n"
1549 " LIKE pattern TABLE.\n"
1550 ".echo ON|OFF Turn command echo on or off\n"
1551 ".exit Exit this program\n"
1552 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1553 " With no args, it turns EXPLAIN on.\n"
1554 ".header(s) ON|OFF Turn display of headers on or off\n"
1555 ".help Show this message\n"
1556 ".import FILE TABLE Import data from FILE into TABLE\n"
1557 ".indices ?TABLE? Show names of all indices\n"
1558 " If TABLE specified, only show indices for tables\n"
1559 " matching LIKE pattern TABLE.\n"
1560 #ifdef SQLITE_ENABLE_IOTRACE
1561 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1563 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1564 ".load FILE ?ENTRY? Load an extension library\n"
1566 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
1567 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
1568 " csv Comma-separated values\n"
1569 " column Left-aligned columns. (See .width)\n"
1570 " html HTML <table> code\n"
1571 " insert SQL insert statements for TABLE\n"
1572 " line One value per line\n"
1573 " list Values delimited by .separator string\n"
1574 " tabs Tab-separated values\n"
1575 " tcl TCL list elements\n"
1576 ".nullvalue STRING Use STRING in place of NULL values\n"
1577 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
1578 ".output FILENAME Send output to FILENAME\n"
1579 ".output stdout Send output to the screen\n"
1580 ".print STRING... Print literal STRING\n"
1581 ".prompt MAIN CONTINUE Replace the standard prompts\n"
1582 ".quit Exit this program\n"
1583 ".read FILENAME Execute SQL in FILENAME\n"
1584 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
1585 ".schema ?TABLE? Show the CREATE statements\n"
1586 " If TABLE specified, only show tables matching\n"
1587 " LIKE pattern TABLE.\n"
1588 ".separator STRING Change separator used by output mode and .import\n"
1589 ".show Show the current values for various settings\n"
1590 ".stats ON|OFF Turn stats on or off\n"
1591 ".tables ?TABLE? List names of tables\n"
1592 " If TABLE specified, only list tables matching\n"
1593 " LIKE pattern TABLE.\n"
1594 ".timeout MS Try opening locked tables for MS milliseconds\n"
1595 ".trace FILE|off Output each SQL statement as it is run\n"
1596 ".vfsname ?AUX? Print the name of the VFS stack\n"
1597 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
1600 static char zTimerHelp
[] =
1601 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1604 /* Forward reference */
1605 static int process_input(struct callback_data
*p
, FILE *in
);
1608 ** Make sure the database is open. If it is not, then open it. If
1609 ** the database fails to open, print an error message and exit.
1611 static void open_db(struct callback_data
*p
, int keepAlive
){
1613 sqlite3_initialize();
1614 sqlite3_open(p
->zDbFilename
, &p
->db
);
1616 if( db
&& sqlite3_errcode(db
)==SQLITE_OK
){
1617 sqlite3_create_function(db
, "shellstatic", 0, SQLITE_UTF8
, 0,
1618 shellstaticFunc
, 0, 0);
1620 if( db
==0 || SQLITE_OK
!=sqlite3_errcode(db
) ){
1621 fprintf(stderr
,"Error: unable to open database \"%s\": %s\n",
1622 p
->zDbFilename
, sqlite3_errmsg(db
));
1623 if( keepAlive
) return;
1626 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1627 sqlite3_enable_load_extension(p
->db
, 1);
1633 ** Do C-language style dequoting.
1637 ** \r -> carriage return
1639 ** \NNN -> ascii character NNN in octal
1642 static void resolve_backslashes(char *z
){
1645 for(i
=j
=0; (c
= z
[i
])!=0; i
++, j
++){
1654 }else if( c
=='\\' ){
1656 }else if( c
>='0' && c
<='7' ){
1658 if( z
[i
+1]>='0' && z
[i
+1]<='7' ){
1660 c
= (c
<<3) + z
[i
] - '0';
1661 if( z
[i
+1]>='0' && z
[i
+1]<='7' ){
1663 c
= (c
<<3) + z
[i
] - '0';
1674 ** Return the value of a hexadecimal digit. Return -1 if the input
1675 ** is not a hex digit.
1677 static int hexDigitValue(char c
){
1678 if( c
>='0' && c
<='9' ) return c
- '0';
1679 if( c
>='a' && c
<='f' ) return c
- 'a' + 10;
1680 if( c
>='A' && c
<='F' ) return c
- 'A' + 10;
1685 ** Interpret zArg as an integer value, possibly with suffixes.
1687 static sqlite3_int64
integerValue(const char *zArg
){
1688 sqlite3_int64 v
= 0;
1689 static const struct { char *zSuffix
; int iMult
; } aMult
[] = {
1691 { "MiB", 1024*1024 },
1692 { "GiB", 1024*1024*1024 },
1695 { "GB", 1000000000 },
1698 { "G", 1000000000 },
1705 }else if( zArg
[0]=='+' ){
1708 if( zArg
[0]=='0' && zArg
[1]=='x' ){
1711 while( (x
= hexDigitValue(zArg
[0]))>=0 ){
1716 while( IsDigit(zArg
[0]) ){
1717 v
= v
*10 + zArg
[0] - '0';
1721 for(i
=0; i
<ArraySize(aMult
); i
++){
1722 if( sqlite3_stricmp(aMult
[i
].zSuffix
, zArg
)==0 ){
1723 v
*= aMult
[i
].iMult
;
1727 return isNeg
? -v
: v
;
1731 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1732 ** for TRUE and FALSE. Return the integer value if appropriate.
1734 static int booleanValue(char *zArg
){
1736 if( zArg
[0]=='0' && zArg
[1]=='x' ){
1737 for(i
=2; hexDigitValue(zArg
[i
])>=0; i
++){}
1739 for(i
=0; zArg
[i
]>='0' && zArg
[i
]<='9'; i
++){}
1741 if( i
>0 && zArg
[i
]==0 ) return (int)(integerValue(zArg
) & 0xffffffff);
1742 if( sqlite3_stricmp(zArg
, "on")==0 || sqlite3_stricmp(zArg
,"yes")==0 ){
1745 if( sqlite3_stricmp(zArg
, "off")==0 || sqlite3_stricmp(zArg
,"no")==0 ){
1748 fprintf(stderr
, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1754 ** Close an output file, assuming it is not stderr or stdout
1756 static void output_file_close(FILE *f
){
1757 if( f
&& f
!=stdout
&& f
!=stderr
) fclose(f
);
1761 ** Try to open an output file. The names "stdout" and "stderr" are
1762 ** recognized and do the right thing. NULL is returned if the output
1763 ** filename is "off".
1765 static FILE *output_file_open(const char *zFile
){
1767 if( strcmp(zFile
,"stdout")==0 ){
1769 }else if( strcmp(zFile
, "stderr")==0 ){
1771 }else if( strcmp(zFile
, "off")==0 ){
1774 f
= fopen(zFile
, "wb");
1776 fprintf(stderr
, "Error: cannot open \"%s\"\n", zFile
);
1783 ** A routine for handling output from sqlite3_trace().
1785 static void sql_trace_callback(void *pArg
, const char *z
){
1786 FILE *f
= (FILE*)pArg
;
1787 if( f
) fprintf(f
, "%s\n", z
);
1791 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
1792 ** a useful spot to set a debugger breakpoint.
1794 static void test_breakpoint(void){
1795 static int nCall
= 0;
1800 ** An object used to read a CSV file
1802 typedef struct CSVReader CSVReader
;
1804 const char *zFile
; /* Name of the input file */
1805 FILE *in
; /* Read the CSV text from this input stream */
1806 char *z
; /* Accumulated text for a field */
1807 int n
; /* Number of bytes in z */
1808 int nAlloc
; /* Space allocated for z[] */
1809 int nLine
; /* Current line number */
1810 int cTerm
; /* Character that terminated the most recent field */
1811 int cSeparator
; /* The separator character. (Usually ",") */
1814 /* Append a single byte to z[] */
1815 static void csv_append_char(CSVReader
*p
, int c
){
1816 if( p
->n
+1>=p
->nAlloc
){
1817 p
->nAlloc
+= p
->nAlloc
+ 100;
1818 p
->z
= sqlite3_realloc(p
->z
, p
->nAlloc
);
1820 fprintf(stderr
, "out of memory\n");
1824 p
->z
[p
->n
++] = (char)c
;
1827 /* Read a single field of CSV text. Compatible with rfc4180 and extended
1828 ** with the option of having a separator other than ",".
1830 ** + Input comes from p->in.
1831 ** + Store results in p->z of length p->n. Space to hold p->z comes
1832 ** from sqlite3_malloc().
1833 ** + Use p->cSep as the separator. The default is ",".
1834 ** + Keep track of the line number in p->nLine.
1835 ** + Store the character that terminates the field in p->cTerm. Store
1836 ** EOF on end-of-file.
1837 ** + Report syntax errors on stderr
1839 static char *csv_read_one_field(CSVReader
*p
){
1841 int cSep
= p
->cSeparator
;
1844 if( c
==EOF
|| seenInterrupt
){
1849 int startLine
= p
->nLine
;
1854 if( c
=='\n' ) p
->nLine
++;
1861 if( (c
==cSep
&& pc
==cQuote
)
1862 || (c
=='\n' && pc
==cQuote
)
1863 || (c
=='\n' && pc
=='\r' && ppc
==cQuote
)
1864 || (c
==EOF
&& pc
==cQuote
)
1866 do{ p
->n
--; }while( p
->z
[p
->n
]!=cQuote
);
1870 if( pc
==cQuote
&& c
!='\r' ){
1871 fprintf(stderr
, "%s:%d: unescaped %c character\n",
1872 p
->zFile
, p
->nLine
, cQuote
);
1875 fprintf(stderr
, "%s:%d: unterminated %c-quoted field\n",
1876 p
->zFile
, startLine
, cQuote
);
1880 csv_append_char(p
, c
);
1885 while( c
!=EOF
&& c
!=cSep
&& c
!='\n' ){
1886 csv_append_char(p
, c
);
1891 if( p
->n
>1 && p
->z
[p
->n
-1]=='\r' ) p
->n
--;
1895 if( p
->z
) p
->z
[p
->n
] = 0;
1900 ** If an input line begins with "." then invoke this routine to
1901 ** process that line.
1903 ** Return 1 on error, 2 to exit, and 0 otherwise.
1905 static int do_meta_command(char *zLine
, struct callback_data
*p
){
1912 /* Parse the input line into tokens.
1914 while( zLine
[i
] && nArg
<ArraySize(azArg
) ){
1915 while( IsSpace(zLine
[i
]) ){ i
++; }
1916 if( zLine
[i
]==0 ) break;
1917 if( zLine
[i
]=='\'' || zLine
[i
]=='"' ){
1918 int delim
= zLine
[i
++];
1919 azArg
[nArg
++] = &zLine
[i
];
1920 while( zLine
[i
] && zLine
[i
]!=delim
){
1921 if( zLine
[i
]=='\\' && delim
=='"' && zLine
[i
+1]!=0 ) i
++;
1924 if( zLine
[i
]==delim
){
1927 if( delim
=='"' ) resolve_backslashes(azArg
[nArg
-1]);
1929 azArg
[nArg
++] = &zLine
[i
];
1930 while( zLine
[i
] && !IsSpace(zLine
[i
]) ){ i
++; }
1931 if( zLine
[i
] ) zLine
[i
++] = 0;
1932 resolve_backslashes(azArg
[nArg
-1]);
1936 /* Process the input line.
1938 if( nArg
==0 ) return 0; /* no tokens, no error */
1939 n
= strlen30(azArg
[0]);
1941 if( c
=='b' && n
>=3 && strncmp(azArg
[0], "backup", n
)==0 ){
1942 const char *zDestFile
= 0;
1943 const char *zDb
= 0;
1945 sqlite3_backup
*pBackup
;
1947 for(j
=1; j
<nArg
; j
++){
1948 const char *z
= azArg
[j
];
1950 while( z
[0]=='-' ) z
++;
1951 /* No options to process at this time */
1953 fprintf(stderr
, "unknown option: %s\n", azArg
[j
]);
1956 }else if( zDestFile
==0 ){
1957 zDestFile
= azArg
[j
];
1960 zDestFile
= azArg
[j
];
1962 fprintf(stderr
, "too many arguments to .backup\n");
1967 fprintf(stderr
, "missing FILENAME argument on .backup\n");
1970 if( zDb
==0 ) zDb
= "main";
1971 rc
= sqlite3_open(zDestFile
, &pDest
);
1972 if( rc
!=SQLITE_OK
){
1973 fprintf(stderr
, "Error: cannot open \"%s\"\n", zDestFile
);
1974 sqlite3_close(pDest
);
1978 pBackup
= sqlite3_backup_init(pDest
, "main", p
->db
, zDb
);
1980 fprintf(stderr
, "Error: %s\n", sqlite3_errmsg(pDest
));
1981 sqlite3_close(pDest
);
1984 while( (rc
= sqlite3_backup_step(pBackup
,100))==SQLITE_OK
){}
1985 sqlite3_backup_finish(pBackup
);
1986 if( rc
==SQLITE_DONE
){
1989 fprintf(stderr
, "Error: %s\n", sqlite3_errmsg(pDest
));
1992 sqlite3_close(pDest
);
1995 if( c
=='b' && n
>=3 && strncmp(azArg
[0], "bail", n
)==0 && nArg
>1 && nArg
<3 ){
1996 bail_on_error
= booleanValue(azArg
[1]);
1999 /* The undocumented ".breakpoint" command causes a call to the no-op
2000 ** routine named test_breakpoint().
2002 if( c
=='b' && n
>=3 && strncmp(azArg
[0], "breakpoint", n
)==0 ){
2006 if( c
=='d' && n
>1 && strncmp(azArg
[0], "databases", n
)==0 && nArg
==1 ){
2007 struct callback_data data
;
2010 memcpy(&data
, p
, sizeof(data
));
2011 data
.showHeader
= 1;
2012 data
.mode
= MODE_Column
;
2013 data
.colWidth
[0] = 3;
2014 data
.colWidth
[1] = 15;
2015 data
.colWidth
[2] = 58;
2017 sqlite3_exec(p
->db
, "PRAGMA database_list; ", callback
, &data
, &zErrMsg
);
2019 fprintf(stderr
,"Error: %s\n", zErrMsg
);
2020 sqlite3_free(zErrMsg
);
2025 if( c
=='d' && strncmp(azArg
[0], "dump", n
)==0 && nArg
<3 ){
2027 /* When playing back a "dump", the content might appear in an order
2028 ** which causes immediate foreign key constraints to be violated.
2029 ** So disable foreign-key constraint enforcement to prevent problems. */
2030 fprintf(p
->out
, "PRAGMA foreign_keys=OFF;\n");
2031 fprintf(p
->out
, "BEGIN TRANSACTION;\n");
2032 p
->writableSchema
= 0;
2033 sqlite3_exec(p
->db
, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
2036 run_schema_dump_query(p
,
2037 "SELECT name, type, sql FROM sqlite_master "
2038 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
2040 run_schema_dump_query(p
,
2041 "SELECT name, type, sql FROM sqlite_master "
2042 "WHERE name=='sqlite_sequence'"
2044 run_table_dump_query(p
,
2045 "SELECT sql FROM sqlite_master "
2046 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
2050 for(i
=1; i
<nArg
; i
++){
2051 zShellStatic
= azArg
[i
];
2052 run_schema_dump_query(p
,
2053 "SELECT name, type, sql FROM sqlite_master "
2054 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
2055 " AND sql NOT NULL");
2056 run_table_dump_query(p
,
2057 "SELECT sql FROM sqlite_master "
2058 "WHERE sql NOT NULL"
2059 " AND type IN ('index','trigger','view')"
2060 " AND tbl_name LIKE shellstatic()", 0
2065 if( p
->writableSchema
){
2066 fprintf(p
->out
, "PRAGMA writable_schema=OFF;\n");
2067 p
->writableSchema
= 0;
2069 sqlite3_exec(p
->db
, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2070 sqlite3_exec(p
->db
, "RELEASE dump;", 0, 0, 0);
2071 fprintf(p
->out
, p
->nErr
? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
2074 if( c
=='e' && strncmp(azArg
[0], "echo", n
)==0 && nArg
>1 && nArg
<3 ){
2075 p
->echoOn
= booleanValue(azArg
[1]);
2078 if( c
=='e' && strncmp(azArg
[0], "exit", n
)==0 ){
2079 if( nArg
>1 && (rc
= (int)integerValue(azArg
[1]))!=0 ) exit(rc
);
2083 if( c
=='e' && strncmp(azArg
[0], "explain", n
)==0 && nArg
<3 ){
2084 int val
= nArg
>=2 ? booleanValue(azArg
[1]) : 1;
2086 if(!p
->explainPrev
.valid
) {
2087 p
->explainPrev
.valid
= 1;
2088 p
->explainPrev
.mode
= p
->mode
;
2089 p
->explainPrev
.showHeader
= p
->showHeader
;
2090 memcpy(p
->explainPrev
.colWidth
,p
->colWidth
,sizeof(p
->colWidth
));
2092 /* We could put this code under the !p->explainValid
2093 ** condition so that it does not execute if we are already in
2094 ** explain mode. However, always executing it allows us an easy
2095 ** was to reset to explain mode in case the user previously
2096 ** did an .explain followed by a .width, .mode or .header
2099 p
->mode
= MODE_Explain
;
2101 memset(p
->colWidth
,0,sizeof(p
->colWidth
));
2102 p
->colWidth
[0] = 4; /* addr */
2103 p
->colWidth
[1] = 13; /* opcode */
2104 p
->colWidth
[2] = 4; /* P1 */
2105 p
->colWidth
[3] = 4; /* P2 */
2106 p
->colWidth
[4] = 4; /* P3 */
2107 p
->colWidth
[5] = 13; /* P4 */
2108 p
->colWidth
[6] = 2; /* P5 */
2109 p
->colWidth
[7] = 13; /* Comment */
2110 }else if (p
->explainPrev
.valid
) {
2111 p
->explainPrev
.valid
= 0;
2112 p
->mode
= p
->explainPrev
.mode
;
2113 p
->showHeader
= p
->explainPrev
.showHeader
;
2114 memcpy(p
->colWidth
,p
->explainPrev
.colWidth
,sizeof(p
->colWidth
));
2118 if( c
=='h' && (strncmp(azArg
[0], "header", n
)==0 ||
2119 strncmp(azArg
[0], "headers", n
)==0) && nArg
>1 && nArg
<3 ){
2120 p
->showHeader
= booleanValue(azArg
[1]);
2123 if( c
=='h' && strncmp(azArg
[0], "help", n
)==0 ){
2124 fprintf(stderr
,"%s",zHelp
);
2126 fprintf(stderr
,"%s",zTimerHelp
);
2130 if( c
=='i' && strncmp(azArg
[0], "import", n
)==0 && nArg
==3 ){
2131 char *zTable
= azArg
[2]; /* Insert data into this table */
2132 char *zFile
= azArg
[1]; /* Name of file to extra content from */
2133 sqlite3_stmt
*pStmt
= NULL
; /* A statement */
2134 int nCol
; /* Number of columns in the table */
2135 int nByte
; /* Number of bytes in an SQL string */
2136 int i
, j
; /* Loop counters */
2137 int needCommit
; /* True to COMMIT or ROLLBACK at end */
2138 int nSep
; /* Number of bytes in p->separator[] */
2139 char *zSql
; /* An SQL statement */
2140 CSVReader sCsv
; /* Reader context */
2141 int (*xCloser
)(FILE*); /* Procedure to close th3 connection */
2144 memset(&sCsv
, 0, sizeof(sCsv
));
2146 nSep
= strlen30(p
->separator
);
2148 fprintf(stderr
, "Error: non-null separator required for import\n");
2152 fprintf(stderr
, "Error: multi-character separators not allowed"
2158 if( sCsv
.zFile
[0]=='|' ){
2159 sCsv
.in
= popen(sCsv
.zFile
+1, "r");
2160 sCsv
.zFile
= "<pipe>";
2163 sCsv
.in
= fopen(sCsv
.zFile
, "rb");
2167 fprintf(stderr
, "Error: cannot open \"%s\"\n", zFile
);
2170 sCsv
.cSeparator
= p
->separator
[0];
2171 zSql
= sqlite3_mprintf("SELECT * FROM %s", zTable
);
2173 fprintf(stderr
, "Error: out of memory\n");
2177 nByte
= strlen30(zSql
);
2178 rc
= sqlite3_prepare(p
->db
, zSql
, -1, &pStmt
, 0);
2179 if( rc
&& sqlite3_strglob("no such table: *", sqlite3_errmsg(db
))==0 ){
2180 char *zCreate
= sqlite3_mprintf("CREATE TABLE %s", zTable
);
2182 while( csv_read_one_field(&sCsv
) ){
2183 zCreate
= sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate
, cSep
, sCsv
.z
);
2185 if( sCsv
.cTerm
!=sCsv
.cSeparator
) break;
2188 sqlite3_free(zCreate
);
2189 sqlite3_free(sCsv
.z
);
2191 fprintf(stderr
,"%s: empty file\n", sCsv
.zFile
);
2194 zCreate
= sqlite3_mprintf("%z\n)", zCreate
);
2195 rc
= sqlite3_exec(p
->db
, zCreate
, 0, 0, 0);
2196 sqlite3_free(zCreate
);
2198 fprintf(stderr
, "CREATE TABLE %s(...) failed: %s\n", zTable
,
2199 sqlite3_errmsg(db
));
2200 sqlite3_free(sCsv
.z
);
2204 rc
= sqlite3_prepare(p
->db
, zSql
, -1, &pStmt
, 0);
2208 if (pStmt
) sqlite3_finalize(pStmt
);
2209 fprintf(stderr
,"Error: %s\n", sqlite3_errmsg(db
));
2213 nCol
= sqlite3_column_count(pStmt
);
2214 sqlite3_finalize(pStmt
);
2216 if( nCol
==0 ) return 0; /* no columns, no error */
2217 zSql
= sqlite3_malloc( nByte
*2 + 20 + nCol
*2 );
2219 fprintf(stderr
, "Error: out of memory\n");
2223 sqlite3_snprintf(nByte
+20, zSql
, "INSERT INTO \"%w\" VALUES(?", zTable
);
2225 for(i
=1; i
<nCol
; i
++){
2231 rc
= sqlite3_prepare(p
->db
, zSql
, -1, &pStmt
, 0);
2234 fprintf(stderr
, "Error: %s\n", sqlite3_errmsg(db
));
2235 if (pStmt
) sqlite3_finalize(pStmt
);
2239 needCommit
= sqlite3_get_autocommit(db
);
2240 if( needCommit
) sqlite3_exec(db
, "BEGIN", 0, 0, 0);
2242 int startLine
= sCsv
.nLine
;
2243 for(i
=0; i
<nCol
; i
++){
2244 char *z
= csv_read_one_field(&sCsv
);
2245 if( z
==0 && i
==0 ) break;
2246 sqlite3_bind_text(pStmt
, i
+1, z
, -1, SQLITE_TRANSIENT
);
2247 if( i
<nCol
-1 && sCsv
.cTerm
!=sCsv
.cSeparator
){
2248 fprintf(stderr
, "%s:%d: expected %d columns but found %d - "
2249 "filling the rest with NULL\n",
2250 sCsv
.zFile
, startLine
, nCol
, i
+1);
2252 while( i
<nCol
){ sqlite3_bind_null(pStmt
, i
); i
++; }
2255 if( sCsv
.cTerm
==sCsv
.cSeparator
){
2257 csv_read_one_field(&sCsv
);
2259 }while( sCsv
.cTerm
==sCsv
.cSeparator
);
2260 fprintf(stderr
, "%s:%d: expected %d columns but found %d - "
2262 sCsv
.zFile
, startLine
, nCol
, i
);
2265 sqlite3_step(pStmt
);
2266 rc
= sqlite3_reset(pStmt
);
2267 if( rc
!=SQLITE_OK
){
2268 fprintf(stderr
, "%s:%d: INSERT failed: %s\n", sCsv
.zFile
, startLine
,
2269 sqlite3_errmsg(db
));
2272 }while( sCsv
.cTerm
!=EOF
);
2275 sqlite3_free(sCsv
.z
);
2276 sqlite3_finalize(pStmt
);
2277 if( needCommit
) sqlite3_exec(db
, "COMMIT", 0, 0, 0);
2280 if( c
=='i' && strncmp(azArg
[0], "indices", n
)==0 && nArg
<3 ){
2281 struct callback_data data
;
2284 memcpy(&data
, p
, sizeof(data
));
2285 data
.showHeader
= 0;
2286 data
.mode
= MODE_List
;
2288 rc
= sqlite3_exec(p
->db
,
2289 "SELECT name FROM sqlite_master "
2290 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2292 "SELECT name FROM sqlite_temp_master "
2293 "WHERE type='index' "
2295 callback
, &data
, &zErrMsg
2298 zShellStatic
= azArg
[1];
2299 rc
= sqlite3_exec(p
->db
,
2300 "SELECT name FROM sqlite_master "
2301 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2303 "SELECT name FROM sqlite_temp_master "
2304 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2306 callback
, &data
, &zErrMsg
2311 fprintf(stderr
,"Error: %s\n", zErrMsg
);
2312 sqlite3_free(zErrMsg
);
2314 }else if( rc
!= SQLITE_OK
){
2315 fprintf(stderr
,"Error: querying sqlite_master and sqlite_temp_master\n");
2320 #ifdef SQLITE_ENABLE_IOTRACE
2321 if( c
=='i' && strncmp(azArg
[0], "iotrace", n
)==0 ){
2322 extern void (*sqlite3IoTrace
)(const char*, ...);
2323 if( iotrace
&& iotrace
!=stdout
) fclose(iotrace
);
2327 }else if( strcmp(azArg
[1], "-")==0 ){
2328 sqlite3IoTrace
= iotracePrintf
;
2331 iotrace
= fopen(azArg
[1], "w");
2333 fprintf(stderr
, "Error: cannot open \"%s\"\n", azArg
[1]);
2337 sqlite3IoTrace
= iotracePrintf
;
2343 #ifndef SQLITE_OMIT_LOAD_EXTENSION
2344 if( c
=='l' && strncmp(azArg
[0], "load", n
)==0 && nArg
>=2 ){
2345 const char *zFile
, *zProc
;
2348 zProc
= nArg
>=3 ? azArg
[2] : 0;
2350 rc
= sqlite3_load_extension(p
->db
, zFile
, zProc
, &zErrMsg
);
2351 if( rc
!=SQLITE_OK
){
2352 fprintf(stderr
, "Error: %s\n", zErrMsg
);
2353 sqlite3_free(zErrMsg
);
2359 if( c
=='l' && strncmp(azArg
[0], "log", n
)==0 && nArg
>=2 ){
2360 const char *zFile
= azArg
[1];
2361 output_file_close(p
->pLog
);
2362 p
->pLog
= output_file_open(zFile
);
2365 if( c
=='m' && strncmp(azArg
[0], "mode", n
)==0 && nArg
==2 ){
2366 int n2
= strlen30(azArg
[1]);
2367 if( (n2
==4 && strncmp(azArg
[1],"line",n2
)==0)
2369 (n2
==5 && strncmp(azArg
[1],"lines",n2
)==0) ){
2370 p
->mode
= MODE_Line
;
2371 }else if( (n2
==6 && strncmp(azArg
[1],"column",n2
)==0)
2373 (n2
==7 && strncmp(azArg
[1],"columns",n2
)==0) ){
2374 p
->mode
= MODE_Column
;
2375 }else if( n2
==4 && strncmp(azArg
[1],"list",n2
)==0 ){
2376 p
->mode
= MODE_List
;
2377 }else if( n2
==4 && strncmp(azArg
[1],"html",n2
)==0 ){
2378 p
->mode
= MODE_Html
;
2379 }else if( n2
==3 && strncmp(azArg
[1],"tcl",n2
)==0 ){
2381 sqlite3_snprintf(sizeof(p
->separator
), p
->separator
, " ");
2382 }else if( n2
==3 && strncmp(azArg
[1],"csv",n2
)==0 ){
2384 sqlite3_snprintf(sizeof(p
->separator
), p
->separator
, ",");
2385 }else if( n2
==4 && strncmp(azArg
[1],"tabs",n2
)==0 ){
2386 p
->mode
= MODE_List
;
2387 sqlite3_snprintf(sizeof(p
->separator
), p
->separator
, "\t");
2388 }else if( n2
==6 && strncmp(azArg
[1],"insert",n2
)==0 ){
2389 p
->mode
= MODE_Insert
;
2390 set_table_name(p
, "table");
2392 fprintf(stderr
,"Error: mode should be one of: "
2393 "column csv html insert line list tabs tcl\n");
2398 if( c
=='m' && strncmp(azArg
[0], "mode", n
)==0 && nArg
==3 ){
2399 int n2
= strlen30(azArg
[1]);
2400 if( n2
==6 && strncmp(azArg
[1],"insert",n2
)==0 ){
2401 p
->mode
= MODE_Insert
;
2402 set_table_name(p
, azArg
[2]);
2404 fprintf(stderr
, "Error: invalid arguments: "
2405 " \"%s\". Enter \".help\" for help\n", azArg
[2]);
2410 if( c
=='n' && strncmp(azArg
[0], "nullvalue", n
)==0 && nArg
==2 ) {
2411 sqlite3_snprintf(sizeof(p
->nullvalue
), p
->nullvalue
,
2412 "%.*s", (int)ArraySize(p
->nullvalue
)-1, azArg
[1]);
2415 if( c
=='o' && strncmp(azArg
[0], "open", n
)==0 && n
>=2 ){
2416 sqlite3
*savedDb
= p
->db
;
2417 const char *zSavedFilename
= p
->zDbFilename
;
2418 char *zNewFilename
= 0;
2421 p
->zDbFilename
= zNewFilename
= sqlite3_mprintf("%s", azArg
[1]);
2425 sqlite3_close(savedDb
);
2426 sqlite3_free(p
->zFreeOnClose
);
2427 p
->zFreeOnClose
= zNewFilename
;
2429 sqlite3_free(zNewFilename
);
2431 p
->zDbFilename
= zSavedFilename
;
2435 if( c
=='o' && strncmp(azArg
[0], "output", n
)==0 && nArg
==2 ){
2436 if( p
->outfile
[0]=='|' ){
2439 output_file_close(p
->out
);
2442 if( azArg
[1][0]=='|' ){
2443 p
->out
= popen(&azArg
[1][1], "w");
2445 fprintf(stderr
,"Error: cannot open pipe \"%s\"\n", &azArg
[1][1]);
2449 sqlite3_snprintf(sizeof(p
->outfile
), p
->outfile
, "%s", azArg
[1]);
2452 p
->out
= output_file_open(azArg
[1]);
2454 if( strcmp(azArg
[1],"off")!=0 ){
2455 fprintf(stderr
,"Error: cannot write to \"%s\"\n", azArg
[1]);
2460 sqlite3_snprintf(sizeof(p
->outfile
), p
->outfile
, "%s", azArg
[1]);
2465 if( c
=='p' && n
>=3 && strncmp(azArg
[0], "print", n
)==0 ){
2467 for(i
=1; i
<nArg
; i
++){
2468 if( i
>1 ) fprintf(p
->out
, " ");
2469 fprintf(p
->out
, "%s", azArg
[i
]);
2471 fprintf(p
->out
, "\n");
2474 if( c
=='p' && strncmp(azArg
[0], "prompt", n
)==0 && (nArg
==2 || nArg
==3)){
2476 strncpy(mainPrompt
,azArg
[1],(int)ArraySize(mainPrompt
)-1);
2479 strncpy(continuePrompt
,azArg
[2],(int)ArraySize(continuePrompt
)-1);
2483 if( c
=='q' && strncmp(azArg
[0], "quit", n
)==0 && nArg
==1 ){
2487 if( c
=='r' && n
>=3 && strncmp(azArg
[0], "read", n
)==0 && nArg
==2 ){
2488 FILE *alt
= fopen(azArg
[1], "rb");
2490 fprintf(stderr
,"Error: cannot open \"%s\"\n", azArg
[1]);
2493 rc
= process_input(p
, alt
);
2498 if( c
=='r' && n
>=3 && strncmp(azArg
[0], "restore", n
)==0 && nArg
>1 && nArg
<4){
2499 const char *zSrcFile
;
2502 sqlite3_backup
*pBackup
;
2506 zSrcFile
= azArg
[1];
2509 zSrcFile
= azArg
[2];
2512 rc
= sqlite3_open(zSrcFile
, &pSrc
);
2513 if( rc
!=SQLITE_OK
){
2514 fprintf(stderr
, "Error: cannot open \"%s\"\n", zSrcFile
);
2515 sqlite3_close(pSrc
);
2519 pBackup
= sqlite3_backup_init(p
->db
, zDb
, pSrc
, "main");
2521 fprintf(stderr
, "Error: %s\n", sqlite3_errmsg(p
->db
));
2522 sqlite3_close(pSrc
);
2525 while( (rc
= sqlite3_backup_step(pBackup
,100))==SQLITE_OK
2526 || rc
==SQLITE_BUSY
){
2527 if( rc
==SQLITE_BUSY
){
2528 if( nTimeout
++ >= 3 ) break;
2532 sqlite3_backup_finish(pBackup
);
2533 if( rc
==SQLITE_DONE
){
2535 }else if( rc
==SQLITE_BUSY
|| rc
==SQLITE_LOCKED
){
2536 fprintf(stderr
, "Error: source database is busy\n");
2539 fprintf(stderr
, "Error: %s\n", sqlite3_errmsg(p
->db
));
2542 sqlite3_close(pSrc
);
2545 if( c
=='s' && strncmp(azArg
[0], "schema", n
)==0 && nArg
<3 ){
2546 struct callback_data data
;
2549 memcpy(&data
, p
, sizeof(data
));
2550 data
.showHeader
= 0;
2551 data
.mode
= MODE_Semi
;
2554 for(i
=0; azArg
[1][i
]; i
++) azArg
[1][i
] = ToLower(azArg
[1][i
]);
2555 if( strcmp(azArg
[1],"sqlite_master")==0 ){
2556 char *new_argv
[2], *new_colv
[2];
2557 new_argv
[0] = "CREATE TABLE sqlite_master (\n"
2561 " rootpage integer,\n"
2565 new_colv
[0] = "sql";
2567 callback(&data
, 1, new_argv
, new_colv
);
2569 }else if( strcmp(azArg
[1],"sqlite_temp_master")==0 ){
2570 char *new_argv
[2], *new_colv
[2];
2571 new_argv
[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2575 " rootpage integer,\n"
2579 new_colv
[0] = "sql";
2581 callback(&data
, 1, new_argv
, new_colv
);
2584 zShellStatic
= azArg
[1];
2585 rc
= sqlite3_exec(p
->db
,
2587 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2588 " FROM sqlite_master UNION ALL"
2589 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2590 "WHERE lower(tbl_name) LIKE shellstatic()"
2591 " AND type!='meta' AND sql NOTNULL "
2593 callback
, &data
, &zErrMsg
);
2597 rc
= sqlite3_exec(p
->db
,
2599 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2600 " FROM sqlite_master UNION ALL"
2601 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2602 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
2604 callback
, &data
, &zErrMsg
2608 fprintf(stderr
,"Error: %s\n", zErrMsg
);
2609 sqlite3_free(zErrMsg
);
2611 }else if( rc
!= SQLITE_OK
){
2612 fprintf(stderr
,"Error: querying schema information\n");
2620 /* Undocumented commands for internal testing. Subject to change
2621 ** without notice. */
2622 if( c
=='s' && n
>=10 && strncmp(azArg
[0], "selftest-", 9)==0 ){
2623 if( strncmp(azArg
[0]+9, "boolean", n
-9)==0 ){
2625 for(i
=1; i
<nArg
; i
++){
2626 v
= booleanValue(azArg
[i
]);
2627 fprintf(p
->out
, "%s: %d 0x%x\n", azArg
[i
], v
, v
);
2630 if( strncmp(azArg
[0]+9, "integer", n
-9)==0 ){
2631 int i
; sqlite3_int64 v
;
2632 for(i
=1; i
<nArg
; i
++){
2634 v
= integerValue(azArg
[i
]);
2635 sqlite3_snprintf(sizeof(zBuf
), zBuf
, "%s: %lld 0x%llx\n", azArg
[i
], v
, v
);
2636 fprintf(p
->out
, "%s", zBuf
);
2642 if( c
=='s' && strncmp(azArg
[0], "separator", n
)==0 && nArg
==2 ){
2643 sqlite3_snprintf(sizeof(p
->separator
), p
->separator
,
2644 "%.*s", (int)sizeof(p
->separator
)-1, azArg
[1]);
2647 if( c
=='s' && strncmp(azArg
[0], "show", n
)==0 && nArg
==1 ){
2649 fprintf(p
->out
,"%9.9s: %s\n","echo", p
->echoOn
? "on" : "off");
2650 fprintf(p
->out
,"%9.9s: %s\n","explain", p
->explainPrev
.valid
? "on" :"off");
2651 fprintf(p
->out
,"%9.9s: %s\n","headers", p
->showHeader
? "on" : "off");
2652 fprintf(p
->out
,"%9.9s: %s\n","mode", modeDescr
[p
->mode
]);
2653 fprintf(p
->out
,"%9.9s: ", "nullvalue");
2654 output_c_string(p
->out
, p
->nullvalue
);
2655 fprintf(p
->out
, "\n");
2656 fprintf(p
->out
,"%9.9s: %s\n","output",
2657 strlen30(p
->outfile
) ? p
->outfile
: "stdout");
2658 fprintf(p
->out
,"%9.9s: ", "separator");
2659 output_c_string(p
->out
, p
->separator
);
2660 fprintf(p
->out
, "\n");
2661 fprintf(p
->out
,"%9.9s: %s\n","stats", p
->statsOn
? "on" : "off");
2662 fprintf(p
->out
,"%9.9s: ","width");
2663 for (i
=0;i
<(int)ArraySize(p
->colWidth
) && p
->colWidth
[i
] != 0;i
++) {
2664 fprintf(p
->out
,"%d ",p
->colWidth
[i
]);
2666 fprintf(p
->out
,"\n");
2669 if( c
=='s' && strncmp(azArg
[0], "stats", n
)==0 && nArg
>1 && nArg
<3 ){
2670 p
->statsOn
= booleanValue(azArg
[1]);
2673 if( c
=='t' && n
>1 && strncmp(azArg
[0], "tables", n
)==0 && nArg
<3 ){
2674 sqlite3_stmt
*pStmt
;
2680 rc
= sqlite3_prepare_v2(p
->db
, "PRAGMA database_list", -1, &pStmt
, 0);
2682 zSql
= sqlite3_mprintf(
2683 "SELECT name FROM sqlite_master"
2684 " WHERE type IN ('table','view')"
2685 " AND name NOT LIKE 'sqlite_%%'"
2686 " AND name LIKE ?1");
2687 while( sqlite3_step(pStmt
)==SQLITE_ROW
){
2688 const char *zDbName
= (const char*)sqlite3_column_text(pStmt
, 1);
2689 if( zDbName
==0 || strcmp(zDbName
,"main")==0 ) continue;
2690 if( strcmp(zDbName
,"temp")==0 ){
2691 zSql
= sqlite3_mprintf(
2693 "SELECT 'temp.' || name FROM sqlite_temp_master"
2694 " WHERE type IN ('table','view')"
2695 " AND name NOT LIKE 'sqlite_%%'"
2696 " AND name LIKE ?1", zSql
);
2698 zSql
= sqlite3_mprintf(
2700 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2701 " WHERE type IN ('table','view')"
2702 " AND name NOT LIKE 'sqlite_%%'"
2703 " AND name LIKE ?1", zSql
, zDbName
, zDbName
);
2706 sqlite3_finalize(pStmt
);
2707 zSql
= sqlite3_mprintf("%z ORDER BY 1", zSql
);
2708 rc
= sqlite3_prepare_v2(p
->db
, zSql
, -1, &pStmt
, 0);
2714 sqlite3_bind_text(pStmt
, 1, azArg
[1], -1, SQLITE_TRANSIENT
);
2716 sqlite3_bind_text(pStmt
, 1, "%", -1, SQLITE_STATIC
);
2718 while( sqlite3_step(pStmt
)==SQLITE_ROW
){
2721 int n
= nAlloc
*2 + 10;
2722 azNew
= sqlite3_realloc(azResult
, sizeof(azResult
[0])*n
);
2724 fprintf(stderr
, "Error: out of memory\n");
2730 azResult
[nRow
] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt
, 0));
2731 if( azResult
[nRow
] ) nRow
++;
2733 sqlite3_finalize(pStmt
);
2735 int len
, maxlen
= 0;
2737 int nPrintCol
, nPrintRow
;
2738 for(i
=0; i
<nRow
; i
++){
2739 len
= strlen30(azResult
[i
]);
2740 if( len
>maxlen
) maxlen
= len
;
2742 nPrintCol
= 80/(maxlen
+2);
2743 if( nPrintCol
<1 ) nPrintCol
= 1;
2744 nPrintRow
= (nRow
+ nPrintCol
- 1)/nPrintCol
;
2745 for(i
=0; i
<nPrintRow
; i
++){
2746 for(j
=i
; j
<nRow
; j
+=nPrintRow
){
2747 char *zSp
= j
<nPrintRow
? "" : " ";
2748 fprintf(p
->out
, "%s%-*s", zSp
, maxlen
, azResult
[j
] ? azResult
[j
] : "");
2750 fprintf(p
->out
, "\n");
2753 for(ii
=0; ii
<nRow
; ii
++) sqlite3_free(azResult
[ii
]);
2754 sqlite3_free(azResult
);
2757 if( c
=='t' && n
>=8 && strncmp(azArg
[0], "testctrl", n
)==0 && nArg
>=2 ){
2758 static const struct {
2759 const char *zCtrlName
; /* Name of a test-control option */
2760 int ctrlCode
; /* Integer code for that option */
2762 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE
},
2763 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE
},
2764 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET
},
2765 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST
},
2766 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL
},
2767 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS
},
2768 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE
},
2769 { "assert", SQLITE_TESTCTRL_ASSERT
},
2770 { "always", SQLITE_TESTCTRL_ALWAYS
},
2771 { "reserve", SQLITE_TESTCTRL_RESERVE
},
2772 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS
},
2773 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD
},
2774 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC
},
2781 /* convert testctrl text option to value. allow any unique prefix
2782 ** of the option name, or a numerical value. */
2783 n
= strlen30(azArg
[1]);
2784 for(i
=0; i
<(int)(sizeof(aCtrl
)/sizeof(aCtrl
[0])); i
++){
2785 if( strncmp(azArg
[1], aCtrl
[i
].zCtrlName
, n
)==0 ){
2787 testctrl
= aCtrl
[i
].ctrlCode
;
2789 fprintf(stderr
, "ambiguous option name: \"%s\"\n", azArg
[1]);
2795 if( testctrl
<0 ) testctrl
= (int)integerValue(azArg
[1]);
2796 if( (testctrl
<SQLITE_TESTCTRL_FIRST
) || (testctrl
>SQLITE_TESTCTRL_LAST
) ){
2797 fprintf(stderr
,"Error: invalid testctrl option: %s\n", azArg
[1]);
2801 /* sqlite3_test_control(int, db, int) */
2802 case SQLITE_TESTCTRL_OPTIMIZATIONS
:
2803 case SQLITE_TESTCTRL_RESERVE
:
2805 int opt
= (int)strtol(azArg
[2], 0, 0);
2806 rc
= sqlite3_test_control(testctrl
, p
->db
, opt
);
2807 fprintf(p
->out
, "%d (0x%08x)\n", rc
, rc
);
2809 fprintf(stderr
,"Error: testctrl %s takes a single int option\n",
2814 /* sqlite3_test_control(int) */
2815 case SQLITE_TESTCTRL_PRNG_SAVE
:
2816 case SQLITE_TESTCTRL_PRNG_RESTORE
:
2817 case SQLITE_TESTCTRL_PRNG_RESET
:
2819 rc
= sqlite3_test_control(testctrl
);
2820 fprintf(p
->out
, "%d (0x%08x)\n", rc
, rc
);
2822 fprintf(stderr
,"Error: testctrl %s takes no options\n", azArg
[1]);
2826 /* sqlite3_test_control(int, uint) */
2827 case SQLITE_TESTCTRL_PENDING_BYTE
:
2829 unsigned int opt
= (unsigned int)integerValue(azArg
[2]);
2830 rc
= sqlite3_test_control(testctrl
, opt
);
2831 fprintf(p
->out
, "%d (0x%08x)\n", rc
, rc
);
2833 fprintf(stderr
,"Error: testctrl %s takes a single unsigned"
2834 " int option\n", azArg
[1]);
2838 /* sqlite3_test_control(int, int) */
2839 case SQLITE_TESTCTRL_ASSERT
:
2840 case SQLITE_TESTCTRL_ALWAYS
:
2842 int opt
= booleanValue(azArg
[2]);
2843 rc
= sqlite3_test_control(testctrl
, opt
);
2844 fprintf(p
->out
, "%d (0x%08x)\n", rc
, rc
);
2846 fprintf(stderr
,"Error: testctrl %s takes a single int option\n",
2851 /* sqlite3_test_control(int, char *) */
2852 #ifdef SQLITE_N_KEYWORD
2853 case SQLITE_TESTCTRL_ISKEYWORD
:
2855 const char *opt
= azArg
[2];
2856 rc
= sqlite3_test_control(testctrl
, opt
);
2857 fprintf(p
->out
, "%d (0x%08x)\n", rc
, rc
);
2859 fprintf(stderr
,"Error: testctrl %s takes a single char * option\n",
2865 case SQLITE_TESTCTRL_BITVEC_TEST
:
2866 case SQLITE_TESTCTRL_FAULT_INSTALL
:
2867 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS
:
2868 case SQLITE_TESTCTRL_SCRATCHMALLOC
:
2870 fprintf(stderr
,"Error: CLI support for testctrl %s not implemented\n",
2877 if( c
=='t' && n
>4 && strncmp(azArg
[0], "timeout", n
)==0 && nArg
==2 ){
2879 sqlite3_busy_timeout(p
->db
, (int)integerValue(azArg
[1]));
2882 if( HAS_TIMER
&& c
=='t' && n
>=5 && strncmp(azArg
[0], "timer", n
)==0
2885 enableTimer
= booleanValue(azArg
[1]);
2888 if( c
=='t' && strncmp(azArg
[0], "trace", n
)==0 && nArg
>1 ){
2890 output_file_close(p
->traceOut
);
2891 p
->traceOut
= output_file_open(azArg
[1]);
2892 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
2893 if( p
->traceOut
==0 ){
2894 sqlite3_trace(p
->db
, 0, 0);
2896 sqlite3_trace(p
->db
, sql_trace_callback
, p
->traceOut
);
2901 if( c
=='v' && strncmp(azArg
[0], "version", n
)==0 ){
2902 fprintf(p
->out
, "SQLite %s %s\n" /*extra-version-info*/,
2903 sqlite3_libversion(), sqlite3_sourceid());
2906 if( c
=='v' && strncmp(azArg
[0], "vfsname", n
)==0 ){
2907 const char *zDbName
= nArg
==2 ? azArg
[1] : "main";
2910 sqlite3_file_control(p
->db
, zDbName
, SQLITE_FCNTL_VFSNAME
, &zVfsName
);
2912 fprintf(p
->out
, "%s\n", zVfsName
);
2913 sqlite3_free(zVfsName
);
2918 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2919 if( c
=='w' && strncmp(azArg
[0], "wheretrace", n
)==0 ){
2920 extern int sqlite3WhereTrace
;
2921 sqlite3WhereTrace
= booleanValue(azArg
[1]);
2925 if( c
=='w' && strncmp(azArg
[0], "width", n
)==0 && nArg
>1 ){
2927 assert( nArg
<=ArraySize(azArg
) );
2928 for(j
=1; j
<nArg
&& j
<ArraySize(p
->colWidth
); j
++){
2929 p
->colWidth
[j
-1] = (int)integerValue(azArg
[j
]);
2934 fprintf(stderr
, "Error: unknown command or invalid arguments: "
2935 " \"%s\". Enter \".help\" for help\n", azArg
[0]);
2943 ** Return TRUE if a semicolon occurs anywhere in the first N characters
2946 static int line_contains_semicolon(const char *z
, int N
){
2948 for(i
=0; i
<N
; i
++){ if( z
[i
]==';' ) return 1; }
2953 ** Test to see if a line consists entirely of whitespace.
2955 static int _all_whitespace(const char *z
){
2957 if( IsSpace(z
[0]) ) continue;
2958 if( *z
=='/' && z
[1]=='*' ){
2960 while( *z
&& (*z
!='*' || z
[1]!='/') ){ z
++; }
2961 if( *z
==0 ) return 0;
2965 if( *z
=='-' && z
[1]=='-' ){
2967 while( *z
&& *z
!='\n' ){ z
++; }
2968 if( *z
==0 ) return 1;
2977 ** Return TRUE if the line typed in is an SQL command terminator other
2978 ** than a semi-colon. The SQL Server style "go" command is understood
2979 ** as is the Oracle "/".
2981 static int line_is_command_terminator(const char *zLine
){
2982 while( IsSpace(zLine
[0]) ){ zLine
++; };
2983 if( zLine
[0]=='/' && _all_whitespace(&zLine
[1]) ){
2984 return 1; /* Oracle */
2986 if( ToLower(zLine
[0])=='g' && ToLower(zLine
[1])=='o'
2987 && _all_whitespace(&zLine
[2]) ){
2988 return 1; /* SQL Server */
2994 ** Return true if zSql is a complete SQL statement. Return false if it
2995 ** ends in the middle of a string literal or C-style comment.
2997 static int line_is_complete(char *zSql
, int nSql
){
2999 if( zSql
==0 ) return 1;
3002 rc
= sqlite3_complete(zSql
);
3008 ** Read input from *in and process it. If *in==0 then input
3009 ** is interactive - the user is typing it it. Otherwise, input
3010 ** is coming from a file or device. A prompt is issued and history
3011 ** is saved only if input is interactive. An interrupt signal will
3012 ** cause this routine to exit immediately, unless input is interactive.
3014 ** Return the number of errors.
3016 static int process_input(struct callback_data
*p
, FILE *in
){
3017 char *zLine
= 0; /* A single input line */
3018 char *zSql
= 0; /* Accumulated SQL text */
3019 int nLine
; /* Length of current line */
3020 int nSql
= 0; /* Bytes of zSql[] used */
3021 int nAlloc
= 0; /* Allocated zSql[] space */
3022 int nSqlPrior
= 0; /* Bytes of zSql[] used by prior line */
3023 char *zErrMsg
; /* Error message returned */
3024 int rc
; /* Error code */
3025 int errCnt
= 0; /* Number of errors seen */
3026 int lineno
= 0; /* Current line number */
3027 int startline
= 0; /* Line number for start of current input */
3029 while( errCnt
==0 || !bail_on_error
|| (in
==0 && stdin_is_interactive
) ){
3031 zLine
= one_input_line(in
, zLine
, nSql
>0);
3034 if( stdin_is_interactive
) printf("\n");
3037 if( seenInterrupt
){
3042 if( nSql
==0 && _all_whitespace(zLine
) ){
3043 if( p
->echoOn
) printf("%s\n", zLine
);
3046 if( zLine
&& zLine
[0]=='.' && nSql
==0 ){
3047 if( p
->echoOn
) printf("%s\n", zLine
);
3048 rc
= do_meta_command(zLine
, p
);
3049 if( rc
==2 ){ /* exit requested */
3056 if( line_is_command_terminator(zLine
) && line_is_complete(zSql
, nSql
) ){
3057 memcpy(zLine
,";",2);
3059 nLine
= strlen30(zLine
);
3060 if( nSql
+nLine
+2>=nAlloc
){
3061 nAlloc
= nSql
+nLine
+100;
3062 zSql
= realloc(zSql
, nAlloc
);
3064 fprintf(stderr
, "Error: out of memory\n");
3071 for(i
=0; zLine
[i
] && IsSpace(zLine
[i
]); i
++){}
3072 assert( nAlloc
>0 && zSql
!=0 );
3073 memcpy(zSql
, zLine
+i
, nLine
+1-i
);
3077 zSql
[nSql
++] = '\n';
3078 memcpy(zSql
+nSql
, zLine
, nLine
+1);
3081 if( nSql
&& line_contains_semicolon(&zSql
[nSqlPrior
], nSql
-nSqlPrior
)
3082 && sqlite3_complete(zSql
) ){
3086 rc
= shell_exec(p
->db
, zSql
, shell_callback
, p
, &zErrMsg
);
3088 if( rc
|| zErrMsg
){
3090 if( in
!=0 || !stdin_is_interactive
){
3091 sqlite3_snprintf(sizeof(zPrefix
), zPrefix
,
3092 "Error: near line %d:", startline
);
3094 sqlite3_snprintf(sizeof(zPrefix
), zPrefix
, "Error:");
3097 fprintf(stderr
, "%s %s\n", zPrefix
, zErrMsg
);
3098 sqlite3_free(zErrMsg
);
3101 fprintf(stderr
, "%s %s\n", zPrefix
, sqlite3_errmsg(p
->db
));
3106 }else if( nSql
&& _all_whitespace(zSql
) ){
3107 if( p
->echoOn
) printf("%s\n", zSql
);
3112 if( !_all_whitespace(zSql
) ){
3113 fprintf(stderr
, "Error: incomplete SQL: %s\n", zSql
);
3122 ** Return a pathname which is the user's home directory. A
3123 ** 0 return indicates an error of some kind.
3125 static char *find_home_dir(void){
3126 static char *home_dir
= NULL
;
3127 if( home_dir
) return home_dir
;
3129 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
3131 struct passwd
*pwent
;
3132 uid_t uid
= getuid();
3133 if( (pwent
=getpwuid(uid
)) != NULL
) {
3134 home_dir
= pwent
->pw_dir
;
3139 #if defined(_WIN32_WCE)
3140 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3145 #if defined(_WIN32) || defined(WIN32)
3147 home_dir
= getenv("USERPROFILE");
3152 home_dir
= getenv("HOME");
3155 #if defined(_WIN32) || defined(WIN32)
3157 char *zDrive
, *zPath
;
3159 zDrive
= getenv("HOMEDRIVE");
3160 zPath
= getenv("HOMEPATH");
3161 if( zDrive
&& zPath
){
3162 n
= strlen30(zDrive
) + strlen30(zPath
) + 1;
3163 home_dir
= malloc( n
);
3164 if( home_dir
==0 ) return 0;
3165 sqlite3_snprintf(n
, home_dir
, "%s%s", zDrive
, zPath
);
3172 #endif /* !_WIN32_WCE */
3175 int n
= strlen30(home_dir
) + 1;
3176 char *z
= malloc( n
);
3177 if( z
) memcpy(z
, home_dir
, n
);
3185 ** Read input from the file given by sqliterc_override. Or if that
3186 ** parameter is NULL, take input from ~/.sqliterc
3188 ** Returns the number of errors.
3190 static int process_sqliterc(
3191 struct callback_data
*p
, /* Configuration data */
3192 const char *sqliterc_override
/* Name of config file. NULL to use default */
3194 char *home_dir
= NULL
;
3195 const char *sqliterc
= sqliterc_override
;
3200 if (sqliterc
== NULL
) {
3201 home_dir
= find_home_dir();
3203 #if !defined(__RTP__) && !defined(_WRS_KERNEL)
3204 fprintf(stderr
,"%s: Error: cannot locate your home directory\n", Argv0
);
3208 sqlite3_initialize();
3209 zBuf
= sqlite3_mprintf("%s/.sqliterc",home_dir
);
3212 in
= fopen(sqliterc
,"rb");
3214 if( stdin_is_interactive
){
3215 fprintf(stderr
,"-- Loading resources from %s\n",sqliterc
);
3217 rc
= process_input(p
,in
);
3225 ** Show available command line options
3227 static const char zOptions
[] =
3228 " -bail stop after hitting an error\n"
3229 " -batch force batch I/O\n"
3230 " -column set output mode to 'column'\n"
3231 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
3232 " -csv set output mode to 'csv'\n"
3233 " -echo print commands before execution\n"
3234 " -init FILENAME read/process named file\n"
3235 " -[no]header turn headers on or off\n"
3236 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3237 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3239 " -help show this message\n"
3240 " -html set output mode to HTML\n"
3241 " -interactive force interactive I/O\n"
3242 " -line set output mode to 'line'\n"
3243 " -list set output mode to 'list'\n"
3244 " -mmap N default mmap size set to N\n"
3245 #ifdef SQLITE_ENABLE_MULTIPLEX
3246 " -multiplex enable the multiplexor VFS\n"
3248 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3249 " -separator SEP set output field separator. Default: '|'\n"
3250 " -stats print memory stats before each finalize\n"
3251 " -version show SQLite version\n"
3252 " -vfs NAME use NAME as the default VFS\n"
3253 #ifdef SQLITE_ENABLE_VFSTRACE
3254 " -vfstrace enable tracing of all VFS calls\n"
3257 static void usage(int showDetail
){
3259 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3260 "FILENAME is the name of an SQLite database. A new database is created\n"
3261 "if the file does not previously exist.\n", Argv0
);
3263 fprintf(stderr
, "OPTIONS include:\n%s", zOptions
);
3265 fprintf(stderr
, "Use the -help option for additional information\n");
3271 ** Initialize the state information in data
3273 static void main_init(struct callback_data
*data
) {
3274 memset(data
, 0, sizeof(*data
));
3275 data
->mode
= MODE_List
;
3276 memcpy(data
->separator
,"|", 2);
3277 data
->showHeader
= 0;
3278 sqlite3_config(SQLITE_CONFIG_URI
, 1);
3279 sqlite3_config(SQLITE_CONFIG_LOG
, shellLog
, data
);
3280 sqlite3_snprintf(sizeof(mainPrompt
), mainPrompt
,"sqlite> ");
3281 sqlite3_snprintf(sizeof(continuePrompt
), continuePrompt
," ...> ");
3282 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD
);
3286 ** Get the argument to an --option. Throw an error and die if no argument
3289 static char *cmdline_option_value(int argc
, char **argv
, int i
){
3291 fprintf(stderr
, "%s: Error: missing argument to %s\n",
3292 argv
[0], argv
[argc
-1]);
3298 int main(int argc
, char **argv
){
3300 struct callback_data data
;
3301 const char *zInitFile
= 0;
3302 char *zFirstCmd
= 0;
3306 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID
)!=0 ){
3307 fprintf(stderr
, "SQLite header and source version mismatch\n%s\n%s\n",
3308 sqlite3_sourceid(), SQLITE_SOURCE_ID
);
3313 stdin_is_interactive
= isatty(0);
3315 /* Make sure we have a valid signal handler early, before anything
3319 signal(SIGINT
, interrupt_handler
);
3322 /* Do an initial pass through the command-line argument to locate
3323 ** the name of the database file, the name of the initialization file,
3324 ** the size of the alternative malloc heap,
3325 ** and the first command to execute.
3327 for(i
=1; i
<argc
; i
++){
3331 if( data
.zDbFilename
==0 ){
3332 data
.zDbFilename
= z
;
3339 fprintf(stderr
,"%s: Error: too many options: \"%s\"\n", Argv0
, argv
[i
]);
3340 fprintf(stderr
,"Use -help for a list of options.\n");
3343 if( z
[1]=='-' ) z
++;
3344 if( strcmp(z
,"-separator")==0
3345 || strcmp(z
,"-nullvalue")==0
3346 || strcmp(z
,"-cmd")==0
3348 (void)cmdline_option_value(argc
, argv
, ++i
);
3349 }else if( strcmp(z
,"-init")==0 ){
3350 zInitFile
= cmdline_option_value(argc
, argv
, ++i
);
3351 }else if( strcmp(z
,"-batch")==0 ){
3352 /* Need to check for batch mode here to so we can avoid printing
3353 ** informational messages (like from process_sqliterc) before
3354 ** we do the actual processing of arguments later in a second pass.
3356 stdin_is_interactive
= 0;
3357 }else if( strcmp(z
,"-heap")==0 ){
3358 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3360 sqlite3_int64 szHeap
;
3362 zSize
= cmdline_option_value(argc
, argv
, ++i
);
3363 szHeap
= integerValue(zSize
);
3364 if( szHeap
>0x7fff0000 ) szHeap
= 0x7fff0000;
3365 sqlite3_config(SQLITE_CONFIG_HEAP
, malloc((int)szHeap
), (int)szHeap
, 64);
3367 #ifdef SQLITE_ENABLE_VFSTRACE
3368 }else if( strcmp(z
,"-vfstrace")==0 ){
3369 extern int vfstrace_register(
3370 const char *zTraceName
,
3371 const char *zOldVfsName
,
3372 int (*xOut
)(const char*,void*),
3376 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs
,stderr
,1);
3378 #ifdef SQLITE_ENABLE_MULTIPLEX
3379 }else if( strcmp(z
,"-multiplex")==0 ){
3380 extern int sqlite3_multiple_initialize(const char*,int);
3381 sqlite3_multiplex_initialize(0, 1);
3383 }else if( strcmp(z
,"-mmap")==0 ){
3384 sqlite3_int64 sz
= integerValue(cmdline_option_value(argc
,argv
,++i
));
3385 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE
, sz
, sz
);
3386 }else if( strcmp(z
,"-vfs")==0 ){
3387 sqlite3_vfs
*pVfs
= sqlite3_vfs_find(cmdline_option_value(argc
,argv
,++i
));
3389 sqlite3_vfs_register(pVfs
, 1);
3391 fprintf(stderr
, "no such VFS: \"%s\"\n", argv
[i
]);
3396 if( data
.zDbFilename
==0 ){
3397 #ifndef SQLITE_OMIT_MEMORYDB
3398 data
.zDbFilename
= ":memory:";
3400 fprintf(stderr
,"%s: Error: no database filename specified\n", Argv0
);
3406 /* Go ahead and open the database file if it already exists. If the
3407 ** file does not exist, delay opening it. This prevents empty database
3408 ** files from being created if a user mistypes the database name argument
3409 ** to the sqlite command-line tool.
3411 if( access(data
.zDbFilename
, 0)==0 ){
3415 /* Process the initialization file if there is one. If no -init option
3416 ** is given on the command line, look for a file named ~/.sqliterc and
3417 ** try to process it.
3419 rc
= process_sqliterc(&data
,zInitFile
);
3424 /* Make a second pass through the command-line argument and set
3425 ** options. This second pass is delayed until after the initialization
3426 ** file is processed so that the command-line arguments will override
3427 ** settings in the initialization file.
3429 for(i
=1; i
<argc
; i
++){
3431 if( z
[0]!='-' ) continue;
3432 if( z
[1]=='-' ){ z
++; }
3433 if( strcmp(z
,"-init")==0 ){
3435 }else if( strcmp(z
,"-html")==0 ){
3436 data
.mode
= MODE_Html
;
3437 }else if( strcmp(z
,"-list")==0 ){
3438 data
.mode
= MODE_List
;
3439 }else if( strcmp(z
,"-line")==0 ){
3440 data
.mode
= MODE_Line
;
3441 }else if( strcmp(z
,"-column")==0 ){
3442 data
.mode
= MODE_Column
;
3443 }else if( strcmp(z
,"-csv")==0 ){
3444 data
.mode
= MODE_Csv
;
3445 memcpy(data
.separator
,",",2);
3446 }else if( strcmp(z
,"-separator")==0 ){
3447 sqlite3_snprintf(sizeof(data
.separator
), data
.separator
,
3448 "%s",cmdline_option_value(argc
,argv
,++i
));
3449 }else if( strcmp(z
,"-nullvalue")==0 ){
3450 sqlite3_snprintf(sizeof(data
.nullvalue
), data
.nullvalue
,
3451 "%s",cmdline_option_value(argc
,argv
,++i
));
3452 }else if( strcmp(z
,"-header")==0 ){
3453 data
.showHeader
= 1;
3454 }else if( strcmp(z
,"-noheader")==0 ){
3455 data
.showHeader
= 0;
3456 }else if( strcmp(z
,"-echo")==0 ){
3458 }else if( strcmp(z
,"-stats")==0 ){
3460 }else if( strcmp(z
,"-bail")==0 ){
3462 }else if( strcmp(z
,"-version")==0 ){
3463 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
3465 }else if( strcmp(z
,"-interactive")==0 ){
3466 stdin_is_interactive
= 1;
3467 }else if( strcmp(z
,"-batch")==0 ){
3468 stdin_is_interactive
= 0;
3469 }else if( strcmp(z
,"-heap")==0 ){
3471 }else if( strcmp(z
,"-mmap")==0 ){
3473 }else if( strcmp(z
,"-vfs")==0 ){
3475 #ifdef SQLITE_ENABLE_VFSTRACE
3476 }else if( strcmp(z
,"-vfstrace")==0 ){
3479 #ifdef SQLITE_ENABLE_MULTIPLEX
3480 }else if( strcmp(z
,"-multiplex")==0 ){
3483 }else if( strcmp(z
,"-help")==0 ){
3485 }else if( strcmp(z
,"-cmd")==0 ){
3486 if( i
==argc
-1 ) break;
3487 z
= cmdline_option_value(argc
,argv
,++i
);
3489 rc
= do_meta_command(z
, &data
);
3490 if( rc
&& bail_on_error
) return rc
==2 ? 0 : rc
;
3493 rc
= shell_exec(data
.db
, z
, shell_callback
, &data
, &zErrMsg
);
3495 fprintf(stderr
,"Error: %s\n", zErrMsg
);
3496 if( bail_on_error
) return rc
!=0 ? rc
: 1;
3498 fprintf(stderr
,"Error: unable to process SQL \"%s\"\n", z
);
3499 if( bail_on_error
) return rc
;
3503 fprintf(stderr
,"%s: Error: unknown option: %s\n", Argv0
, z
);
3504 fprintf(stderr
,"Use -help for a list of options.\n");
3510 /* Run just the command that follows the database name
3512 if( zFirstCmd
[0]=='.' ){
3513 rc
= do_meta_command(zFirstCmd
, &data
);
3517 rc
= shell_exec(data
.db
, zFirstCmd
, shell_callback
, &data
, &zErrMsg
);
3519 fprintf(stderr
,"Error: %s\n", zErrMsg
);
3520 return rc
!=0 ? rc
: 1;
3522 fprintf(stderr
,"Error: unable to process SQL \"%s\"\n", zFirstCmd
);
3527 /* Run commands received from standard input
3529 if( stdin_is_interactive
){
3534 "SQLite version %s %.19s\n" /*extra-version-info*/
3535 "Enter \".help\" for instructions\n"
3536 "Enter SQL statements terminated with a \";\"\n",
3537 sqlite3_libversion(), sqlite3_sourceid()
3539 zHome
= find_home_dir();
3541 nHistory
= strlen30(zHome
) + 20;
3542 if( (zHistory
= malloc(nHistory
))!=0 ){
3543 sqlite3_snprintf(nHistory
, zHistory
,"%s/.sqlite_history", zHome
);
3546 #if defined(HAVE_READLINE) && HAVE_READLINE==1
3547 if( zHistory
) read_history(zHistory
);
3549 rc
= process_input(&data
, 0);
3551 stifle_history(100);
3552 write_history(zHistory
);
3556 rc
= process_input(&data
, stdin
);
3559 set_table_name(&data
, 0);
3561 sqlite3_close(data
.db
);
3563 sqlite3_free(data
.zFreeOnClose
);