blob: 97167dc877c13310667294c266aaff0d2ac24f86 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** 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.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000068#ifndef access
69# define access(f,m) _access((f),(m))
70#endif
drh67ceaa62012-08-27 21:19:03 +000071#undef popen
drh53371f92013-07-25 17:07:03 +000072#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000073#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000074#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000075#else
drh4328c8b2003-04-26 02:50:11 +000076/* Make sure isatty() has a prototype.
77*/
drhb2acc3b2011-10-13 16:36:29 +000078extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000079
drh53371f92013-07-25 17:07:03 +000080/* popen and pclose are not C89 functions and so are sometimes omitted from
81** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000082extern FILE *popen(const char*,const char*);
83extern int pclose(FILE*);
84#endif
drh53371f92013-07-25 17:07:03 +000085
chw65d3c132007-11-12 21:09:10 +000086#if defined(_WIN32_WCE)
87/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
88 * thus we always assume that we have a console. That can be
89 * overridden with the -batch command line option.
90 */
91#define isatty(x) 1
92#endif
93
drhf0693c82011-10-11 20:41:54 +000094/* ctype macros that work with signed characters */
95#define IsSpace(X) isspace((unsigned char)X)
96#define IsDigit(X) isdigit((unsigned char)X)
97#define ToLower(X) (char)tolower((unsigned char)X)
98
drh43408312013-10-30 12:43:36 +000099
100/* True if the timer is enabled */
101static int enableTimer = 0;
102
103/* Return the current wall-clock time */
104static sqlite3_int64 timeOfDay(void){
105 static sqlite3_vfs *clockVfs = 0;
106 sqlite3_int64 t;
107 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
108 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
109 clockVfs->xCurrentTimeInt64(clockVfs, &t);
110 }else{
111 double r;
112 clockVfs->xCurrentTime(clockVfs, &r);
113 t = (sqlite3_int64)(r*86400000.0);
114 }
115 return t;
116}
117
drhd5d0f642013-02-20 00:54:21 +0000118#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
119 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000120#include <sys/time.h>
121#include <sys/resource.h>
122
drhda108222009-02-25 19:07:24 +0000123/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000124static struct rusage sBegin; /* CPU time at start */
125static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000126
drhda108222009-02-25 19:07:24 +0000127/*
128** Begin timing an operation
129*/
130static void beginTimer(void){
131 if( enableTimer ){
132 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000133 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000134 }
135}
136
137/* Return the difference of two time_structs in seconds */
138static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
139 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
140 (double)(pEnd->tv_sec - pStart->tv_sec);
141}
142
143/*
144** Print the timing results.
145*/
146static void endTimer(void){
147 if( enableTimer ){
148 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000149 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000150 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000151 printf("Run Time: real %.3f user %f sys %f\n",
152 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000153 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
154 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
155 }
156}
shaneb320ccd2009-10-21 03:42:58 +0000157
drhda108222009-02-25 19:07:24 +0000158#define BEGIN_TIMER beginTimer()
159#define END_TIMER endTimer()
160#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000161
162#elif (defined(_WIN32) || defined(WIN32))
163
164#include <windows.h>
165
166/* Saved resource information for the beginning of an operation */
167static HANDLE hProcess;
168static FILETIME ftKernelBegin;
169static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000170static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000171typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
172static GETPROCTIMES getProcessTimesAddr = NULL;
173
shaneb320ccd2009-10-21 03:42:58 +0000174/*
175** Check to see if we have timer support. Return 1 if necessary
176** support found (or found previously).
177*/
178static int hasTimer(void){
179 if( getProcessTimesAddr ){
180 return 1;
181 } else {
182 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
183 ** See if the version we are running on has it, and if it does, save off
184 ** a pointer to it and the current process handle.
185 */
186 hProcess = GetCurrentProcess();
187 if( hProcess ){
188 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
189 if( NULL != hinstLib ){
190 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
191 if( NULL != getProcessTimesAddr ){
192 return 1;
193 }
194 FreeLibrary(hinstLib);
195 }
196 }
197 }
198 return 0;
199}
200
201/*
202** Begin timing an operation
203*/
204static void beginTimer(void){
205 if( enableTimer && getProcessTimesAddr ){
206 FILETIME ftCreation, ftExit;
207 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000208 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000209 }
210}
211
212/* Return the difference of two FILETIME structs in seconds */
213static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
214 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
215 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
216 return (double) ((i64End - i64Start) / 10000000.0);
217}
218
219/*
220** Print the timing results.
221*/
222static void endTimer(void){
223 if( enableTimer && getProcessTimesAddr){
224 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000225 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000226 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000227 printf("Run Time: real %.3f user %f sys %f\n",
228 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000229 timeDiff(&ftUserBegin, &ftUserEnd),
230 timeDiff(&ftKernelBegin, &ftKernelEnd));
231 }
232}
233
234#define BEGIN_TIMER beginTimer()
235#define END_TIMER endTimer()
236#define HAS_TIMER hasTimer()
237
drhda108222009-02-25 19:07:24 +0000238#else
239#define BEGIN_TIMER
240#define END_TIMER
241#define HAS_TIMER 0
242#endif
243
shanec0688ea2009-03-05 03:48:06 +0000244/*
245** Used to prevent warnings about unused parameters
246*/
247#define UNUSED_PARAMETER(x) (void)(x)
248
drhe91d16b2008-12-08 18:27:31 +0000249/*
drhc49f44e2006-10-26 18:15:42 +0000250** If the following flag is set, then command execution stops
251** at an error if we are not interactive.
252*/
253static int bail_on_error = 0;
254
255/*
drhc28490c2006-10-26 14:25:58 +0000256** Threat stdin as an interactive input if the following variable
257** is true. Otherwise, assume stdin is connected to a file or pipe.
258*/
259static int stdin_is_interactive = 1;
260
261/*
drh4c504392000-10-16 22:06:40 +0000262** The following is the open SQLite database. We make a pointer
263** to this database a static variable so that it can be accessed
264** by the SIGINT handler to interrupt database processing.
265*/
danielk197792f9a1b2004-06-19 09:08:16 +0000266static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000267
268/*
drh67505e72002-04-19 12:34:06 +0000269** True if an interrupt (Control-C) has been received.
270*/
drh43617e92006-03-06 20:55:46 +0000271static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000272
273/*
persicom7e2dfdd2002-04-18 02:46:52 +0000274** This is the name of our program. It is set in main(), used
275** in a number of other places, mostly for error messages.
276*/
277static char *Argv0;
278
279/*
280** Prompt strings. Initialized in main. Settable with
281** .prompt main continue
282*/
283static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
284static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
285
drhb0603412007-02-28 04:47:26 +0000286/*
287** Write I/O traces to the following stream.
288*/
rsebe0a9092007-07-30 18:24:38 +0000289#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000290static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000291#endif
drhb0603412007-02-28 04:47:26 +0000292
293/*
294** This routine works like printf in that its first argument is a
295** format string and subsequent arguments are values to be substituted
296** in place of % fields. The result of formatting this string
297** is written to iotrace.
298*/
rsebe0a9092007-07-30 18:24:38 +0000299#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000300static void iotracePrintf(const char *zFormat, ...){
301 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000302 char *z;
drhb0603412007-02-28 04:47:26 +0000303 if( iotrace==0 ) return;
304 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000305 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000306 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000307 fprintf(iotrace, "%s", z);
308 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000309}
rsebe0a9092007-07-30 18:24:38 +0000310#endif
drhb0603412007-02-28 04:47:26 +0000311
drh44c2eb12003-04-30 11:38:26 +0000312
persicom7e2dfdd2002-04-18 02:46:52 +0000313/*
drh83965662003-04-17 02:54:13 +0000314** Determines if a string is a number of not.
315*/
danielk19772e588c72005-12-09 14:25:08 +0000316static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000317 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000318 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000319 return 0;
320 }
321 z++;
322 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000323 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='.' ){
325 z++;
drhf0693c82011-10-11 20:41:54 +0000326 if( !IsDigit(*z) ) return 0;
327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( realnum ) *realnum = 1;
329 }
330 if( *z=='e' || *z=='E' ){
331 z++;
332 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 return *z==0;
338}
drh83965662003-04-17 02:54:13 +0000339
340/*
danielk1977bc6ada42004-06-30 08:20:16 +0000341** A global char* and an SQL function to access its current value
342** from within an SQL statement. This program used to use the
343** sqlite_exec_printf() API to substitue a string into an SQL statement.
344** The correct way to do this with sqlite3 is to use the bind API, but
345** since the shell is built around the callback paradigm it would be a lot
346** of work. Instead just use this hack, which is quite harmless.
347*/
348static const char *zShellStatic = 0;
349static void shellstaticFunc(
350 sqlite3_context *context,
351 int argc,
352 sqlite3_value **argv
353){
354 assert( 0==argc );
355 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000356 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000357 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000358 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
359}
360
361
362/*
drhfeac5f82004-08-01 00:10:45 +0000363** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000364** the text in memory obtained from malloc() and returns a pointer
365** to the text. NULL is returned at end of file, or if malloc()
366** fails.
367**
drh9f099fd2013-08-06 14:01:46 +0000368** If zLine is not NULL then it is a malloced buffer returned from
369** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000370*/
drh9f099fd2013-08-06 14:01:46 +0000371static char *local_getline(char *zLine, FILE *in){
372 int nLine = zLine==0 ? 0 : 100;
373 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000374
drhb07028f2011-10-14 21:49:18 +0000375 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000376 if( n+100>nLine ){
377 nLine = nLine*2 + 100;
378 zLine = realloc(zLine, nLine);
379 if( zLine==0 ) return 0;
380 }
drhdaffd0e2001-04-11 14:28:42 +0000381 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000382 if( n==0 ){
383 free(zLine);
384 return 0;
385 }
386 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000387 break;
388 }
drh9f099fd2013-08-06 14:01:46 +0000389 while( zLine[n] ) n++;
390 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000391 n--;
shaneh13b36022009-12-17 21:07:15 +0000392 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000393 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000394 break;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 }
drh8e7e7a22000-05-30 18:45:23 +0000397 return zLine;
398}
399
400/*
drhc28490c2006-10-26 14:25:58 +0000401** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000402**
drh9f099fd2013-08-06 14:01:46 +0000403** If in==0 then read from standard input and prompt before each line.
404** If isContinuation is true, then a continuation prompt is appropriate.
405** If isContinuation is zero, then the main prompt should be used.
406**
407** If zPrior is not NULL then it is a buffer from a prior call to this
408** routine that can be reused.
409**
410** The result is stored in space obtained from malloc() and must either
411** be freed by the caller or else passed back into this routine via the
412** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000413*/
drh9f099fd2013-08-06 14:01:46 +0000414static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000415 char *zPrompt;
416 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000417 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000418 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000419 }else{
drh9f099fd2013-08-06 14:01:46 +0000420 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000421#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000422 free(zPrior);
423 zResult = readline(zPrompt);
424 if( zResult && *zResult ) add_history(zResult);
425#else
426 printf("%s", zPrompt);
427 fflush(stdout);
428 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000429#endif
drh9f099fd2013-08-06 14:01:46 +0000430 }
drh8e7e7a22000-05-30 18:45:23 +0000431 return zResult;
432}
433
persicom7e2dfdd2002-04-18 02:46:52 +0000434struct previous_mode_data {
435 int valid; /* Is there legit data in here? */
436 int mode;
437 int showHeader;
438 int colWidth[100];
439};
drh45e29d82006-11-20 16:21:10 +0000440
drh8e7e7a22000-05-30 18:45:23 +0000441/*
drh75897232000-05-29 14:26:00 +0000442** An pointer to an instance of this structure is passed from
443** the main program to the callback. This is used to communicate
444** state and mode information.
445*/
446struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000447 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000448 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000449 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000450 int statsOn; /* True to display memory stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +0000451 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000452 int cnt; /* Number of records displayed so far */
453 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000454 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000455 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000456 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000457 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000458 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000459 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000460 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000461 int colWidth[100]; /* Requested width of each column when in column mode*/
462 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000463 char nullvalue[20]; /* The text to print when a NULL comes back from
464 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000465 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000466 /* Holds the mode information just before
467 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000468 char outfile[FILENAME_MAX]; /* Filename for *out */
469 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000470 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000471 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000472 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000473 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000474 int *aiIndent; /* Array of indents used in MODE_Explain */
475 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000476 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000477};
478
479/*
480** These are the allowed modes.
481*/
drh967e8b72000-06-21 13:59:10 +0000482#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000483#define MODE_Column 1 /* One record per line in neat columns */
484#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000485#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
486#define MODE_Html 4 /* Generate an XHTML table */
487#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000488#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000489#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000490#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000491
drh66ce4d02008-02-15 17:38:06 +0000492static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000493 "line",
494 "column",
495 "list",
496 "semi",
497 "html",
drhfeac5f82004-08-01 00:10:45 +0000498 "insert",
499 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000500 "csv",
drh66ce4d02008-02-15 17:38:06 +0000501 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000502};
drh75897232000-05-29 14:26:00 +0000503
504/*
505** Number of elements in an array
506*/
drh902b9ee2008-12-05 17:17:07 +0000507#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000508
509/*
drhea678832008-12-10 19:26:22 +0000510** Compute a string length that is limited to what can be stored in
511** lower 30 bits of a 32-bit signed integer.
512*/
drh4f21c4a2008-12-10 22:15:00 +0000513static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000514 const char *z2 = z;
515 while( *z2 ){ z2++; }
516 return 0x3fffffff & (int)(z2 - z);
517}
518
519/*
drh127f9d72010-02-23 01:47:00 +0000520** A callback for the sqlite3_log() interface.
521*/
522static void shellLog(void *pArg, int iErrCode, const char *zMsg){
523 struct callback_data *p = (struct callback_data*)pArg;
524 if( p->pLog==0 ) return;
525 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
526 fflush(p->pLog);
527}
528
529/*
shane626a6e42009-10-22 17:30:15 +0000530** Output the given string as a hex-encoded blob (eg. X'1234' )
531*/
532static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
533 int i;
534 char *zBlob = (char *)pBlob;
535 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000536 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000537 fprintf(out,"'");
538}
539
540/*
drh28bd4bc2000-06-15 15:57:22 +0000541** Output the given string as a quoted string using SQL quoting conventions.
542*/
543static void output_quoted_string(FILE *out, const char *z){
544 int i;
545 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000546 for(i=0; z[i]; i++){
547 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000548 }
549 if( nSingle==0 ){
550 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000551 }else{
552 fprintf(out,"'");
553 while( *z ){
554 for(i=0; z[i] && z[i]!='\''; i++){}
555 if( i==0 ){
556 fprintf(out,"''");
557 z++;
558 }else if( z[i]=='\'' ){
559 fprintf(out,"%.*s''",i,z);
560 z += i+1;
561 }else{
drhcd7d2732002-02-26 23:24:26 +0000562 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000563 break;
564 }
565 }
drhcd7d2732002-02-26 23:24:26 +0000566 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000567 }
568}
569
570/*
drhfeac5f82004-08-01 00:10:45 +0000571** Output the given string as a quoted according to C or TCL quoting rules.
572*/
573static void output_c_string(FILE *out, const char *z){
574 unsigned int c;
575 fputc('"', out);
576 while( (c = *(z++))!=0 ){
577 if( c=='\\' ){
578 fputc(c, out);
579 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000580 }else if( c=='"' ){
581 fputc('\\', out);
582 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000583 }else if( c=='\t' ){
584 fputc('\\', out);
585 fputc('t', out);
586 }else if( c=='\n' ){
587 fputc('\\', out);
588 fputc('n', out);
589 }else if( c=='\r' ){
590 fputc('\\', out);
591 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000592 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000593 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000594 }else{
595 fputc(c, out);
596 }
597 }
598 fputc('"', out);
599}
600
601/*
drhc08a4f12000-06-15 16:49:48 +0000602** Output the given string with characters that are special to
603** HTML escaped.
604*/
605static void output_html_string(FILE *out, const char *z){
606 int i;
drhc3d6ba42014-01-13 20:38:35 +0000607 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000608 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000609 for(i=0; z[i]
610 && z[i]!='<'
611 && z[i]!='&'
612 && z[i]!='>'
613 && z[i]!='\"'
614 && z[i]!='\'';
615 i++){}
drhc08a4f12000-06-15 16:49:48 +0000616 if( i>0 ){
617 fprintf(out,"%.*s",i,z);
618 }
619 if( z[i]=='<' ){
620 fprintf(out,"&lt;");
621 }else if( z[i]=='&' ){
622 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000623 }else if( z[i]=='>' ){
624 fprintf(out,"&gt;");
625 }else if( z[i]=='\"' ){
626 fprintf(out,"&quot;");
627 }else if( z[i]=='\'' ){
628 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000629 }else{
630 break;
631 }
632 z += i + 1;
633 }
634}
635
636/*
drhc49f44e2006-10-26 18:15:42 +0000637** If a field contains any character identified by a 1 in the following
638** array, then the string must be quoted for CSV.
639*/
640static const char needCsvQuote[] = {
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
648 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
656 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
657};
658
659/*
drh8e64d1c2004-10-07 00:32:39 +0000660** Output a single term of CSV. Actually, p->separator is used for
661** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000662** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000663*/
664static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000665 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000666 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000667 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000668 }else{
drhc49f44e2006-10-26 18:15:42 +0000669 int i;
drh4f21c4a2008-12-10 22:15:00 +0000670 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000671 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000672 if( needCsvQuote[((unsigned char*)z)[i]]
673 || (z[i]==p->separator[0] &&
674 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000675 i = 0;
676 break;
677 }
678 }
679 if( i==0 ){
680 putc('"', out);
681 for(i=0; z[i]; i++){
682 if( z[i]=='"' ) putc('"', out);
683 putc(z[i], out);
684 }
685 putc('"', out);
686 }else{
687 fprintf(out, "%s", z);
688 }
drh8e64d1c2004-10-07 00:32:39 +0000689 }
690 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000691 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000692 }
693}
694
danielk19774af00c62005-01-23 23:43:21 +0000695#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000696/*
drh4c504392000-10-16 22:06:40 +0000697** This routine runs when the user presses Ctrl-C
698*/
699static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000700 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000701 seenInterrupt++;
702 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000703 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000704}
danielk19774af00c62005-01-23 23:43:21 +0000705#endif
drh4c504392000-10-16 22:06:40 +0000706
707/*
shane626a6e42009-10-22 17:30:15 +0000708** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000709** invokes for each row of a query result.
710*/
shane626a6e42009-10-22 17:30:15 +0000711static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000712 int i;
713 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000714
drh75897232000-05-29 14:26:00 +0000715 switch( p->mode ){
716 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000717 int w = 5;
drh6a535342001-10-19 16:44:56 +0000718 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000719 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000720 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000721 if( len>w ) w = len;
722 }
drh75897232000-05-29 14:26:00 +0000723 if( p->cnt++>0 ) fprintf(p->out,"\n");
724 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000725 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000726 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000727 }
728 break;
729 }
danielk19770d78bae2008-01-03 07:09:48 +0000730 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000731 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000732 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000733 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000734 int w, n;
735 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000736 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000737 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000738 w = 0;
drh75897232000-05-29 14:26:00 +0000739 }
drh078b1fd2012-09-21 13:40:02 +0000740 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000741 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000742 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000743 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000744 if( w<n ) w = n;
745 }
746 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000747 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000748 }
749 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000750 if( w<0 ){
751 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
752 }else{
753 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
754 }
drha0c66f52000-07-29 13:20:21 +0000755 }
756 }
757 if( p->showHeader ){
758 for(i=0; i<nArg; i++){
759 int w;
760 if( i<ArraySize(p->actualWidth) ){
761 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000762 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000763 }else{
764 w = 10;
765 }
766 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
767 "----------------------------------------------------------",
768 i==nArg-1 ? "\n": " ");
769 }
drh75897232000-05-29 14:26:00 +0000770 }
771 }
drh6a535342001-10-19 16:44:56 +0000772 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000773 for(i=0; i<nArg; i++){
774 int w;
drha0c66f52000-07-29 13:20:21 +0000775 if( i<ArraySize(p->actualWidth) ){
776 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000777 }else{
778 w = 10;
779 }
dana98bf362013-11-13 18:35:01 +0000780 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000781 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000782 }
dana98bf362013-11-13 18:35:01 +0000783 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000784 if( p->iIndent<p->nIndent ){
785 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000786 }
danc4650bb2013-11-18 08:41:06 +0000787 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000788 }
drh078b1fd2012-09-21 13:40:02 +0000789 if( w<0 ){
790 fprintf(p->out,"%*.*s%s",-w,-w,
791 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
792 }else{
793 fprintf(p->out,"%-*.*s%s",w,w,
794 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
795 }
drh75897232000-05-29 14:26:00 +0000796 }
797 break;
798 }
drhe3710332000-09-29 13:30:53 +0000799 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000800 case MODE_List: {
801 if( p->cnt++==0 && p->showHeader ){
802 for(i=0; i<nArg; i++){
803 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
804 }
805 }
drh6a535342001-10-19 16:44:56 +0000806 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000807 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000808 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000809 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000810 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000811 if( i<nArg-1 ){
812 fprintf(p->out, "%s", p->separator);
813 }else if( p->mode==MODE_Semi ){
814 fprintf(p->out, ";\n");
815 }else{
816 fprintf(p->out, "\n");
817 }
drh75897232000-05-29 14:26:00 +0000818 }
819 break;
820 }
drh1e5d0e92000-05-31 23:33:17 +0000821 case MODE_Html: {
822 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000823 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000824 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000825 fprintf(p->out,"<TH>");
826 output_html_string(p->out, azCol[i]);
827 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000828 }
mihailim57c591a2008-06-23 21:26:05 +0000829 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000830 }
drh6a535342001-10-19 16:44:56 +0000831 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000832 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000833 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000834 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000835 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000836 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000837 }
mihailim57c591a2008-06-23 21:26:05 +0000838 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000839 break;
840 }
drhfeac5f82004-08-01 00:10:45 +0000841 case MODE_Tcl: {
842 if( p->cnt++==0 && p->showHeader ){
843 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000844 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000845 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000846 }
847 fprintf(p->out,"\n");
848 }
849 if( azArg==0 ) break;
850 for(i=0; i<nArg; i++){
851 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000852 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000853 }
854 fprintf(p->out,"\n");
855 break;
856 }
drh8e64d1c2004-10-07 00:32:39 +0000857 case MODE_Csv: {
858 if( p->cnt++==0 && p->showHeader ){
859 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000860 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000861 }
862 fprintf(p->out,"\n");
863 }
864 if( azArg==0 ) break;
865 for(i=0; i<nArg; i++){
866 output_csv(p, azArg[i], i<nArg-1);
867 }
868 fprintf(p->out,"\n");
869 break;
870 }
drh28bd4bc2000-06-15 15:57:22 +0000871 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000872 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000873 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000874 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000875 for(i=0; i<nArg; i++){
876 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000877 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000878 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000879 }else if( aiType && aiType[i]==SQLITE_TEXT ){
880 if( zSep[0] ) fprintf(p->out,"%s",zSep);
881 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +0000882 }else if( aiType && (aiType[i]==SQLITE_INTEGER
883 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +0000884 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000885 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
886 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
887 int nBlob = sqlite3_column_bytes(p->pStmt, i);
888 if( zSep[0] ) fprintf(p->out,"%s",zSep);
889 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000890 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000891 fprintf(p->out,"%s%s",zSep, azArg[i]);
892 }else{
893 if( zSep[0] ) fprintf(p->out,"%s",zSep);
894 output_quoted_string(p->out, azArg[i]);
895 }
896 }
897 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000898 break;
drh28bd4bc2000-06-15 15:57:22 +0000899 }
persicom1d0b8722002-04-18 02:53:04 +0000900 }
drh75897232000-05-29 14:26:00 +0000901 return 0;
902}
903
904/*
shane626a6e42009-10-22 17:30:15 +0000905** This is the callback routine that the SQLite library
906** invokes for each row of a query result.
907*/
908static int callback(void *pArg, int nArg, char **azArg, char **azCol){
909 /* since we don't have type info, call the shell_callback with a NULL value */
910 return shell_callback(pArg, nArg, azArg, azCol, NULL);
911}
912
913/*
drh33048c02001-10-01 14:29:22 +0000914** Set the destination table field of the callback_data structure to
915** the name of the table given. Escape any quote characters in the
916** table name.
917*/
918static void set_table_name(struct callback_data *p, const char *zName){
919 int i, n;
920 int needQuote;
921 char *z;
922
923 if( p->zDestTable ){
924 free(p->zDestTable);
925 p->zDestTable = 0;
926 }
927 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000928 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000929 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000930 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000931 needQuote = 1;
932 if( zName[i]=='\'' ) n++;
933 }
934 }
935 if( needQuote ) n += 2;
936 z = p->zDestTable = malloc( n+1 );
937 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000938 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000939 exit(1);
940 }
941 n = 0;
942 if( needQuote ) z[n++] = '\'';
943 for(i=0; zName[i]; i++){
944 z[n++] = zName[i];
945 if( zName[i]=='\'' ) z[n++] = '\'';
946 }
947 if( needQuote ) z[n++] = '\'';
948 z[n] = 0;
949}
950
danielk19772a02e332004-06-05 08:04:36 +0000951/* zIn is either a pointer to a NULL-terminated string in memory obtained
952** from malloc(), or a NULL pointer. The string pointed to by zAppend is
953** added to zIn, and the result returned in memory obtained from malloc().
954** zIn, if it was not NULL, is freed.
955**
956** If the third argument, quote, is not '\0', then it is used as a
957** quote character for zAppend.
958*/
drhc28490c2006-10-26 14:25:58 +0000959static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000960 int len;
961 int i;
drh4f21c4a2008-12-10 22:15:00 +0000962 int nAppend = strlen30(zAppend);
963 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000964
965 len = nAppend+nIn+1;
966 if( quote ){
967 len += 2;
968 for(i=0; i<nAppend; i++){
969 if( zAppend[i]==quote ) len++;
970 }
971 }
972
973 zIn = (char *)realloc(zIn, len);
974 if( !zIn ){
975 return 0;
976 }
977
978 if( quote ){
979 char *zCsr = &zIn[nIn];
980 *zCsr++ = quote;
981 for(i=0; i<nAppend; i++){
982 *zCsr++ = zAppend[i];
983 if( zAppend[i]==quote ) *zCsr++ = quote;
984 }
985 *zCsr++ = quote;
986 *zCsr++ = '\0';
987 assert( (zCsr-zIn)==len );
988 }else{
989 memcpy(&zIn[nIn], zAppend, nAppend);
990 zIn[len-1] = '\0';
991 }
992
993 return zIn;
994}
995
drhdd3d4592004-08-30 01:54:05 +0000996
997/*
drhb21a8e42012-01-28 21:08:51 +0000998** Execute a query statement that will generate SQL output. Print
999** the result columns, comma-separated, on a line and then add a
1000** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001001**
drhb21a8e42012-01-28 21:08:51 +00001002** If the number of columns is 1 and that column contains text "--"
1003** then write the semicolon on a separate line. That way, if a
1004** "--" comment occurs at the end of the statement, the comment
1005** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001006*/
drh157e29a2009-05-21 15:15:00 +00001007static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001008 struct callback_data *p, /* Query context */
1009 const char *zSelect, /* SELECT statement to extract content */
1010 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001011){
drhdd3d4592004-08-30 01:54:05 +00001012 sqlite3_stmt *pSelect;
1013 int rc;
drhb21a8e42012-01-28 21:08:51 +00001014 int nResult;
1015 int i;
1016 const char *z;
drhc7181902014-02-27 15:04:13 +00001017 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001018 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001019 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001020 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001021 return rc;
1022 }
1023 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001024 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001025 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001026 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001027 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001028 zFirstRow = 0;
1029 }
drhb21a8e42012-01-28 21:08:51 +00001030 z = (const char*)sqlite3_column_text(pSelect, 0);
1031 fprintf(p->out, "%s", z);
1032 for(i=1; i<nResult; i++){
1033 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1034 }
1035 if( z==0 ) z = "";
1036 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1037 if( z[0] ){
1038 fprintf(p->out, "\n;\n");
1039 }else{
1040 fprintf(p->out, ";\n");
1041 }
drhdd3d4592004-08-30 01:54:05 +00001042 rc = sqlite3_step(pSelect);
1043 }
drh2f464a02011-10-13 00:41:49 +00001044 rc = sqlite3_finalize(pSelect);
1045 if( rc!=SQLITE_OK ){
1046 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001047 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001048 }
1049 return rc;
drhdd3d4592004-08-30 01:54:05 +00001050}
1051
shane626a6e42009-10-22 17:30:15 +00001052/*
1053** Allocate space and save off current error string.
1054*/
1055static char *save_err_msg(
1056 sqlite3 *db /* Database to query */
1057){
1058 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1059 char *zErrMsg = sqlite3_malloc(nErrMsg);
1060 if( zErrMsg ){
1061 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1062 }
1063 return zErrMsg;
1064}
1065
1066/*
shaneh642d8b82010-07-28 16:05:34 +00001067** Display memory stats.
1068*/
1069static int display_stats(
1070 sqlite3 *db, /* Database to query */
1071 struct callback_data *pArg, /* Pointer to struct callback_data */
1072 int bReset /* True to reset the stats */
1073){
1074 int iCur;
1075 int iHiwtr;
1076
1077 if( pArg && pArg->out ){
1078
1079 iHiwtr = iCur = -1;
1080 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001081 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001082 iHiwtr = iCur = -1;
1083 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001084 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001085/*
1086** Not currently used by the CLI.
1087** iHiwtr = iCur = -1;
1088** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1089** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1090*/
1091 iHiwtr = iCur = -1;
1092 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1093 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1094/*
1095** Not currently used by the CLI.
1096** iHiwtr = iCur = -1;
1097** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1098** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1099*/
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1106 iHiwtr = iCur = -1;
1107 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1108 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1109 iHiwtr = iCur = -1;
1110 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1111 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1112#ifdef YYTRACKMAXSTACKDEPTH
1113 iHiwtr = iCur = -1;
1114 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1116#endif
1117 }
1118
1119 if( pArg && pArg->out && db ){
1120 iHiwtr = iCur = -1;
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1122 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001123 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1124 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1125 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1126 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1127 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1128 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001129 iHiwtr = iCur = -1;
1130 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001131 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1134 iHiwtr = iCur = -1;
1135 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1136 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001137 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001138 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1139 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1140 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001141 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1142 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1143 iHiwtr = iCur = -1;
1144 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1145 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1146 }
1147
1148 if( pArg && pArg->out && db && pArg->pStmt ){
1149 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1150 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1151 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1152 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1153 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1154 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001155 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1156 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001157 }
1158
1159 return 0;
1160}
1161
1162/*
dana98bf362013-11-13 18:35:01 +00001163** Parameter azArray points to a zero-terminated array of strings. zStr
1164** points to a single nul-terminated string. Return non-zero if zStr
1165** is equal, according to strcmp(), to any of the strings in the array.
1166** Otherwise, return zero.
1167*/
1168static int str_in_array(const char *zStr, const char **azArray){
1169 int i;
1170 for(i=0; azArray[i]; i++){
1171 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1172 }
1173 return 0;
1174}
1175
1176/*
1177** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1178** and populate the callback_data.aiIndent[] array with the number of
1179** spaces each opcode should be indented before it is output.
1180**
1181** The indenting rules are:
1182**
1183** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1184** all opcodes that occur between the p2 jump destination and the opcode
1185** itself by 2 spaces.
1186**
drh01752bc2013-11-14 23:59:33 +00001187** * For each "Goto", if the jump destination is earlier in the program
1188** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001189** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001190** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001191** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001192** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001193*/
1194static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1195 const char *zSql; /* The text of the SQL statement */
1196 const char *z; /* Used to check if this is an EXPLAIN */
1197 int *abYield = 0; /* True if op is an OP_Yield */
1198 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001199 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001200
drh8ad0de32014-03-20 18:45:27 +00001201 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1202 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001203 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001204 const char *azGoto[] = { "Goto", 0 };
1205
1206 /* Try to figure out if this is really an EXPLAIN statement. If this
1207 ** cannot be verified, return early. */
1208 zSql = sqlite3_sql(pSql);
1209 if( zSql==0 ) return;
1210 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1211 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1212
1213 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1214 int i;
danc4650bb2013-11-18 08:41:06 +00001215 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001216 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001217
1218 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1219 ** p2 is an instruction address, set variable p2op to the index of that
1220 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1221 ** the current instruction is part of a sub-program generated by an
1222 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001223 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001224 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001225
1226 /* Grow the p->aiIndent array as required */
1227 if( iOp>=nAlloc ){
1228 nAlloc += 100;
1229 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1230 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1231 }
1232 abYield[iOp] = str_in_array(zOp, azYield);
1233 p->aiIndent[iOp] = 0;
1234 p->nIndent = iOp+1;
1235
1236 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001237 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001238 }
drhfe705102014-03-06 13:38:37 +00001239 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1240 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1241 ){
drhe73f0592014-01-21 22:25:45 +00001242 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001243 }
1244 }
1245
danc4650bb2013-11-18 08:41:06 +00001246 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001247 sqlite3_free(abYield);
1248 sqlite3_reset(pSql);
1249}
1250
1251/*
1252** Free the array allocated by explain_data_prepare().
1253*/
1254static void explain_data_delete(struct callback_data *p){
1255 sqlite3_free(p->aiIndent);
1256 p->aiIndent = 0;
1257 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001258 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001259}
1260
1261/*
shane626a6e42009-10-22 17:30:15 +00001262** Execute a statement or set of statements. Print
1263** any result rows/columns depending on the current mode
1264** set via the supplied callback.
1265**
1266** This is very similar to SQLite's built-in sqlite3_exec()
1267** function except it takes a slightly different callback
1268** and callback data argument.
1269*/
1270static int shell_exec(
1271 sqlite3 *db, /* An open database */
1272 const char *zSql, /* SQL to be evaluated */
1273 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1274 /* (not the same as sqlite3_exec) */
1275 struct callback_data *pArg, /* Pointer to struct callback_data */
1276 char **pzErrMsg /* Error msg written here */
1277){
dan4564ced2010-01-05 04:59:56 +00001278 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1279 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001280 int rc2;
dan4564ced2010-01-05 04:59:56 +00001281 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001282
1283 if( pzErrMsg ){
1284 *pzErrMsg = NULL;
1285 }
1286
shaneb9fc17d2009-10-22 21:23:35 +00001287 while( zSql[0] && (SQLITE_OK == rc) ){
1288 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1289 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001290 if( pzErrMsg ){
1291 *pzErrMsg = save_err_msg(db);
1292 }
1293 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001294 if( !pStmt ){
1295 /* this happens for a comment or white-space */
1296 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001297 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001298 continue;
1299 }
shane626a6e42009-10-22 17:30:15 +00001300
shaneh642d8b82010-07-28 16:05:34 +00001301 /* save off the prepared statment handle and reset row count */
1302 if( pArg ){
1303 pArg->pStmt = pStmt;
1304 pArg->cnt = 0;
1305 }
1306
shanehb7977c52010-01-18 18:17:10 +00001307 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001308 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001309 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001310 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001311 }
shanehb7977c52010-01-18 18:17:10 +00001312
drhefbf3b12014-02-28 20:47:24 +00001313 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1314 if( pArg && pArg->autoEQP ){
1315 sqlite3_stmt *pExplain;
1316 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1317 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1318 if( rc==SQLITE_OK ){
1319 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1320 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1321 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1322 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1323 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1324 }
1325 }
1326 sqlite3_finalize(pExplain);
1327 sqlite3_free(zEQP);
1328 }
1329
drh7e02e5e2011-12-06 19:44:51 +00001330 /* Output TESTCTRL_EXPLAIN text of requested */
1331 if( pArg && pArg->mode==MODE_Explain ){
1332 const char *zExplain = 0;
1333 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1334 if( zExplain && zExplain[0] ){
1335 fprintf(pArg->out, "%s", zExplain);
1336 }
1337 }
1338
dana98bf362013-11-13 18:35:01 +00001339 /* If the shell is currently in ".explain" mode, gather the extra
1340 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001341 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001342 explain_data_prepare(pArg, pStmt);
1343 }
1344
shaneb9fc17d2009-10-22 21:23:35 +00001345 /* perform the first step. this will tell us if we
1346 ** have a result set or not and how wide it is.
1347 */
1348 rc = sqlite3_step(pStmt);
1349 /* if we have a result set... */
1350 if( SQLITE_ROW == rc ){
1351 /* if we have a callback... */
1352 if( xCallback ){
1353 /* allocate space for col name ptr, value ptr, and type */
1354 int nCol = sqlite3_column_count(pStmt);
1355 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1356 if( !pData ){
1357 rc = SQLITE_NOMEM;
1358 }else{
1359 char **azCols = (char **)pData; /* Names of result columns */
1360 char **azVals = &azCols[nCol]; /* Results */
1361 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001362 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001363 assert(sizeof(int) <= sizeof(char *));
1364 /* save off ptrs to column names */
1365 for(i=0; i<nCol; i++){
1366 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1367 }
shaneb9fc17d2009-10-22 21:23:35 +00001368 do{
1369 /* extract the data and data types */
1370 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001371 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001372 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001373 azVals[i] = "";
1374 }else{
1375 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1376 }
shaneb9fc17d2009-10-22 21:23:35 +00001377 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1378 rc = SQLITE_NOMEM;
1379 break; /* from for */
1380 }
1381 } /* end for */
1382
1383 /* if data and types extracted successfully... */
1384 if( SQLITE_ROW == rc ){
1385 /* call the supplied callback with the result row data */
1386 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1387 rc = SQLITE_ABORT;
1388 }else{
1389 rc = sqlite3_step(pStmt);
1390 }
1391 }
1392 } while( SQLITE_ROW == rc );
1393 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001394 }
1395 }else{
1396 do{
1397 rc = sqlite3_step(pStmt);
1398 } while( rc == SQLITE_ROW );
1399 }
1400 }
1401
dana98bf362013-11-13 18:35:01 +00001402 explain_data_delete(pArg);
1403
shaneh642d8b82010-07-28 16:05:34 +00001404 /* print usage stats if stats on */
1405 if( pArg && pArg->statsOn ){
1406 display_stats(db, pArg, 0);
1407 }
1408
dan4564ced2010-01-05 04:59:56 +00001409 /* Finalize the statement just executed. If this fails, save a
1410 ** copy of the error message. Otherwise, set zSql to point to the
1411 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001412 rc2 = sqlite3_finalize(pStmt);
1413 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001414 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001415 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001416 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001417 }else if( pzErrMsg ){
1418 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001419 }
shaneh642d8b82010-07-28 16:05:34 +00001420
1421 /* clear saved stmt handle */
1422 if( pArg ){
1423 pArg->pStmt = NULL;
1424 }
shane626a6e42009-10-22 17:30:15 +00001425 }
shaneb9fc17d2009-10-22 21:23:35 +00001426 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001427
1428 return rc;
1429}
1430
drhdd3d4592004-08-30 01:54:05 +00001431
drh33048c02001-10-01 14:29:22 +00001432/*
drh4c653a02000-06-07 01:27:47 +00001433** This is a different callback routine used for dumping the database.
1434** Each row received by this callback consists of a table name,
1435** the table type ("index" or "table") and SQL to create the table.
1436** This routine should print text sufficient to recreate the table.
1437*/
1438static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001439 int rc;
1440 const char *zTable;
1441 const char *zType;
1442 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001443 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001444 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001445
drh902b9ee2008-12-05 17:17:07 +00001446 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001447 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001448 zTable = azArg[0];
1449 zType = azArg[1];
1450 zSql = azArg[2];
1451
drh00b950d2005-09-11 02:03:03 +00001452 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001453 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001454 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001455 fprintf(p->out, "ANALYZE sqlite_master;\n");
1456 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1457 return 0;
drh45e29d82006-11-20 16:21:10 +00001458 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1459 char *zIns;
1460 if( !p->writableSchema ){
1461 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1462 p->writableSchema = 1;
1463 }
1464 zIns = sqlite3_mprintf(
1465 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1466 "VALUES('table','%q','%q',0,'%q');",
1467 zTable, zTable, zSql);
1468 fprintf(p->out, "%s\n", zIns);
1469 sqlite3_free(zIns);
1470 return 0;
drh00b950d2005-09-11 02:03:03 +00001471 }else{
1472 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001473 }
danielk19772a02e332004-06-05 08:04:36 +00001474
1475 if( strcmp(zType, "table")==0 ){
1476 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001477 char *zSelect = 0;
1478 char *zTableInfo = 0;
1479 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001480 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001481
1482 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1483 zTableInfo = appendText(zTableInfo, zTable, '"');
1484 zTableInfo = appendText(zTableInfo, ");", 0);
1485
drhc7181902014-02-27 15:04:13 +00001486 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001487 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001488 if( rc!=SQLITE_OK || !pTableInfo ){
1489 return 1;
1490 }
1491
1492 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001493 /* Always quote the table name, even if it appears to be pure ascii,
1494 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1495 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001496 if( zTmp ){
1497 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001498 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001499 }
1500 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1501 rc = sqlite3_step(pTableInfo);
1502 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001503 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001504 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001505 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001506 rc = sqlite3_step(pTableInfo);
1507 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001508 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001509 }else{
1510 zSelect = appendText(zSelect, ") ", 0);
1511 }
drh157e29a2009-05-21 15:15:00 +00001512 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001513 }
1514 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001515 if( rc!=SQLITE_OK || nRow==0 ){
1516 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001517 return 1;
1518 }
1519 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1520 zSelect = appendText(zSelect, zTable, '"');
1521
drh2f464a02011-10-13 00:41:49 +00001522 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001523 if( rc==SQLITE_CORRUPT ){
1524 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001525 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001526 }
drh85e72432012-04-11 11:38:53 +00001527 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001528 }
drh4c653a02000-06-07 01:27:47 +00001529 return 0;
1530}
1531
1532/*
drh45e29d82006-11-20 16:21:10 +00001533** Run zQuery. Use dump_callback() as the callback routine so that
1534** the contents of the query are output as SQL statements.
1535**
drhdd3d4592004-08-30 01:54:05 +00001536** If we get a SQLITE_CORRUPT error, rerun the query after appending
1537** "ORDER BY rowid DESC" to the end.
1538*/
1539static int run_schema_dump_query(
1540 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001541 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001542){
1543 int rc;
drh2f464a02011-10-13 00:41:49 +00001544 char *zErr = 0;
1545 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001546 if( rc==SQLITE_CORRUPT ){
1547 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001548 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001549 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1550 if( zErr ){
1551 fprintf(p->out, "/****** %s ******/\n", zErr);
1552 sqlite3_free(zErr);
1553 zErr = 0;
1554 }
drhdd3d4592004-08-30 01:54:05 +00001555 zQ2 = malloc( len+100 );
1556 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001557 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001558 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1559 if( rc ){
1560 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1561 }else{
1562 rc = SQLITE_CORRUPT;
1563 }
1564 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001565 free(zQ2);
1566 }
1567 return rc;
1568}
1569
1570/*
drh75897232000-05-29 14:26:00 +00001571** Text of a help message
1572*/
persicom1d0b8722002-04-18 02:53:04 +00001573static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001574 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001575 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001576 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001577 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001578 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001579 " If TABLE specified, only dump tables matching\n"
1580 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001581 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001582 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001583 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001584 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001585 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001586 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001587 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001588 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001589 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001590 ".indices ?TABLE? Show names of all indices\n"
1591 " If TABLE specified, only show indices for tables\n"
1592 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001593#ifdef SQLITE_ENABLE_IOTRACE
1594 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1595#endif
drh70df4fe2006-06-13 15:12:21 +00001596#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001597 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001598#endif
drh127f9d72010-02-23 01:47:00 +00001599 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001600 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001601 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001602 " column Left-aligned columns. (See .width)\n"
1603 " html HTML <table> code\n"
1604 " insert SQL insert statements for TABLE\n"
1605 " line One value per line\n"
1606 " list Values delimited by .separator string\n"
1607 " tabs Tab-separated values\n"
1608 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001609 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001610 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001611 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001612 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001613 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001614 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001615 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001616 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001617 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001618 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001619 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001620 " If TABLE specified, only show tables matching\n"
1621 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001622 ".separator STRING Change separator used by output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001623 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001624 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001625 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001626 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001627 ".tables ?TABLE? List names of tables\n"
1628 " If TABLE specified, only list tables matching\n"
1629 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001630 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001631 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001632 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001633 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001634 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001635 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001636;
1637
drhdaffd0e2001-04-11 14:28:42 +00001638/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001639static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001640
drh75897232000-05-29 14:26:00 +00001641/*
drh44c2eb12003-04-30 11:38:26 +00001642** Make sure the database is open. If it is not, then open it. If
1643** the database fails to open, print an error message and exit.
1644*/
drh05782482013-10-24 15:20:20 +00001645static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001646 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001647 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001648 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001649 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001650 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1651 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1652 shellstaticFunc, 0, 0);
1653 }
1654 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001655 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001656 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001657 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001658 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001659 }
drhc2e87a32006-06-27 15:16:14 +00001660#ifndef SQLITE_OMIT_LOAD_EXTENSION
1661 sqlite3_enable_load_extension(p->db, 1);
1662#endif
drh44c2eb12003-04-30 11:38:26 +00001663 }
1664}
1665
1666/*
drhfeac5f82004-08-01 00:10:45 +00001667** Do C-language style dequoting.
1668**
1669** \t -> tab
1670** \n -> newline
1671** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001672** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001673** \NNN -> ascii character NNN in octal
1674** \\ -> backslash
1675*/
1676static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001677 int i, j;
1678 char c;
drhc2ce0be2014-05-29 12:36:14 +00001679 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001680 for(i=j=0; (c = z[i])!=0; i++, j++){
1681 if( c=='\\' ){
1682 c = z[++i];
1683 if( c=='n' ){
1684 c = '\n';
1685 }else if( c=='t' ){
1686 c = '\t';
1687 }else if( c=='r' ){
1688 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001689 }else if( c=='\\' ){
1690 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001691 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001692 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001693 if( z[i+1]>='0' && z[i+1]<='7' ){
1694 i++;
1695 c = (c<<3) + z[i] - '0';
1696 if( z[i+1]>='0' && z[i+1]<='7' ){
1697 i++;
1698 c = (c<<3) + z[i] - '0';
1699 }
1700 }
1701 }
1702 }
1703 z[j] = c;
1704 }
drhc2ce0be2014-05-29 12:36:14 +00001705 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001706}
1707
1708/*
drh348d19c2013-06-03 12:47:43 +00001709** Return the value of a hexadecimal digit. Return -1 if the input
1710** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001711*/
drh348d19c2013-06-03 12:47:43 +00001712static int hexDigitValue(char c){
1713 if( c>='0' && c<='9' ) return c - '0';
1714 if( c>='a' && c<='f' ) return c - 'a' + 10;
1715 if( c>='A' && c<='F' ) return c - 'A' + 10;
1716 return -1;
drhc28490c2006-10-26 14:25:58 +00001717}
1718
1719/*
drh7d9f3942013-04-03 01:26:54 +00001720** Interpret zArg as an integer value, possibly with suffixes.
1721*/
1722static sqlite3_int64 integerValue(const char *zArg){
1723 sqlite3_int64 v = 0;
1724 static const struct { char *zSuffix; int iMult; } aMult[] = {
1725 { "KiB", 1024 },
1726 { "MiB", 1024*1024 },
1727 { "GiB", 1024*1024*1024 },
1728 { "KB", 1000 },
1729 { "MB", 1000000 },
1730 { "GB", 1000000000 },
1731 { "K", 1000 },
1732 { "M", 1000000 },
1733 { "G", 1000000000 },
1734 };
1735 int i;
1736 int isNeg = 0;
1737 if( zArg[0]=='-' ){
1738 isNeg = 1;
1739 zArg++;
1740 }else if( zArg[0]=='+' ){
1741 zArg++;
1742 }
drh348d19c2013-06-03 12:47:43 +00001743 if( zArg[0]=='0' && zArg[1]=='x' ){
1744 int x;
1745 zArg += 2;
1746 while( (x = hexDigitValue(zArg[0]))>=0 ){
1747 v = (v<<4) + x;
1748 zArg++;
1749 }
1750 }else{
1751 while( IsDigit(zArg[0]) ){
1752 v = v*10 + zArg[0] - '0';
1753 zArg++;
1754 }
drh7d9f3942013-04-03 01:26:54 +00001755 }
drhc2bed0a2013-05-24 11:57:50 +00001756 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001757 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1758 v *= aMult[i].iMult;
1759 break;
1760 }
1761 }
1762 return isNeg? -v : v;
1763}
1764
1765/*
drh348d19c2013-06-03 12:47:43 +00001766** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1767** for TRUE and FALSE. Return the integer value if appropriate.
1768*/
1769static int booleanValue(char *zArg){
1770 int i;
1771 if( zArg[0]=='0' && zArg[1]=='x' ){
1772 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1773 }else{
1774 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1775 }
1776 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1777 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1778 return 1;
1779 }
1780 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1781 return 0;
1782 }
1783 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1784 zArg);
1785 return 0;
1786}
1787
1788/*
drh42f64e52012-04-04 16:56:23 +00001789** Close an output file, assuming it is not stderr or stdout
1790*/
1791static void output_file_close(FILE *f){
1792 if( f && f!=stdout && f!=stderr ) fclose(f);
1793}
1794
1795/*
1796** Try to open an output file. The names "stdout" and "stderr" are
1797** recognized and do the right thing. NULL is returned if the output
1798** filename is "off".
1799*/
1800static FILE *output_file_open(const char *zFile){
1801 FILE *f;
1802 if( strcmp(zFile,"stdout")==0 ){
1803 f = stdout;
1804 }else if( strcmp(zFile, "stderr")==0 ){
1805 f = stderr;
1806 }else if( strcmp(zFile, "off")==0 ){
1807 f = 0;
1808 }else{
1809 f = fopen(zFile, "wb");
1810 if( f==0 ){
1811 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1812 }
1813 }
1814 return f;
1815}
1816
1817/*
1818** A routine for handling output from sqlite3_trace().
1819*/
1820static void sql_trace_callback(void *pArg, const char *z){
1821 FILE *f = (FILE*)pArg;
1822 if( f ) fprintf(f, "%s\n", z);
1823}
1824
1825/*
drhd8621b92012-04-17 09:09:33 +00001826** A no-op routine that runs with the ".breakpoint" doc-command. This is
1827** a useful spot to set a debugger breakpoint.
1828*/
1829static void test_breakpoint(void){
1830 static int nCall = 0;
1831 nCall++;
1832}
1833
1834/*
drhdb95f682013-06-26 22:46:00 +00001835** An object used to read a CSV file
1836*/
1837typedef struct CSVReader CSVReader;
1838struct CSVReader {
1839 const char *zFile; /* Name of the input file */
1840 FILE *in; /* Read the CSV text from this input stream */
1841 char *z; /* Accumulated text for a field */
1842 int n; /* Number of bytes in z */
1843 int nAlloc; /* Space allocated for z[] */
1844 int nLine; /* Current line number */
1845 int cTerm; /* Character that terminated the most recent field */
1846 int cSeparator; /* The separator character. (Usually ",") */
1847};
1848
1849/* Append a single byte to z[] */
1850static void csv_append_char(CSVReader *p, int c){
1851 if( p->n+1>=p->nAlloc ){
1852 p->nAlloc += p->nAlloc + 100;
1853 p->z = sqlite3_realloc(p->z, p->nAlloc);
1854 if( p->z==0 ){
1855 fprintf(stderr, "out of memory\n");
1856 exit(1);
1857 }
1858 }
1859 p->z[p->n++] = (char)c;
1860}
1861
1862/* Read a single field of CSV text. Compatible with rfc4180 and extended
1863** with the option of having a separator other than ",".
1864**
1865** + Input comes from p->in.
1866** + Store results in p->z of length p->n. Space to hold p->z comes
1867** from sqlite3_malloc().
1868** + Use p->cSep as the separator. The default is ",".
1869** + Keep track of the line number in p->nLine.
1870** + Store the character that terminates the field in p->cTerm. Store
1871** EOF on end-of-file.
1872** + Report syntax errors on stderr
1873*/
1874static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001875 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001876 int cSep = p->cSeparator;
1877 p->n = 0;
1878 c = fgetc(p->in);
1879 if( c==EOF || seenInterrupt ){
1880 p->cTerm = EOF;
1881 return 0;
1882 }
1883 if( c=='"' ){
1884 int startLine = p->nLine;
1885 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001886 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001887 while( 1 ){
1888 c = fgetc(p->in);
1889 if( c=='\n' ) p->nLine++;
1890 if( c==cQuote ){
1891 if( pc==cQuote ){
1892 pc = 0;
1893 continue;
1894 }
1895 }
1896 if( (c==cSep && pc==cQuote)
1897 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001898 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001899 || (c==EOF && pc==cQuote)
1900 ){
1901 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001902 p->cTerm = c;
1903 break;
1904 }
1905 if( pc==cQuote && c!='\r' ){
1906 fprintf(stderr, "%s:%d: unescaped %c character\n",
1907 p->zFile, p->nLine, cQuote);
1908 }
1909 if( c==EOF ){
1910 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1911 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001912 p->cTerm = EOF;
1913 break;
1914 }
1915 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001916 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001917 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001918 }
drhdb95f682013-06-26 22:46:00 +00001919 }else{
drhd0a64dc2013-06-30 20:24:26 +00001920 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001921 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001922 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001923 }
1924 if( c=='\n' ){
1925 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001926 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001927 }
drhdb95f682013-06-26 22:46:00 +00001928 p->cTerm = c;
1929 }
drh8dd675e2013-07-12 21:09:24 +00001930 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001931 return p->z;
1932}
1933
1934/*
drh4bbcf102014-02-06 02:46:08 +00001935** Try to transfer data for table zTable. If an error is seen while
1936** moving forward, try to go backwards. The backwards movement won't
1937** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001938*/
mistachkine31ae902014-02-06 01:15:29 +00001939static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001940 struct callback_data *p,
1941 sqlite3 *newDb,
1942 const char *zTable
1943){
1944 sqlite3_stmt *pQuery = 0;
1945 sqlite3_stmt *pInsert = 0;
1946 char *zQuery = 0;
1947 char *zInsert = 0;
1948 int rc;
1949 int i, j, n;
1950 int nTable = (int)strlen(zTable);
1951 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001952 int cnt = 0;
1953 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001954
1955 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1956 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1957 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001958 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001959 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1960 zQuery);
1961 goto end_data_xfer;
1962 }
1963 n = sqlite3_column_count(pQuery);
1964 zInsert = sqlite3_malloc(200 + nTable + n*3);
1965 if( zInsert==0 ){
1966 fprintf(stderr, "out of memory\n");
1967 goto end_data_xfer;
1968 }
1969 sqlite3_snprintf(200+nTable,zInsert,
1970 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1971 i = (int)strlen(zInsert);
1972 for(j=1; j<n; j++){
1973 memcpy(zInsert+i, ",?", 2);
1974 i += 2;
1975 }
1976 memcpy(zInsert+i, ");", 3);
1977 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1978 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001979 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001980 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1981 zQuery);
1982 goto end_data_xfer;
1983 }
1984 for(k=0; k<2; k++){
1985 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1986 for(i=0; i<n; i++){
1987 switch( sqlite3_column_type(pQuery, i) ){
1988 case SQLITE_NULL: {
1989 sqlite3_bind_null(pInsert, i+1);
1990 break;
1991 }
1992 case SQLITE_INTEGER: {
1993 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1994 break;
1995 }
1996 case SQLITE_FLOAT: {
1997 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1998 break;
1999 }
2000 case SQLITE_TEXT: {
2001 sqlite3_bind_text(pInsert, i+1,
2002 (const char*)sqlite3_column_text(pQuery,i),
2003 -1, SQLITE_STATIC);
2004 break;
2005 }
2006 case SQLITE_BLOB: {
2007 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2008 sqlite3_column_bytes(pQuery,i),
2009 SQLITE_STATIC);
2010 break;
2011 }
2012 }
2013 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002014 rc = sqlite3_step(pInsert);
2015 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2016 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2017 sqlite3_errmsg(newDb));
2018 }
drh3350ce92014-02-06 00:49:12 +00002019 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002020 cnt++;
2021 if( (cnt%spinRate)==0 ){
2022 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2023 fflush(stdout);
2024 }
drh3350ce92014-02-06 00:49:12 +00002025 } /* End while */
2026 if( rc==SQLITE_DONE ) break;
2027 sqlite3_finalize(pQuery);
2028 sqlite3_free(zQuery);
2029 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2030 zTable);
2031 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2032 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002033 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2034 break;
drh3350ce92014-02-06 00:49:12 +00002035 }
2036 } /* End for(k=0...) */
2037
2038end_data_xfer:
2039 sqlite3_finalize(pQuery);
2040 sqlite3_finalize(pInsert);
2041 sqlite3_free(zQuery);
2042 sqlite3_free(zInsert);
2043}
2044
2045
2046/*
2047** Try to transfer all rows of the schema that match zWhere. For
2048** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002049** If an error is encountered while moving forward through the
2050** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002051*/
mistachkine31ae902014-02-06 01:15:29 +00002052static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002053 struct callback_data *p,
2054 sqlite3 *newDb,
2055 const char *zWhere,
2056 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2057){
2058 sqlite3_stmt *pQuery = 0;
2059 char *zQuery = 0;
2060 int rc;
2061 const unsigned char *zName;
2062 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002063 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002064
2065 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2066 " WHERE %s", zWhere);
2067 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2068 if( rc ){
2069 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2070 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2071 zQuery);
2072 goto end_schema_xfer;
2073 }
2074 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2075 zName = sqlite3_column_text(pQuery, 0);
2076 zSql = sqlite3_column_text(pQuery, 1);
2077 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002078 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2079 if( zErrMsg ){
2080 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2081 sqlite3_free(zErrMsg);
2082 zErrMsg = 0;
2083 }
drh3350ce92014-02-06 00:49:12 +00002084 if( xForEach ){
2085 xForEach(p, newDb, (const char*)zName);
2086 }
2087 printf("done\n");
2088 }
2089 if( rc!=SQLITE_DONE ){
2090 sqlite3_finalize(pQuery);
2091 sqlite3_free(zQuery);
2092 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2093 " WHERE %s ORDER BY rowid DESC", zWhere);
2094 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2095 if( rc ){
2096 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2097 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2098 zQuery);
2099 goto end_schema_xfer;
2100 }
2101 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2102 zName = sqlite3_column_text(pQuery, 0);
2103 zSql = sqlite3_column_text(pQuery, 1);
2104 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002105 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2106 if( zErrMsg ){
2107 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2108 sqlite3_free(zErrMsg);
2109 zErrMsg = 0;
2110 }
drh3350ce92014-02-06 00:49:12 +00002111 if( xForEach ){
2112 xForEach(p, newDb, (const char*)zName);
2113 }
2114 printf("done\n");
2115 }
2116 }
2117end_schema_xfer:
2118 sqlite3_finalize(pQuery);
2119 sqlite3_free(zQuery);
2120}
2121
2122/*
2123** Open a new database file named "zNewDb". Try to recover as much information
2124** as possible out of the main database (which might be corrupt) and write it
2125** into zNewDb.
2126*/
mistachkine31ae902014-02-06 01:15:29 +00002127static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002128 int rc;
2129 sqlite3 *newDb = 0;
2130 if( access(zNewDb,0)==0 ){
2131 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2132 return;
2133 }
2134 rc = sqlite3_open(zNewDb, &newDb);
2135 if( rc ){
2136 fprintf(stderr, "Cannot create output database: %s\n",
2137 sqlite3_errmsg(newDb));
2138 }else{
drh54d0d2d2014-04-03 00:32:13 +00002139 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002140 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002141 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2142 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002143 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002144 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002145 }
2146 sqlite3_close(newDb);
2147}
2148
2149/*
drhc2ce0be2014-05-29 12:36:14 +00002150** Change the output file back to stdout
2151*/
2152static void output_reset(struct callback_data *p){
2153 if( p->outfile[0]=='|' ){
2154 pclose(p->out);
2155 }else{
2156 output_file_close(p->out);
2157 }
2158 p->outfile[0] = 0;
2159 p->out = stdout;
2160}
2161
2162/*
drh75897232000-05-29 14:26:00 +00002163** If an input line begins with "." then invoke this routine to
2164** process that line.
drh67505e72002-04-19 12:34:06 +00002165**
drh47ad6842006-11-08 12:25:42 +00002166** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002167*/
drh44c2eb12003-04-30 11:38:26 +00002168static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002169 int i = 1;
2170 int nArg = 0;
2171 int n, c;
drh67505e72002-04-19 12:34:06 +00002172 int rc = 0;
drh75897232000-05-29 14:26:00 +00002173 char *azArg[50];
2174
2175 /* Parse the input line into tokens.
2176 */
2177 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002178 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002179 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002180 if( zLine[i]=='\'' || zLine[i]=='"' ){
2181 int delim = zLine[i++];
2182 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002183 while( zLine[i] && zLine[i]!=delim ){
2184 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2185 i++;
2186 }
drh75897232000-05-29 14:26:00 +00002187 if( zLine[i]==delim ){
2188 zLine[i++] = 0;
2189 }
drhfeac5f82004-08-01 00:10:45 +00002190 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002191 }else{
2192 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002193 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002194 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002195 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002196 }
2197 }
2198
2199 /* Process the input line.
2200 */
shane9bd1b442009-10-23 01:27:39 +00002201 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002202 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002203 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002204 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2205 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2206 ){
drhbc46f022013-01-23 18:53:23 +00002207 const char *zDestFile = 0;
2208 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002209 sqlite3 *pDest;
2210 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002211 int j;
2212 for(j=1; j<nArg; j++){
2213 const char *z = azArg[j];
2214 if( z[0]=='-' ){
2215 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002216 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002217 {
2218 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2219 return 1;
2220 }
2221 }else if( zDestFile==0 ){
2222 zDestFile = azArg[j];
2223 }else if( zDb==0 ){
2224 zDb = zDestFile;
2225 zDestFile = azArg[j];
2226 }else{
2227 fprintf(stderr, "too many arguments to .backup\n");
2228 return 1;
2229 }
drh9ff849f2009-02-04 20:55:57 +00002230 }
drhbc46f022013-01-23 18:53:23 +00002231 if( zDestFile==0 ){
2232 fprintf(stderr, "missing FILENAME argument on .backup\n");
2233 return 1;
2234 }
2235 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002236 rc = sqlite3_open(zDestFile, &pDest);
2237 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002238 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002239 sqlite3_close(pDest);
2240 return 1;
2241 }
drh05782482013-10-24 15:20:20 +00002242 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002243 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2244 if( pBackup==0 ){
2245 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2246 sqlite3_close(pDest);
2247 return 1;
2248 }
2249 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2250 sqlite3_backup_finish(pBackup);
2251 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002252 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002253 }else{
2254 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002255 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002256 }
2257 sqlite3_close(pDest);
2258 }else
2259
drhc2ce0be2014-05-29 12:36:14 +00002260 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2261 if( nArg==2 ){
2262 bail_on_error = booleanValue(azArg[1]);
2263 }else{
2264 fprintf(stderr, "Usage: .bail on|off\n");
2265 rc = 1;
2266 }
drhc49f44e2006-10-26 18:15:42 +00002267 }else
2268
drhd8621b92012-04-17 09:09:33 +00002269 /* The undocumented ".breakpoint" command causes a call to the no-op
2270 ** routine named test_breakpoint().
2271 */
2272 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2273 test_breakpoint();
2274 }else
2275
drhc2ce0be2014-05-29 12:36:14 +00002276 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2277 if( nArg==2 ){
2278 tryToClone(p, azArg[1]);
2279 }else{
2280 fprintf(stderr, "Usage: .clone FILENAME\n");
2281 rc = 1;
2282 }
mistachkine31ae902014-02-06 01:15:29 +00002283 }else
2284
drhc2ce0be2014-05-29 12:36:14 +00002285 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
jplyon672a1ed2003-05-11 20:07:05 +00002286 struct callback_data data;
2287 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002288 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002289 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002290 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002291 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002292 data.colWidth[0] = 3;
2293 data.colWidth[1] = 15;
2294 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002295 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002296 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002297 if( zErrMsg ){
2298 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002299 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002300 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002301 }
2302 }else
2303
drhc2ce0be2014-05-29 12:36:14 +00002304 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002305 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002306 /* When playing back a "dump", the content might appear in an order
2307 ** which causes immediate foreign key constraints to be violated.
2308 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002309 if( nArg!=1 && nArg!=2 ){
2310 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2311 rc = 1;
2312 goto meta_command_exit;
2313 }
drhf1dfc4f2009-09-23 15:51:35 +00002314 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002315 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002316 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002317 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002318 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002319 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002320 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002321 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002322 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002323 );
2324 run_schema_dump_query(p,
2325 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002326 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002327 );
drh2f464a02011-10-13 00:41:49 +00002328 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002329 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002330 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002331 );
drh4c653a02000-06-07 01:27:47 +00002332 }else{
2333 int i;
drhdd3d4592004-08-30 01:54:05 +00002334 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002335 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002336 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002337 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002338 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002339 " AND sql NOT NULL");
2340 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002341 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002342 "WHERE sql NOT NULL"
2343 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002344 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002345 );
danielk1977bc6ada42004-06-30 08:20:16 +00002346 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002347 }
2348 }
drh45e29d82006-11-20 16:21:10 +00002349 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002350 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002351 p->writableSchema = 0;
2352 }
drh56197952011-10-13 16:30:13 +00002353 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2354 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002355 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002356 }else
drh75897232000-05-29 14:26:00 +00002357
drhc2ce0be2014-05-29 12:36:14 +00002358 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2359 if( nArg==2 ){
2360 p->echoOn = booleanValue(azArg[1]);
2361 }else{
2362 fprintf(stderr, "Usage: .echo on|off\n");
2363 rc = 1;
2364 }
drhdaffd0e2001-04-11 14:28:42 +00002365 }else
2366
drhc2ce0be2014-05-29 12:36:14 +00002367 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2368 if( nArg==2 ){
2369 p->autoEQP = booleanValue(azArg[1]);
2370 }else{
2371 fprintf(stderr, "Usage: .eqp on|off\n");
2372 rc = 1;
2373 }
drhefbf3b12014-02-28 20:47:24 +00002374 }else
2375
drhd3ac7d92013-01-25 18:33:43 +00002376 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002377 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002378 rc = 2;
drh75897232000-05-29 14:26:00 +00002379 }else
2380
drhc2ce0be2014-05-29 12:36:14 +00002381 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002382 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002383 if(val == 1) {
2384 if(!p->explainPrev.valid) {
2385 p->explainPrev.valid = 1;
2386 p->explainPrev.mode = p->mode;
2387 p->explainPrev.showHeader = p->showHeader;
2388 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2389 }
2390 /* We could put this code under the !p->explainValid
2391 ** condition so that it does not execute if we are already in
2392 ** explain mode. However, always executing it allows us an easy
2393 ** was to reset to explain mode in case the user previously
2394 ** did an .explain followed by a .width, .mode or .header
2395 ** command.
2396 */
danielk19770d78bae2008-01-03 07:09:48 +00002397 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002398 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002399 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002400 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002401 p->colWidth[1] = 13; /* opcode */
2402 p->colWidth[2] = 4; /* P1 */
2403 p->colWidth[3] = 4; /* P2 */
2404 p->colWidth[4] = 4; /* P3 */
2405 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002406 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002407 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002408 }else if (p->explainPrev.valid) {
2409 p->explainPrev.valid = 0;
2410 p->mode = p->explainPrev.mode;
2411 p->showHeader = p->explainPrev.showHeader;
2412 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2413 }
drh75897232000-05-29 14:26:00 +00002414 }else
2415
drhc1971542014-06-23 23:28:13 +00002416 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
2417 struct callback_data data;
2418 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002419 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002420 if( nArg!=1 ){
2421 fprintf(stderr, "Usage: .fullschema\n");
2422 rc = 1;
2423 goto meta_command_exit;
2424 }
2425 open_db(p, 0);
2426 memcpy(&data, p, sizeof(data));
2427 data.showHeader = 0;
2428 data.mode = MODE_Semi;
2429 rc = sqlite3_exec(p->db,
2430 "SELECT sql FROM"
2431 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2432 " FROM sqlite_master UNION ALL"
2433 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2434 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
2435 "ORDER BY rowid",
2436 callback, &data, &zErrMsg
2437 );
drh56f674c2014-07-18 14:43:29 +00002438 if( rc==SQLITE_OK ){
2439 sqlite3_stmt *pStmt;
2440 rc = sqlite3_prepare_v2(p->db,
2441 "SELECT rowid FROM sqlite_master"
2442 " WHERE name GLOB 'sqlite_stat[134]'",
2443 -1, &pStmt, 0);
2444 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2445 sqlite3_finalize(pStmt);
2446 }
2447 if( doStats==0 ){
2448 fprintf(p->out, "/* No STAT tables available */\n");
2449 }else{
2450 fprintf(p->out, "ANALYZE sqlite_master;\n");
2451 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2452 callback, &data, &zErrMsg);
2453 data.mode = MODE_Insert;
2454 data.zDestTable = "sqlite_stat1";
2455 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2456 shell_callback, &data,&zErrMsg);
2457 data.zDestTable = "sqlite_stat3";
2458 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2459 shell_callback, &data,&zErrMsg);
2460 data.zDestTable = "sqlite_stat4";
2461 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2462 shell_callback, &data, &zErrMsg);
2463 fprintf(p->out, "ANALYZE sqlite_master;\n");
2464 }
drhc1971542014-06-23 23:28:13 +00002465 }else
2466
drhc2ce0be2014-05-29 12:36:14 +00002467 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2468 if( nArg==2 ){
2469 p->showHeader = booleanValue(azArg[1]);
2470 }else{
2471 fprintf(stderr, "Usage: .headers on|off\n");
2472 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002473 }
drh75897232000-05-29 14:26:00 +00002474 }else
2475
drhc2ce0be2014-05-29 12:36:14 +00002476 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2477 fprintf(p->out, "%s", zHelp);
2478 }else
2479
2480 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002481 char *zTable; /* Insert data into this table */
2482 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002483 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002484 int nCol; /* Number of columns in the table */
2485 int nByte; /* Number of bytes in an SQL string */
2486 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002487 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002488 int nSep; /* Number of bytes in p->separator[] */
2489 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002490 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002491 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002492
drhc2ce0be2014-05-29 12:36:14 +00002493 if( nArg!=3 ){
2494 fprintf(stderr, "Usage: .import FILE TABLE\n");
2495 goto meta_command_exit;
2496 }
drh01f37542014-05-31 15:43:33 +00002497 zFile = azArg[1];
2498 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002499 seenInterrupt = 0;
2500 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002501 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002502 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002503 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002504 fprintf(stderr, "Error: non-null separator required for import\n");
2505 return 1;
drhfeac5f82004-08-01 00:10:45 +00002506 }
drhdb95f682013-06-26 22:46:00 +00002507 if( nSep>1 ){
2508 fprintf(stderr, "Error: multi-character separators not allowed"
2509 " for import\n");
2510 return 1;
2511 }
drh5bde8162013-06-27 14:07:53 +00002512 sCsv.zFile = zFile;
2513 sCsv.nLine = 1;
2514 if( sCsv.zFile[0]=='|' ){
2515 sCsv.in = popen(sCsv.zFile+1, "r");
2516 sCsv.zFile = "<pipe>";
2517 xCloser = pclose;
2518 }else{
2519 sCsv.in = fopen(sCsv.zFile, "rb");
2520 xCloser = fclose;
2521 }
drhdb95f682013-06-26 22:46:00 +00002522 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002523 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002524 return 1;
2525 }
2526 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002527 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002528 if( zSql==0 ){
2529 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002530 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002531 return 1;
2532 }
drh4f21c4a2008-12-10 22:15:00 +00002533 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002534 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002535 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002536 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2537 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2538 char cSep = '(';
2539 while( csv_read_one_field(&sCsv) ){
2540 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2541 cSep = ',';
2542 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2543 }
drh5bde8162013-06-27 14:07:53 +00002544 if( cSep=='(' ){
2545 sqlite3_free(zCreate);
2546 sqlite3_free(sCsv.z);
2547 xCloser(sCsv.in);
2548 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2549 return 1;
2550 }
drhdb95f682013-06-26 22:46:00 +00002551 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2552 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2553 sqlite3_free(zCreate);
2554 if( rc ){
2555 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2556 sqlite3_errmsg(db));
2557 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002558 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002559 return 1;
2560 }
drhc7181902014-02-27 15:04:13 +00002561 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002562 }
drhfeac5f82004-08-01 00:10:45 +00002563 sqlite3_free(zSql);
2564 if( rc ){
shane916f9612009-10-23 00:37:15 +00002565 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002566 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002567 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002568 return 1;
drhfeac5f82004-08-01 00:10:45 +00002569 }
shane916f9612009-10-23 00:37:15 +00002570 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002571 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002572 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002573 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002574 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002575 if( zSql==0 ){
2576 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002577 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002578 return 1;
2579 }
drhdb95f682013-06-26 22:46:00 +00002580 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002581 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002582 for(i=1; i<nCol; i++){
2583 zSql[j++] = ',';
2584 zSql[j++] = '?';
2585 }
2586 zSql[j++] = ')';
2587 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002588 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002589 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002590 if( rc ){
2591 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002592 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002593 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002594 return 1;
drhfeac5f82004-08-01 00:10:45 +00002595 }
drh2d463112013-08-06 14:36:36 +00002596 needCommit = sqlite3_get_autocommit(db);
2597 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002598 do{
2599 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002600 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002601 char *z = csv_read_one_field(&sCsv);
2602 if( z==0 && i==0 ) break;
2603 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2604 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2605 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2606 "filling the rest with NULL\n",
2607 sCsv.zFile, startLine, nCol, i+1);
2608 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002609 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002610 }
drhfeac5f82004-08-01 00:10:45 +00002611 }
drhdb95f682013-06-26 22:46:00 +00002612 if( sCsv.cTerm==sCsv.cSeparator ){
2613 do{
2614 csv_read_one_field(&sCsv);
2615 i++;
2616 }while( sCsv.cTerm==sCsv.cSeparator );
2617 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2618 "extras ignored\n",
2619 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002620 }
drhdb95f682013-06-26 22:46:00 +00002621 if( i>=nCol ){
2622 sqlite3_step(pStmt);
2623 rc = sqlite3_reset(pStmt);
2624 if( rc!=SQLITE_OK ){
2625 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2626 sqlite3_errmsg(db));
2627 }
2628 }
2629 }while( sCsv.cTerm!=EOF );
2630
drh5bde8162013-06-27 14:07:53 +00002631 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002632 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002633 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002634 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002635 }else
2636
drhc2ce0be2014-05-29 12:36:14 +00002637 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drh75897232000-05-29 14:26:00 +00002638 struct callback_data data;
2639 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002640 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002641 memcpy(&data, p, sizeof(data));
2642 data.showHeader = 0;
2643 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002644 if( nArg==1 ){
2645 rc = sqlite3_exec(p->db,
2646 "SELECT name FROM sqlite_master "
2647 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2648 "UNION ALL "
2649 "SELECT name FROM sqlite_temp_master "
2650 "WHERE type='index' "
2651 "ORDER BY 1",
2652 callback, &data, &zErrMsg
2653 );
drhc2ce0be2014-05-29 12:36:14 +00002654 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002655 zShellStatic = azArg[1];
2656 rc = sqlite3_exec(p->db,
2657 "SELECT name FROM sqlite_master "
2658 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2659 "UNION ALL "
2660 "SELECT name FROM sqlite_temp_master "
2661 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2662 "ORDER BY 1",
2663 callback, &data, &zErrMsg
2664 );
2665 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002666 }else{
2667 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2668 rc = 1;
2669 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002670 }
drh75897232000-05-29 14:26:00 +00002671 if( zErrMsg ){
2672 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002673 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002674 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002675 }else if( rc != SQLITE_OK ){
2676 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2677 rc = 1;
drh75897232000-05-29 14:26:00 +00002678 }
2679 }else
2680
drhae5e4452007-05-03 17:18:36 +00002681#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002682 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002683 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002684 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2685 iotrace = 0;
2686 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002687 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002688 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002689 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002690 iotrace = stdout;
2691 }else{
2692 iotrace = fopen(azArg[1], "w");
2693 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002694 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002695 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002696 rc = 1;
drhb0603412007-02-28 04:47:26 +00002697 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002698 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002699 }
2700 }
2701 }else
drhae5e4452007-05-03 17:18:36 +00002702#endif
drhb0603412007-02-28 04:47:26 +00002703
drh70df4fe2006-06-13 15:12:21 +00002704#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002705 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002706 const char *zFile, *zProc;
2707 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002708 if( nArg<2 ){
2709 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2710 rc = 1;
2711 goto meta_command_exit;
2712 }
drh1e397f82006-06-08 15:28:43 +00002713 zFile = azArg[1];
2714 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002715 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002716 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2717 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002718 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002719 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002720 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002721 }
2722 }else
drh70df4fe2006-06-13 15:12:21 +00002723#endif
drh1e397f82006-06-08 15:28:43 +00002724
drhc2ce0be2014-05-29 12:36:14 +00002725 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2726 if( nArg!=2 ){
2727 fprintf(stderr, "Usage: .log FILENAME\n");
2728 rc = 1;
2729 }else{
2730 const char *zFile = azArg[1];
2731 output_file_close(p->pLog);
2732 p->pLog = output_file_open(zFile);
2733 }
drh127f9d72010-02-23 01:47:00 +00002734 }else
2735
drhc2ce0be2014-05-29 12:36:14 +00002736 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2737 const char *zMode = nArg>=2 ? azArg[1] : "";
2738 int n2 = (int)strlen(zMode);
2739 int c2 = zMode[0];
2740 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002741 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002742 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002743 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002744 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002745 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002746 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002747 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002748 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002749 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002750 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002751 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002752 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002753 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drhc2ce0be2014-05-29 12:36:14 +00002754 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002755 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002756 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002757 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002758 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002759 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002760 }else {
shane9bd1b442009-10-23 01:27:39 +00002761 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002762 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002763 rc = 1;
drh75897232000-05-29 14:26:00 +00002764 }
2765 }else
2766
drhc2ce0be2014-05-29 12:36:14 +00002767 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2768 if( nArg==2 ){
2769 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2770 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2771 }else{
2772 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002773 rc = 1;
2774 }
2775 }else
2776
drh05782482013-10-24 15:20:20 +00002777 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2778 sqlite3 *savedDb = p->db;
2779 const char *zSavedFilename = p->zDbFilename;
2780 char *zNewFilename = 0;
2781 p->db = 0;
2782 if( nArg>=2 ){
2783 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2784 }
2785 open_db(p, 1);
2786 if( p->db!=0 ){
2787 sqlite3_close(savedDb);
2788 sqlite3_free(p->zFreeOnClose);
2789 p->zFreeOnClose = zNewFilename;
2790 }else{
2791 sqlite3_free(zNewFilename);
2792 p->db = savedDb;
2793 p->zDbFilename = zSavedFilename;
2794 }
2795 }else
2796
drhc2ce0be2014-05-29 12:36:14 +00002797 if( c=='o'
2798 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2799 ){
2800 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2801 if( nArg>2 ){
2802 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2803 rc = 1;
2804 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002805 }
drhc2ce0be2014-05-29 12:36:14 +00002806 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2807 if( nArg<2 ){
2808 fprintf(stderr, "Usage: .once FILE\n");
2809 rc = 1;
2810 goto meta_command_exit;
2811 }
2812 p->outCount = 2;
2813 }else{
2814 p->outCount = 0;
2815 }
2816 output_reset(p);
2817 if( zFile[0]=='|' ){
2818 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002819 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002820 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002821 p->out = stdout;
2822 rc = 1;
2823 }else{
drhc2ce0be2014-05-29 12:36:14 +00002824 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002825 }
drh75897232000-05-29 14:26:00 +00002826 }else{
drhc2ce0be2014-05-29 12:36:14 +00002827 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002828 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002829 if( strcmp(zFile,"off")!=0 ){
2830 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002831 }
drh75897232000-05-29 14:26:00 +00002832 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002833 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002834 } else {
drhc2ce0be2014-05-29 12:36:14 +00002835 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002836 }
2837 }
2838 }else
2839
drh078b1fd2012-09-21 13:40:02 +00002840 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2841 int i;
2842 for(i=1; i<nArg; i++){
2843 if( i>1 ) fprintf(p->out, " ");
2844 fprintf(p->out, "%s", azArg[i]);
2845 }
2846 fprintf(p->out, "\n");
2847 }else
2848
drhc2ce0be2014-05-29 12:36:14 +00002849 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002850 if( nArg >= 2) {
2851 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2852 }
2853 if( nArg >= 3) {
2854 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2855 }
2856 }else
2857
drhc2ce0be2014-05-29 12:36:14 +00002858 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002859 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002860 }else
2861
drhc2ce0be2014-05-29 12:36:14 +00002862 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
2863 FILE *alt;
2864 if( nArg!=2 ){
2865 fprintf(stderr, "Usage: .read FILE\n");
2866 rc = 1;
2867 goto meta_command_exit;
2868 }
2869 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002870 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002871 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2872 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002873 }else{
shane9bd1b442009-10-23 01:27:39 +00002874 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002875 fclose(alt);
2876 }
2877 }else
2878
drhc2ce0be2014-05-29 12:36:14 +00002879 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00002880 const char *zSrcFile;
2881 const char *zDb;
2882 sqlite3 *pSrc;
2883 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002884 int nTimeout = 0;
2885
drh9ff849f2009-02-04 20:55:57 +00002886 if( nArg==2 ){
2887 zSrcFile = azArg[1];
2888 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00002889 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00002890 zSrcFile = azArg[2];
2891 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00002892 }else{
2893 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
2894 rc = 1;
2895 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00002896 }
2897 rc = sqlite3_open(zSrcFile, &pSrc);
2898 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002899 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002900 sqlite3_close(pSrc);
2901 return 1;
2902 }
drh05782482013-10-24 15:20:20 +00002903 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002904 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2905 if( pBackup==0 ){
2906 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2907 sqlite3_close(pSrc);
2908 return 1;
2909 }
drhdc2c4912009-02-04 22:46:47 +00002910 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2911 || rc==SQLITE_BUSY ){
2912 if( rc==SQLITE_BUSY ){
2913 if( nTimeout++ >= 3 ) break;
2914 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002915 }
2916 }
2917 sqlite3_backup_finish(pBackup);
2918 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002919 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002920 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002921 fprintf(stderr, "Error: source database is busy\n");
2922 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002923 }else{
2924 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002925 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002926 }
2927 sqlite3_close(pSrc);
2928 }else
2929
drhc2ce0be2014-05-29 12:36:14 +00002930 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drh75897232000-05-29 14:26:00 +00002931 struct callback_data data;
2932 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002933 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002934 memcpy(&data, p, sizeof(data));
2935 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002936 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00002937 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00002938 int i;
drhf0693c82011-10-11 20:41:54 +00002939 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002940 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002941 char *new_argv[2], *new_colv[2];
2942 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2943 " type text,\n"
2944 " name text,\n"
2945 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002946 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002947 " sql text\n"
2948 ")";
2949 new_argv[1] = 0;
2950 new_colv[0] = "sql";
2951 new_colv[1] = 0;
2952 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002953 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002954 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002955 char *new_argv[2], *new_colv[2];
2956 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2957 " type text,\n"
2958 " name text,\n"
2959 " tbl_name text,\n"
2960 " rootpage integer,\n"
2961 " sql text\n"
2962 ")";
2963 new_argv[1] = 0;
2964 new_colv[0] = "sql";
2965 new_colv[1] = 0;
2966 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002967 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002968 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002969 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002970 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002971 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002972 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002973 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002974 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002975 "WHERE lower(tbl_name) LIKE shellstatic()"
2976 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002977 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002978 callback, &data, &zErrMsg);
2979 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002980 }
drhc2ce0be2014-05-29 12:36:14 +00002981 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00002982 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002983 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002984 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002985 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002986 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002987 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002988 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002989 callback, &data, &zErrMsg
2990 );
drhc2ce0be2014-05-29 12:36:14 +00002991 }else{
2992 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
2993 rc = 1;
2994 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002995 }
drh75897232000-05-29 14:26:00 +00002996 if( zErrMsg ){
2997 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002998 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002999 rc = 1;
3000 }else if( rc != SQLITE_OK ){
3001 fprintf(stderr,"Error: querying schema information\n");
3002 rc = 1;
3003 }else{
3004 rc = 0;
drh75897232000-05-29 14:26:00 +00003005 }
3006 }else
3007
drh340f5822013-06-27 13:01:21 +00003008#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003009 /* Undocumented commands for internal testing. Subject to change
3010 ** without notice. */
3011 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3012 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3013 int i, v;
3014 for(i=1; i<nArg; i++){
3015 v = booleanValue(azArg[i]);
3016 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3017 }
3018 }
3019 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3020 int i; sqlite3_int64 v;
3021 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003022 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003023 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003024 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003025 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003026 }
3027 }
3028 }else
drh340f5822013-06-27 13:01:21 +00003029#endif
drh348d19c2013-06-03 12:47:43 +00003030
drhc2ce0be2014-05-29 12:36:14 +00003031 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
3032 if( nArg==2 ){
3033 sqlite3_snprintf(sizeof(p->separator), p->separator,
3034 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
3035 }else{
3036 fprintf(stderr, "Usage: .separator STRING\n");
3037 rc = 1;
3038 }
drh75897232000-05-29 14:26:00 +00003039 }else
3040
drh62cdde52014-05-28 20:22:28 +00003041 if( c=='s'
3042 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003043 ){
3044 char *zCmd;
3045 int i;
drhc2ce0be2014-05-29 12:36:14 +00003046 if( nArg<2 ){
3047 fprintf(stderr, "Usage: .system COMMAND\n");
3048 rc = 1;
3049 goto meta_command_exit;
3050 }
drhdcb3e3d2014-05-29 03:17:29 +00003051 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003052 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003053 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3054 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003055 }
drh3c4461f2014-05-29 20:39:59 +00003056 (void)system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003057 sqlite3_free(zCmd);
3058 }else
3059
drhc2ce0be2014-05-29 12:36:14 +00003060 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003061 int i;
drhc2ce0be2014-05-29 12:36:14 +00003062 if( nArg!=1 ){
3063 fprintf(stderr, "Usage: .show\n");
3064 rc = 1;
3065 goto meta_command_exit;
3066 }
persicom7e2dfdd2002-04-18 02:46:52 +00003067 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003068 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00003069 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003070 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003071 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003072 fprintf(p->out,"%9.9s: ", "nullvalue");
3073 output_c_string(p->out, p->nullvalue);
3074 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003075 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003076 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003077 fprintf(p->out,"%9.9s: ", "separator");
3078 output_c_string(p->out, p->separator);
3079 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003080 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003081 fprintf(p->out,"%9.9s: ","width");
3082 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003083 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003084 }
drhfeac5f82004-08-01 00:10:45 +00003085 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003086 }else
3087
drhc2ce0be2014-05-29 12:36:14 +00003088 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3089 if( nArg==2 ){
3090 p->statsOn = booleanValue(azArg[1]);
3091 }else{
3092 fprintf(stderr, "Usage: .stats on|off\n");
3093 rc = 1;
3094 }
shaneh642d8b82010-07-28 16:05:34 +00003095 }else
3096
drhc2ce0be2014-05-29 12:36:14 +00003097 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003098 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003099 char **azResult;
drh98781232012-04-23 12:38:05 +00003100 int nRow, nAlloc;
3101 char *zSql = 0;
3102 int ii;
drh05782482013-10-24 15:20:20 +00003103 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003104 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3105 if( rc ) return rc;
3106 zSql = sqlite3_mprintf(
3107 "SELECT name FROM sqlite_master"
3108 " WHERE type IN ('table','view')"
3109 " AND name NOT LIKE 'sqlite_%%'"
3110 " AND name LIKE ?1");
3111 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3112 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3113 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3114 if( strcmp(zDbName,"temp")==0 ){
3115 zSql = sqlite3_mprintf(
3116 "%z UNION ALL "
3117 "SELECT 'temp.' || name FROM sqlite_temp_master"
3118 " WHERE type IN ('table','view')"
3119 " AND name NOT LIKE 'sqlite_%%'"
3120 " AND name LIKE ?1", zSql);
3121 }else{
3122 zSql = sqlite3_mprintf(
3123 "%z UNION ALL "
3124 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3125 " WHERE type IN ('table','view')"
3126 " AND name NOT LIKE 'sqlite_%%'"
3127 " AND name LIKE ?1", zSql, zDbName, zDbName);
3128 }
drha50da102000-08-08 20:19:09 +00003129 }
drh98781232012-04-23 12:38:05 +00003130 sqlite3_finalize(pStmt);
3131 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3132 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3133 sqlite3_free(zSql);
3134 if( rc ) return rc;
3135 nRow = nAlloc = 0;
3136 azResult = 0;
3137 if( nArg>1 ){
3138 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003139 }else{
drh98781232012-04-23 12:38:05 +00003140 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3141 }
3142 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3143 if( nRow>=nAlloc ){
3144 char **azNew;
3145 int n = nAlloc*2 + 10;
3146 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3147 if( azNew==0 ){
3148 fprintf(stderr, "Error: out of memory\n");
3149 break;
3150 }
3151 nAlloc = n;
3152 azResult = azNew;
3153 }
3154 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3155 if( azResult[nRow] ) nRow++;
3156 }
3157 sqlite3_finalize(pStmt);
3158 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003159 int len, maxlen = 0;
3160 int i, j;
3161 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003162 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003163 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003164 if( len>maxlen ) maxlen = len;
3165 }
3166 nPrintCol = 80/(maxlen+2);
3167 if( nPrintCol<1 ) nPrintCol = 1;
3168 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3169 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003170 for(j=i; j<nRow; j+=nPrintRow){
3171 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003172 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003173 }
drh151b7d52013-05-06 20:28:54 +00003174 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003175 }
3176 }
drh98781232012-04-23 12:38:05 +00003177 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3178 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003179 }else
3180
shaneh96887e12011-02-10 21:08:58 +00003181 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003182 static const struct {
3183 const char *zCtrlName; /* Name of a test-control option */
3184 int ctrlCode; /* Integer code for that option */
3185 } aCtrl[] = {
3186 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3187 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3188 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3189 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3190 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3191 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3192 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3193 { "assert", SQLITE_TESTCTRL_ASSERT },
3194 { "always", SQLITE_TESTCTRL_ALWAYS },
3195 { "reserve", SQLITE_TESTCTRL_RESERVE },
3196 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3197 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003198 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003199 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003200 };
shaneh96887e12011-02-10 21:08:58 +00003201 int testctrl = -1;
3202 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003203 int i, n;
drh05782482013-10-24 15:20:20 +00003204 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003205
drhd416fe72011-03-17 16:45:50 +00003206 /* convert testctrl text option to value. allow any unique prefix
3207 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003208 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003209 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003210 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3211 if( testctrl<0 ){
3212 testctrl = aCtrl[i].ctrlCode;
3213 }else{
drhb07028f2011-10-14 21:49:18 +00003214 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003215 testctrl = -1;
3216 break;
3217 }
3218 }
3219 }
drh348d19c2013-06-03 12:47:43 +00003220 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003221 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3222 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3223 }else{
3224 switch(testctrl){
3225
3226 /* sqlite3_test_control(int, db, int) */
3227 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3228 case SQLITE_TESTCTRL_RESERVE:
3229 if( nArg==3 ){
3230 int opt = (int)strtol(azArg[2], 0, 0);
3231 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003232 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003233 } else {
drhd416fe72011-03-17 16:45:50 +00003234 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3235 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003236 }
3237 break;
3238
3239 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003240 case SQLITE_TESTCTRL_PRNG_SAVE:
3241 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003242 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003243 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003244 if( nArg==2 ){
3245 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003246 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003247 } else {
3248 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3249 }
3250 break;
3251
3252 /* sqlite3_test_control(int, uint) */
3253 case SQLITE_TESTCTRL_PENDING_BYTE:
3254 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003255 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003256 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003257 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003258 } else {
drhd416fe72011-03-17 16:45:50 +00003259 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3260 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003261 }
3262 break;
3263
3264 /* sqlite3_test_control(int, int) */
3265 case SQLITE_TESTCTRL_ASSERT:
3266 case SQLITE_TESTCTRL_ALWAYS:
3267 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003268 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003269 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003270 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003271 } else {
drhd416fe72011-03-17 16:45:50 +00003272 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3273 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003274 }
3275 break;
3276
3277 /* sqlite3_test_control(int, char *) */
3278#ifdef SQLITE_N_KEYWORD
3279 case SQLITE_TESTCTRL_ISKEYWORD:
3280 if( nArg==3 ){
3281 const char *opt = azArg[2];
3282 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003283 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003284 } else {
drhd416fe72011-03-17 16:45:50 +00003285 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3286 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003287 }
3288 break;
3289#endif
3290
3291 case SQLITE_TESTCTRL_BITVEC_TEST:
3292 case SQLITE_TESTCTRL_FAULT_INSTALL:
3293 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3294 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3295 default:
drhd416fe72011-03-17 16:45:50 +00003296 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3297 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003298 break;
3299 }
3300 }
3301 }else
3302
drhc2ce0be2014-05-29 12:36:14 +00003303 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003304 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003305 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003306 }else
3307
drhc2ce0be2014-05-29 12:36:14 +00003308 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3309 if( nArg==2 ){
3310 enableTimer = booleanValue(azArg[1]);
3311 if( enableTimer && !HAS_TIMER ){
3312 fprintf(stderr, "Error: timer not available on this system.\n");
3313 enableTimer = 0;
3314 }
3315 }else{
3316 fprintf(stderr, "Usage: .timer on|off\n");
3317 rc = 1;
3318 }
shanehe2aa9d72009-11-06 17:20:17 +00003319 }else
3320
drhc2ce0be2014-05-29 12:36:14 +00003321 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003322 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003323 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003324 if( nArg!=2 ){
3325 fprintf(stderr, "Usage: .trace FILE|off\n");
3326 rc = 1;
3327 goto meta_command_exit;
3328 }
drh42f64e52012-04-04 16:56:23 +00003329 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003330#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003331 if( p->traceOut==0 ){
3332 sqlite3_trace(p->db, 0, 0);
3333 }else{
3334 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3335 }
3336#endif
3337 }else
3338
drh9fd301b2011-06-03 13:28:22 +00003339 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003340 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003341 sqlite3_libversion(), sqlite3_sourceid());
3342 }else
3343
drhde60fc22011-12-14 17:53:36 +00003344 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3345 const char *zDbName = nArg==2 ? azArg[1] : "main";
3346 char *zVfsName = 0;
3347 if( p->db ){
3348 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3349 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003350 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003351 sqlite3_free(zVfsName);
3352 }
3353 }
3354 }else
3355
drhcef4fc82012-09-21 22:50:45 +00003356#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3357 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3358 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003359 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003360 }else
3361#endif
3362
drhc2ce0be2014-05-29 12:36:14 +00003363 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003364 int j;
drh43617e92006-03-06 20:55:46 +00003365 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003366 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003367 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003368 }
3369 }else
3370
3371 {
shane9bd1b442009-10-23 01:27:39 +00003372 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003373 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003374 rc = 1;
drh75897232000-05-29 14:26:00 +00003375 }
drh67505e72002-04-19 12:34:06 +00003376
drhc2ce0be2014-05-29 12:36:14 +00003377meta_command_exit:
3378 if( p->outCount ){
3379 p->outCount--;
3380 if( p->outCount==0 ) output_reset(p);
3381 }
drh67505e72002-04-19 12:34:06 +00003382 return rc;
drh75897232000-05-29 14:26:00 +00003383}
3384
drh67505e72002-04-19 12:34:06 +00003385/*
drh91a66392007-09-07 01:12:32 +00003386** Return TRUE if a semicolon occurs anywhere in the first N characters
3387** of string z[].
drh324ccef2003-02-05 14:06:20 +00003388*/
drh9f099fd2013-08-06 14:01:46 +00003389static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003390 int i;
3391 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3392 return 0;
drh324ccef2003-02-05 14:06:20 +00003393}
3394
3395/*
drh70c7a4b2003-04-26 03:03:06 +00003396** Test to see if a line consists entirely of whitespace.
3397*/
3398static int _all_whitespace(const char *z){
3399 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003400 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003401 if( *z=='/' && z[1]=='*' ){
3402 z += 2;
3403 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3404 if( *z==0 ) return 0;
3405 z++;
3406 continue;
3407 }
3408 if( *z=='-' && z[1]=='-' ){
3409 z += 2;
3410 while( *z && *z!='\n' ){ z++; }
3411 if( *z==0 ) return 1;
3412 continue;
3413 }
3414 return 0;
3415 }
3416 return 1;
3417}
3418
3419/*
drha9b17162003-04-29 18:01:28 +00003420** Return TRUE if the line typed in is an SQL command terminator other
3421** than a semi-colon. The SQL Server style "go" command is understood
3422** as is the Oracle "/".
3423*/
drh9f099fd2013-08-06 14:01:46 +00003424static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003425 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003426 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3427 return 1; /* Oracle */
3428 }
drhf0693c82011-10-11 20:41:54 +00003429 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003430 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003431 return 1; /* SQL Server */
3432 }
3433 return 0;
3434}
3435
3436/*
drh233a5312008-12-18 22:25:13 +00003437** Return true if zSql is a complete SQL statement. Return false if it
3438** ends in the middle of a string literal or C-style comment.
3439*/
drh9f099fd2013-08-06 14:01:46 +00003440static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003441 int rc;
3442 if( zSql==0 ) return 1;
3443 zSql[nSql] = ';';
3444 zSql[nSql+1] = 0;
3445 rc = sqlite3_complete(zSql);
3446 zSql[nSql] = 0;
3447 return rc;
3448}
3449
3450/*
drh67505e72002-04-19 12:34:06 +00003451** Read input from *in and process it. If *in==0 then input
3452** is interactive - the user is typing it it. Otherwise, input
3453** is coming from a file or device. A prompt is issued and history
3454** is saved only if input is interactive. An interrupt signal will
3455** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003456**
3457** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003458*/
drhc28490c2006-10-26 14:25:58 +00003459static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003460 char *zLine = 0; /* A single input line */
3461 char *zSql = 0; /* Accumulated SQL text */
3462 int nLine; /* Length of current line */
3463 int nSql = 0; /* Bytes of zSql[] used */
3464 int nAlloc = 0; /* Allocated zSql[] space */
3465 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3466 char *zErrMsg; /* Error message returned */
3467 int rc; /* Error code */
3468 int errCnt = 0; /* Number of errors seen */
3469 int lineno = 0; /* Current line number */
3470 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003471
3472 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3473 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003474 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003475 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003476 /* End of input */
3477 if( stdin_is_interactive ) printf("\n");
3478 break;
drhc49f44e2006-10-26 18:15:42 +00003479 }
drh67505e72002-04-19 12:34:06 +00003480 if( seenInterrupt ){
3481 if( in!=0 ) break;
3482 seenInterrupt = 0;
3483 }
drhc28490c2006-10-26 14:25:58 +00003484 lineno++;
drh849a9d92013-12-21 15:46:06 +00003485 if( nSql==0 && _all_whitespace(zLine) ){
3486 if( p->echoOn ) printf("%s\n", zLine);
3487 continue;
3488 }
drh2af0b2d2002-02-21 02:25:02 +00003489 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003490 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003491 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003492 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003493 break;
3494 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003495 errCnt++;
3496 }
drhdaffd0e2001-04-11 14:28:42 +00003497 continue;
3498 }
drh9f099fd2013-08-06 14:01:46 +00003499 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003500 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003501 }
drh9f099fd2013-08-06 14:01:46 +00003502 nLine = strlen30(zLine);
3503 if( nSql+nLine+2>=nAlloc ){
3504 nAlloc = nSql+nLine+100;
3505 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003506 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003507 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003508 exit(1);
3509 }
drhdaffd0e2001-04-11 14:28:42 +00003510 }
drh9f099fd2013-08-06 14:01:46 +00003511 nSqlPrior = nSql;
3512 if( nSql==0 ){
3513 int i;
3514 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003515 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003516 memcpy(zSql, zLine+i, nLine+1-i);
3517 startline = lineno;
3518 nSql = nLine-i;
3519 }else{
3520 zSql[nSql++] = '\n';
3521 memcpy(zSql+nSql, zLine, nLine+1);
3522 nSql += nLine;
3523 }
3524 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003525 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003526 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003527 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003528 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003529 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003530 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003531 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003532 char zPrefix[100];
3533 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003534 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003535 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003536 }else{
shane9bd1b442009-10-23 01:27:39 +00003537 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003538 }
drh7f953e22002-07-13 17:33:45 +00003539 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003540 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003541 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003542 zErrMsg = 0;
3543 }else{
shaned2bed1c2009-10-21 03:56:54 +00003544 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003545 }
drhc49f44e2006-10-26 18:15:42 +00003546 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003547 }
drhdaffd0e2001-04-11 14:28:42 +00003548 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003549 if( p->outCount ){
3550 output_reset(p);
3551 p->outCount = 0;
3552 }
drh9f099fd2013-08-06 14:01:46 +00003553 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003554 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003555 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003556 }
3557 }
drh9f099fd2013-08-06 14:01:46 +00003558 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003559 if( !_all_whitespace(zSql) ){
3560 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3561 }
drhdaffd0e2001-04-11 14:28:42 +00003562 free(zSql);
3563 }
danielk19772ac27622007-07-03 05:31:16 +00003564 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003565 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003566}
3567
drh67505e72002-04-19 12:34:06 +00003568/*
3569** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003570** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003571*/
3572static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003573 static char *home_dir = NULL;
3574 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003575
drh83905c92012-06-21 13:00:37 +00003576#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003577 {
3578 struct passwd *pwent;
3579 uid_t uid = getuid();
3580 if( (pwent=getpwuid(uid)) != NULL) {
3581 home_dir = pwent->pw_dir;
3582 }
drh67505e72002-04-19 12:34:06 +00003583 }
3584#endif
3585
chw65d3c132007-11-12 21:09:10 +00003586#if defined(_WIN32_WCE)
3587 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3588 */
drh85e72432012-04-11 11:38:53 +00003589 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003590#else
3591
drh83905c92012-06-21 13:00:37 +00003592#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003593 if (!home_dir) {
3594 home_dir = getenv("USERPROFILE");
3595 }
3596#endif
3597
drh67505e72002-04-19 12:34:06 +00003598 if (!home_dir) {
3599 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003600 }
3601
drh83905c92012-06-21 13:00:37 +00003602#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003603 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003604 char *zDrive, *zPath;
3605 int n;
3606 zDrive = getenv("HOMEDRIVE");
3607 zPath = getenv("HOMEPATH");
3608 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003609 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003610 home_dir = malloc( n );
3611 if( home_dir==0 ) return 0;
3612 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3613 return home_dir;
3614 }
3615 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003616 }
3617#endif
3618
chw65d3c132007-11-12 21:09:10 +00003619#endif /* !_WIN32_WCE */
3620
drh67505e72002-04-19 12:34:06 +00003621 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003622 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003623 char *z = malloc( n );
3624 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003625 home_dir = z;
3626 }
drhe98d4fa2002-04-21 19:06:22 +00003627
drh67505e72002-04-19 12:34:06 +00003628 return home_dir;
3629}
3630
3631/*
3632** Read input from the file given by sqliterc_override. Or if that
3633** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003634**
3635** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003636*/
shane9bd1b442009-10-23 01:27:39 +00003637static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003638 struct callback_data *p, /* Configuration data */
3639 const char *sqliterc_override /* Name of config file. NULL to use default */
3640){
persicom7e2dfdd2002-04-18 02:46:52 +00003641 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003642 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003643 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003644 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003645 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003646
3647 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003648 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003649 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003650#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003651 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003652#endif
shane9bd1b442009-10-23 01:27:39 +00003653 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003654 }
drh2f3de322012-06-27 16:41:31 +00003655 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003656 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3657 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003658 }
drha1f9b5e2004-02-14 16:31:02 +00003659 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003660 if( in ){
drhc28490c2006-10-26 14:25:58 +00003661 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003662 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003663 }
shane9bd1b442009-10-23 01:27:39 +00003664 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003665 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003666 }
drh85e72432012-04-11 11:38:53 +00003667 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003668 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003669}
3670
drh67505e72002-04-19 12:34:06 +00003671/*
drhe1e38c42003-05-04 18:30:59 +00003672** Show available command line options
3673*/
3674static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003675 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003676 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003677 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003678 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003679 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003680 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003681 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003682 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003683#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3684 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3685#endif
drhcc3b4f82012-02-07 14:13:50 +00003686 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003687 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003688 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003689 " -line set output mode to 'line'\n"
3690 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003691 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003692#ifdef SQLITE_ENABLE_MULTIPLEX
3693 " -multiplex enable the multiplexor VFS\n"
3694#endif
drh98d312f2012-10-25 15:23:14 +00003695 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3696 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003697 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003698 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003699 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003700#ifdef SQLITE_ENABLE_VFSTRACE
3701 " -vfstrace enable tracing of all VFS calls\n"
3702#endif
drhe1e38c42003-05-04 18:30:59 +00003703;
3704static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003705 fprintf(stderr,
3706 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3707 "FILENAME is the name of an SQLite database. A new database is created\n"
3708 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003709 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003710 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003711 }else{
3712 fprintf(stderr, "Use the -help option for additional information\n");
3713 }
3714 exit(1);
3715}
3716
3717/*
drh67505e72002-04-19 12:34:06 +00003718** Initialize the state information in data
3719*/
drh0850b532006-01-31 19:31:43 +00003720static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003721 memset(data, 0, sizeof(*data));
3722 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003723 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003724 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003725 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003726 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003727 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3728 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003729 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003730}
3731
drh98d312f2012-10-25 15:23:14 +00003732/*
drh5c7976f2014-02-10 19:59:27 +00003733** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003734*/
3735#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003736static void printBold(const char *zText){
3737 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3738 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3739 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3740 SetConsoleTextAttribute(out,
3741 FOREGROUND_RED|FOREGROUND_INTENSITY
3742 );
3743 printf("%s", zText);
3744 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003745}
3746#else
drh5c7976f2014-02-10 19:59:27 +00003747static void printBold(const char *zText){
3748 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003749}
3750#endif
3751
3752/*
drh98d312f2012-10-25 15:23:14 +00003753** Get the argument to an --option. Throw an error and die if no argument
3754** is available.
3755*/
3756static char *cmdline_option_value(int argc, char **argv, int i){
3757 if( i==argc ){
3758 fprintf(stderr, "%s: Error: missing argument to %s\n",
3759 argv[0], argv[argc-1]);
3760 exit(1);
3761 }
3762 return argv[i];
3763}
3764
drh75897232000-05-29 14:26:00 +00003765int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003766 char *zErrMsg = 0;
3767 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003768 const char *zInitFile = 0;
3769 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003770 int i;
drhc28490c2006-10-26 14:25:58 +00003771 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003772 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003773
drh69b30ab2014-02-27 15:11:52 +00003774#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003775 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3776 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3777 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3778 exit(1);
3779 }
drhc7181902014-02-27 15:04:13 +00003780#endif
drhdaffd0e2001-04-11 14:28:42 +00003781 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003782 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003783 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003784
drh44c2eb12003-04-30 11:38:26 +00003785 /* Make sure we have a valid signal handler early, before anything
3786 ** else is done.
3787 */
drh4c504392000-10-16 22:06:40 +00003788#ifdef SIGINT
3789 signal(SIGINT, interrupt_handler);
3790#endif
drh44c2eb12003-04-30 11:38:26 +00003791
drh22fbcb82004-02-01 01:22:50 +00003792 /* Do an initial pass through the command-line argument to locate
3793 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003794 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003795 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003796 */
drh98d312f2012-10-25 15:23:14 +00003797 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003798 char *z;
drhc28490c2006-10-26 14:25:58 +00003799 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003800 if( z[0]!='-' ){
3801 if( data.zDbFilename==0 ){
3802 data.zDbFilename = z;
3803 continue;
3804 }
3805 if( zFirstCmd==0 ){
3806 zFirstCmd = z;
3807 continue;
3808 }
3809 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3810 fprintf(stderr,"Use -help for a list of options.\n");
3811 return 1;
3812 }
drhcc3b4f82012-02-07 14:13:50 +00003813 if( z[1]=='-' ) z++;
3814 if( strcmp(z,"-separator")==0
3815 || strcmp(z,"-nullvalue")==0
3816 || strcmp(z,"-cmd")==0
3817 ){
drh98d312f2012-10-25 15:23:14 +00003818 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003819 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003820 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003821 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003822 /* Need to check for batch mode here to so we can avoid printing
3823 ** informational messages (like from process_sqliterc) before
3824 ** we do the actual processing of arguments later in a second pass.
3825 */
shanef69573d2009-10-24 02:06:14 +00003826 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003827 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003828#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003829 const char *zSize;
3830 sqlite3_int64 szHeap;
3831
drh98d312f2012-10-25 15:23:14 +00003832 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003833 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003834 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003835 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3836#endif
drh97ae8ff2011-03-16 16:56:29 +00003837#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003838 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003839 extern int vfstrace_register(
3840 const char *zTraceName,
3841 const char *zOldVfsName,
3842 int (*xOut)(const char*,void*),
3843 void *pOutArg,
3844 int makeDefault
3845 );
drh2b625e22011-03-16 17:05:28 +00003846 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003847#endif
drh6f25e892011-07-08 17:02:57 +00003848#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003849 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003850 extern int sqlite3_multiple_initialize(const char*,int);
3851 sqlite3_multiplex_initialize(0, 1);
3852#endif
drh7d9f3942013-04-03 01:26:54 +00003853 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003854 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3855 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003856 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003857 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003858 if( pVfs ){
3859 sqlite3_vfs_register(pVfs, 1);
3860 }else{
3861 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3862 exit(1);
3863 }
drh44c2eb12003-04-30 11:38:26 +00003864 }
3865 }
drh98d312f2012-10-25 15:23:14 +00003866 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003867#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003868 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003869 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003870#else
shane86f5bdb2009-10-24 02:00:07 +00003871 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3872 return 1;
drh01b41712005-08-29 23:06:23 +00003873#endif
drhc7181902014-02-27 15:04:13 +00003874#ifdef SQLITE_SHELL_DBNAME_PROC
3875 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3876 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3877 warnInmemoryDb = 0; }
3878#endif
drh98d312f2012-10-25 15:23:14 +00003879 }
3880 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003881
drh44c2eb12003-04-30 11:38:26 +00003882 /* Go ahead and open the database file if it already exists. If the
3883 ** file does not exist, delay opening it. This prevents empty database
3884 ** files from being created if a user mistypes the database name argument
3885 ** to the sqlite command-line tool.
3886 */
drhc8d74412004-08-31 23:41:26 +00003887 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003888 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003889 }
3890
drh22fbcb82004-02-01 01:22:50 +00003891 /* Process the initialization file if there is one. If no -init option
3892 ** is given on the command line, look for a file named ~/.sqliterc and
3893 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003894 */
shane86f5bdb2009-10-24 02:00:07 +00003895 rc = process_sqliterc(&data,zInitFile);
3896 if( rc>0 ){
3897 return rc;
3898 }
drh44c2eb12003-04-30 11:38:26 +00003899
drh22fbcb82004-02-01 01:22:50 +00003900 /* Make a second pass through the command-line argument and set
3901 ** options. This second pass is delayed until after the initialization
3902 ** file is processed so that the command-line arguments will override
3903 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003904 */
drh98d312f2012-10-25 15:23:14 +00003905 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003906 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003907 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003908 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003909 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003910 i++;
3911 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003912 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003913 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003914 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003915 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003916 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003917 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003918 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003919 }else if( strcmp(z,"-csv")==0 ){
3920 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003921 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003922 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003923 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003924 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003925 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003926 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003927 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003928 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003929 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003930 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003931 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003932 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003933 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00003934 }else if( strcmp(z,"-eqp")==0 ){
3935 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00003936 }else if( strcmp(z,"-stats")==0 ){
3937 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003938 }else if( strcmp(z,"-bail")==0 ){
3939 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003940 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003941 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003942 return 0;
drhc28490c2006-10-26 14:25:58 +00003943 }else if( strcmp(z,"-interactive")==0 ){
3944 stdin_is_interactive = 1;
3945 }else if( strcmp(z,"-batch")==0 ){
3946 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003947 }else if( strcmp(z,"-heap")==0 ){
3948 i++;
drh7d9f3942013-04-03 01:26:54 +00003949 }else if( strcmp(z,"-mmap")==0 ){
3950 i++;
drha7e61d82011-03-12 17:02:57 +00003951 }else if( strcmp(z,"-vfs")==0 ){
3952 i++;
drh6f25e892011-07-08 17:02:57 +00003953#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003954 }else if( strcmp(z,"-vfstrace")==0 ){
3955 i++;
drh6f25e892011-07-08 17:02:57 +00003956#endif
3957#ifdef SQLITE_ENABLE_MULTIPLEX
3958 }else if( strcmp(z,"-multiplex")==0 ){
3959 i++;
3960#endif
drhcc3b4f82012-02-07 14:13:50 +00003961 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003962 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003963 }else if( strcmp(z,"-cmd")==0 ){
3964 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003965 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003966 if( z[0]=='.' ){
3967 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003968 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003969 }else{
drh05782482013-10-24 15:20:20 +00003970 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003971 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3972 if( zErrMsg!=0 ){
3973 fprintf(stderr,"Error: %s\n", zErrMsg);
3974 if( bail_on_error ) return rc!=0 ? rc : 1;
3975 }else if( rc!=0 ){
3976 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3977 if( bail_on_error ) return rc;
3978 }
3979 }
drh1e5d0e92000-05-31 23:33:17 +00003980 }else{
shane86f5bdb2009-10-24 02:00:07 +00003981 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003982 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003983 return 1;
3984 }
3985 }
drh44c2eb12003-04-30 11:38:26 +00003986
drh22fbcb82004-02-01 01:22:50 +00003987 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003988 /* Run just the command that follows the database name
3989 */
drh22fbcb82004-02-01 01:22:50 +00003990 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003991 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003992 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003993 }else{
drh05782482013-10-24 15:20:20 +00003994 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003995 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003996 if( zErrMsg!=0 ){
3997 fprintf(stderr,"Error: %s\n", zErrMsg);
3998 return rc!=0 ? rc : 1;
3999 }else if( rc!=0 ){
4000 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4001 return rc;
drh6ff13852001-11-25 13:18:23 +00004002 }
drh75897232000-05-29 14:26:00 +00004003 }
4004 }else{
drh44c2eb12003-04-30 11:38:26 +00004005 /* Run commands received from standard input
4006 */
drhc28490c2006-10-26 14:25:58 +00004007 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004008 char *zHome;
4009 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004010 int nHistory;
drh75897232000-05-29 14:26:00 +00004011 printf(
drh743e0032011-12-12 16:51:50 +00004012 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004013 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004014 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004015 );
drhb3735912014-02-10 16:13:42 +00004016 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004017 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004018 printBold("transient in-memory database");
4019 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004020 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004021 }
drh67505e72002-04-19 12:34:06 +00004022 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004023 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004024 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004025 if( (zHistory = malloc(nHistory))!=0 ){
4026 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4027 }
drh67505e72002-04-19 12:34:06 +00004028 }
drhaaa21b42014-02-11 14:37:51 +00004029#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004030 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004031#endif
drhc28490c2006-10-26 14:25:58 +00004032 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004033 if( zHistory ){
4034 stifle_history(100);
4035 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004036 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004037 }
drhdaffd0e2001-04-11 14:28:42 +00004038 }else{
drhc28490c2006-10-26 14:25:58 +00004039 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004040 }
4041 }
drh33048c02001-10-01 14:29:22 +00004042 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004043 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004044 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004045 }
drh05782482013-10-24 15:20:20 +00004046 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004047 return rc;
drh75897232000-05-29 14:26:00 +00004048}