GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/sqlite3/shell.c Lines: 0 2126 0.0 %
Date: 2016-12-06 Branches: 0 1829 0.0 %

Line Branch Exec Source
1
/*
2
** 2001 September 15
3
**
4
** The author disclaims copyright to this source code.  In place of
5
** a legal notice, here is a blessing:
6
**
7
**    May you do good and not evil.
8
**    May you find forgiveness for yourself and forgive others.
9
**    May you share freely, never taking more than you give.
10
**
11
*************************************************************************
12
** This file contains code to implement the "sqlite" command line
13
** utility for accessing SQLite databases.
14
*/
15
#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16
/* This needs to come before any includes for MSVC compiler */
17
#define _CRT_SECURE_NO_WARNINGS
18
#endif
19
20
/*
21
** If requested, include the SQLite compiler options file for MSVC.
22
*/
23
#if defined(INCLUDE_MSVC_H)
24
#include "msvc.h"
25
#endif
26
27
/*
28
** No support for loadable extensions in VxWorks.
29
*/
30
#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
31
# define SQLITE_OMIT_LOAD_EXTENSION 1
32
#endif
33
34
/*
35
** Enable large-file support for fopen() and friends on unix.
36
*/
37
#ifndef SQLITE_DISABLE_LFS
38
# define _LARGE_FILE       1
39
# ifndef _FILE_OFFSET_BITS
40
#   define _FILE_OFFSET_BITS 64
41
# endif
42
# define _LARGEFILE_SOURCE 1
43
#endif
44
45
#include <stdlib.h>
46
#include <string.h>
47
#include <stdio.h>
48
#include <assert.h>
49
#include "sqlite3.h"
50
#if SQLITE_USER_AUTHENTICATION
51
# include "sqlite3userauth.h"
52
#endif
53
#include <ctype.h>
54
#include <stdarg.h>
55
56
#if !defined(_WIN32) && !defined(WIN32)
57
# include <signal.h>
58
# if !defined(__RTP__) && !defined(_WRS_KERNEL)
59
#  include <pwd.h>
60
# endif
61
# include <unistd.h>
62
# include <sys/types.h>
63
#endif
64
65
#if HAVE_READLINE
66
# include <readline/readline.h>
67
# include <readline/history.h>
68
#endif
69
70
#if HAVE_EDITLINE
71
# include <editline/readline.h>
72
#endif
73
74
#if HAVE_EDITLINE || HAVE_READLINE
75
76
# define shell_add_history(X) add_history(X)
77
# define shell_read_history(X) read_history(X)
78
# define shell_write_history(X) write_history(X)
79
# define shell_stifle_history(X) stifle_history(X)
80
# define shell_readline(X) readline(X)
81
82
#elif HAVE_LINENOISE
83
84
# include "linenoise.h"
85
# define shell_add_history(X) linenoiseHistoryAdd(X)
86
# define shell_read_history(X) linenoiseHistoryLoad(X)
87
# define shell_write_history(X) linenoiseHistorySave(X)
88
# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89
# define shell_readline(X) linenoise(X)
90
91
#else
92
93
# define shell_read_history(X)
94
# define shell_write_history(X)
95
# define shell_stifle_history(X)
96
97
# define SHELL_USE_LOCAL_GETLINE 1
98
#endif
99
100
101
#if defined(_WIN32) || defined(WIN32)
102
# include <io.h>
103
# include <fcntl.h>
104
# define isatty(h) _isatty(h)
105
# ifndef access
106
#  define access(f,m) _access((f),(m))
107
# endif
108
# undef popen
109
# define popen _popen
110
# undef pclose
111
# define pclose _pclose
112
#else
113
 /* Make sure isatty() has a prototype. */
114
 extern int isatty(int);
115
116
# if !defined(__RTP__) && !defined(_WRS_KERNEL)
117
  /* popen and pclose are not C89 functions and so are
118
  ** sometimes omitted from the <stdio.h> header */
119
   extern FILE *popen(const char*,const char*);
120
   extern int pclose(FILE*);
121
# else
122
#  define SQLITE_OMIT_POPEN 1
123
# endif
124
#endif
125
126
#if defined(_WIN32_WCE)
127
/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128
 * thus we always assume that we have a console. That can be
129
 * overridden with the -batch command line option.
130
 */
131
#define isatty(x) 1
132
#endif
133
134
/* ctype macros that work with signed characters */
135
#define IsSpace(X)  isspace((unsigned char)X)
136
#define IsDigit(X)  isdigit((unsigned char)X)
137
#define ToLower(X)  (char)tolower((unsigned char)X)
138
139
/* On Windows, we normally run with output mode of TEXT so that \n characters
140
** are automatically translated into \r\n.  However, this behavior needs
141
** to be disabled in some cases (ex: when generating CSV output and when
142
** rendering quoted strings that contain \n characters).  The following
143
** routines take care of that.
144
*/
145
#if defined(_WIN32) || defined(WIN32)
146
static void setBinaryMode(FILE *out){
147
  fflush(out);
148
  _setmode(_fileno(out), _O_BINARY);
149
}
150
static void setTextMode(FILE *out){
151
  fflush(out);
152
  _setmode(_fileno(out), _O_TEXT);
153
}
154
#else
155
# define setBinaryMode(X)
156
# define setTextMode(X)
157
#endif
158
159
160
/* True if the timer is enabled */
161
static int enableTimer = 0;
162
163
/* Return the current wall-clock time */
164
static sqlite3_int64 timeOfDay(void){
165
  static sqlite3_vfs *clockVfs = 0;
166
  sqlite3_int64 t;
167
  if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
168
  if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
169
    clockVfs->xCurrentTimeInt64(clockVfs, &t);
170
  }else{
171
    double r;
172
    clockVfs->xCurrentTime(clockVfs, &r);
173
    t = (sqlite3_int64)(r*86400000.0);
174
  }
175
  return t;
176
}
177
178
#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
179
#include <sys/time.h>
180
#include <sys/resource.h>
181
182
/* VxWorks does not support getrusage() as far as we can determine */
183
#if defined(_WRS_KERNEL) || defined(__RTP__)
184
struct rusage {
185
  struct timeval ru_utime; /* user CPU time used */
186
  struct timeval ru_stime; /* system CPU time used */
187
};
188
#define getrusage(A,B) memset(B,0,sizeof(*B))
189
#endif
190
191
/* Saved resource information for the beginning of an operation */
192
static struct rusage sBegin;  /* CPU time at start */
193
static sqlite3_int64 iBegin;  /* Wall-clock time at start */
194
195
/*
196
** Begin timing an operation
197
*/
198
static void beginTimer(void){
199
  if( enableTimer ){
200
    getrusage(RUSAGE_SELF, &sBegin);
201
    iBegin = timeOfDay();
202
  }
203
}
204
205
/* Return the difference of two time_structs in seconds */
206
static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
207
  return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
208
         (double)(pEnd->tv_sec - pStart->tv_sec);
209
}
210
211
/*
212
** Print the timing results.
213
*/
214
static void endTimer(void){
215
  if( enableTimer ){
216
    sqlite3_int64 iEnd = timeOfDay();
217
    struct rusage sEnd;
218
    getrusage(RUSAGE_SELF, &sEnd);
219
    printf("Run Time: real %.3f user %f sys %f\n",
220
       (iEnd - iBegin)*0.001,
221
       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
222
       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
223
  }
224
}
225
226
#define BEGIN_TIMER beginTimer()
227
#define END_TIMER endTimer()
228
#define HAS_TIMER 1
229
230
#elif (defined(_WIN32) || defined(WIN32))
231
232
#include <windows.h>
233
234
/* Saved resource information for the beginning of an operation */
235
static HANDLE hProcess;
236
static FILETIME ftKernelBegin;
237
static FILETIME ftUserBegin;
238
static sqlite3_int64 ftWallBegin;
239
typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
240
                                    LPFILETIME, LPFILETIME);
241
static GETPROCTIMES getProcessTimesAddr = NULL;
242
243
/*
244
** Check to see if we have timer support.  Return 1 if necessary
245
** support found (or found previously).
246
*/
247
static int hasTimer(void){
248
  if( getProcessTimesAddr ){
249
    return 1;
250
  } else {
251
    /* GetProcessTimes() isn't supported in WIN95 and some other Windows
252
    ** versions. See if the version we are running on has it, and if it
253
    ** does, save off a pointer to it and the current process handle.
254
    */
255
    hProcess = GetCurrentProcess();
256
    if( hProcess ){
257
      HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
258
      if( NULL != hinstLib ){
259
        getProcessTimesAddr =
260
            (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
261
        if( NULL != getProcessTimesAddr ){
262
          return 1;
263
        }
264
        FreeLibrary(hinstLib);
265
      }
266
    }
267
  }
268
  return 0;
269
}
270
271
/*
272
** Begin timing an operation
273
*/
274
static void beginTimer(void){
275
  if( enableTimer && getProcessTimesAddr ){
276
    FILETIME ftCreation, ftExit;
277
    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
278
                        &ftKernelBegin,&ftUserBegin);
279
    ftWallBegin = timeOfDay();
280
  }
281
}
282
283
/* Return the difference of two FILETIME structs in seconds */
284
static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
285
  sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
286
  sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
287
  return (double) ((i64End - i64Start) / 10000000.0);
288
}
289
290
/*
291
** Print the timing results.
292
*/
293
static void endTimer(void){
294
  if( enableTimer && getProcessTimesAddr){
295
    FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
296
    sqlite3_int64 ftWallEnd = timeOfDay();
297
    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
298
    printf("Run Time: real %.3f user %f sys %f\n",
299
       (ftWallEnd - ftWallBegin)*0.001,
300
       timeDiff(&ftUserBegin, &ftUserEnd),
301
       timeDiff(&ftKernelBegin, &ftKernelEnd));
302
  }
303
}
304
305
#define BEGIN_TIMER beginTimer()
306
#define END_TIMER endTimer()
307
#define HAS_TIMER hasTimer()
308
309
#else
310
#define BEGIN_TIMER
311
#define END_TIMER
312
#define HAS_TIMER 0
313
#endif
314
315
/*
316
** Used to prevent warnings about unused parameters
317
*/
318
#define UNUSED_PARAMETER(x) (void)(x)
319
320
/*
321
** If the following flag is set, then command execution stops
322
** at an error if we are not interactive.
323
*/
324
static int bail_on_error = 0;
325
326
/*
327
** Threat stdin as an interactive input if the following variable
328
** is true.  Otherwise, assume stdin is connected to a file or pipe.
329
*/
330
static int stdin_is_interactive = 1;
331
332
/*
333
** The following is the open SQLite database.  We make a pointer
334
** to this database a static variable so that it can be accessed
335
** by the SIGINT handler to interrupt database processing.
336
*/
337
static sqlite3 *globalDb = 0;
338
339
/*
340
** True if an interrupt (Control-C) has been received.
341
*/
342
static volatile int seenInterrupt = 0;
343
344
/*
345
** This is the name of our program. It is set in main(), used
346
** in a number of other places, mostly for error messages.
347
*/
348
static char *Argv0;
349
350
/*
351
** Prompt strings. Initialized in main. Settable with
352
**   .prompt main continue
353
*/
354
static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
355
static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
356
357
/*
358
** Write I/O traces to the following stream.
359
*/
360
#ifdef SQLITE_ENABLE_IOTRACE
361
static FILE *iotrace = 0;
362
#endif
363
364
/*
365
** This routine works like printf in that its first argument is a
366
** format string and subsequent arguments are values to be substituted
367
** in place of % fields.  The result of formatting this string
368
** is written to iotrace.
369
*/
370
#ifdef SQLITE_ENABLE_IOTRACE
371
static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
372
  va_list ap;
373
  char *z;
374
  if( iotrace==0 ) return;
375
  va_start(ap, zFormat);
376
  z = sqlite3_vmprintf(zFormat, ap);
377
  va_end(ap);
378
  fprintf(iotrace, "%s", z);
379
  sqlite3_free(z);
380
}
381
#endif
382
383
384
/*
385
** Determines if a string is a number of not.
386
*/
387
static int isNumber(const char *z, int *realnum){
388
  if( *z=='-' || *z=='+' ) z++;
389
  if( !IsDigit(*z) ){
390
    return 0;
391
  }
392
  z++;
393
  if( realnum ) *realnum = 0;
394
  while( IsDigit(*z) ){ z++; }
395
  if( *z=='.' ){
396
    z++;
397
    if( !IsDigit(*z) ) return 0;
398
    while( IsDigit(*z) ){ z++; }
399
    if( realnum ) *realnum = 1;
400
  }
401
  if( *z=='e' || *z=='E' ){
402
    z++;
403
    if( *z=='+' || *z=='-' ) z++;
404
    if( !IsDigit(*z) ) return 0;
405
    while( IsDigit(*z) ){ z++; }
406
    if( realnum ) *realnum = 1;
407
  }
408
  return *z==0;
409
}
410
411
/*
412
** A global char* and an SQL function to access its current value
413
** from within an SQL statement. This program used to use the
414
** sqlite_exec_printf() API to substitue a string into an SQL statement.
415
** The correct way to do this with sqlite3 is to use the bind API, but
416
** since the shell is built around the callback paradigm it would be a lot
417
** of work. Instead just use this hack, which is quite harmless.
418
*/
419
static const char *zShellStatic = 0;
420
static void shellstaticFunc(
421
  sqlite3_context *context,
422
  int argc,
423
  sqlite3_value **argv
424
){
425
  assert( 0==argc );
426
  assert( zShellStatic );
427
  UNUSED_PARAMETER(argc);
428
  UNUSED_PARAMETER(argv);
429
  sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
430
}
431
432
433
/*
434
** This routine reads a line of text from FILE in, stores
435
** the text in memory obtained from malloc() and returns a pointer
436
** to the text.  NULL is returned at end of file, or if malloc()
437
** fails.
438
**
439
** If zLine is not NULL then it is a malloced buffer returned from
440
** a previous call to this routine that may be reused.
441
*/
442
static char *local_getline(char *zLine, FILE *in){
443
  int nLine = zLine==0 ? 0 : 100;
444
  int n = 0;
445
446
  while( 1 ){
447
    if( n+100>nLine ){
448
      nLine = nLine*2 + 100;
449
      zLine = realloc(zLine, nLine);
450
      if( zLine==0 ) return 0;
451
    }
452
    if( fgets(&zLine[n], nLine - n, in)==0 ){
453
      if( n==0 ){
454
        free(zLine);
455
        return 0;
456
      }
457
      zLine[n] = 0;
458
      break;
459
    }
460
    while( zLine[n] ) n++;
461
    if( n>0 && zLine[n-1]=='\n' ){
462
      n--;
463
      if( n>0 && zLine[n-1]=='\r' ) n--;
464
      zLine[n] = 0;
465
      break;
466
    }
467
  }
468
  return zLine;
469
}
470
471
/*
472
** Retrieve a single line of input text.
473
**
474
** If in==0 then read from standard input and prompt before each line.
475
** If isContinuation is true, then a continuation prompt is appropriate.
476
** If isContinuation is zero, then the main prompt should be used.
477
**
478
** If zPrior is not NULL then it is a buffer from a prior call to this
479
** routine that can be reused.
480
**
481
** The result is stored in space obtained from malloc() and must either
482
** be freed by the caller or else passed back into this routine via the
483
** zPrior argument for reuse.
484
*/
485
static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
486
  char *zPrompt;
487
  char *zResult;
488
  if( in!=0 ){
489
    zResult = local_getline(zPrior, in);
490
  }else{
491
    zPrompt = isContinuation ? continuePrompt : mainPrompt;
492
#if SHELL_USE_LOCAL_GETLINE
493
    printf("%s", zPrompt);
494
    fflush(stdout);
495
    zResult = local_getline(zPrior, stdin);
496
#else
497
    free(zPrior);
498
    zResult = shell_readline(zPrompt);
499
    if( zResult && *zResult ) shell_add_history(zResult);
500
#endif
501
  }
502
  return zResult;
503
}
504
505
/*
506
** Shell output mode information from before ".explain on",
507
** saved so that it can be restored by ".explain off"
508
*/
509
typedef struct SavedModeInfo SavedModeInfo;
510
struct SavedModeInfo {
511
  int valid;          /* Is there legit data in here? */
512
  int mode;           /* Mode prior to ".explain on" */
513
  int showHeader;     /* The ".header" setting prior to ".explain on" */
514
  int colWidth[100];  /* Column widths prior to ".explain on" */
515
};
516
517
/*
518
** State information about the database connection is contained in an
519
** instance of the following structure.
520
*/
521
typedef struct ShellState ShellState;
522
struct ShellState {
523
  sqlite3 *db;           /* The database */
524
  int echoOn;            /* True to echo input commands */
525
  int autoEQP;           /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
526
  int statsOn;           /* True to display memory stats before each finalize */
527
  int scanstatsOn;       /* True to display scan stats before each finalize */
528
  int backslashOn;       /* Resolve C-style \x escapes in SQL input text */
529
  int outCount;          /* Revert to stdout when reaching zero */
530
  int cnt;               /* Number of records displayed so far */
531
  FILE *out;             /* Write results here */
532
  FILE *traceOut;        /* Output for sqlite3_trace() */
533
  int nErr;              /* Number of errors seen */
534
  int mode;              /* An output mode setting */
535
  int writableSchema;    /* True if PRAGMA writable_schema=ON */
536
  int showHeader;        /* True to show column names in List or Column mode */
537
  unsigned shellFlgs;    /* Various flags */
538
  char *zDestTable;      /* Name of destination table when MODE_Insert */
539
  char colSeparator[20]; /* Column separator character for several modes */
540
  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
541
  int colWidth[100];     /* Requested width of each column when in column mode*/
542
  int actualWidth[100];  /* Actual width of each column */
543
  char nullValue[20];    /* The text to print when a NULL comes back from
544
                         ** the database */
545
  SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
546
  char outfile[FILENAME_MAX]; /* Filename for *out */
547
  const char *zDbFilename;    /* name of the database file */
548
  char *zFreeOnClose;         /* Filename to free when closing */
549
  const char *zVfs;           /* Name of VFS to use */
550
  sqlite3_stmt *pStmt;   /* Current statement if any. */
551
  FILE *pLog;            /* Write log output here */
552
  int *aiIndent;         /* Array of indents used in MODE_Explain */
553
  int nIndent;           /* Size of array aiIndent[] */
554
  int iIndent;           /* Index of current op in aiIndent[] */
555
};
556
557
/*
558
** These are the allowed shellFlgs values
559
*/
560
#define SHFLG_Scratch     0x00001     /* The --scratch option is used */
561
#define SHFLG_Pagecache   0x00002     /* The --pagecache option is used */
562
#define SHFLG_Lookaside   0x00004     /* Lookaside memory is used */
563
564
/*
565
** These are the allowed modes.
566
*/
567
#define MODE_Line     0  /* One column per line.  Blank line between records */
568
#define MODE_Column   1  /* One record per line in neat columns */
569
#define MODE_List     2  /* One record per line with a separator */
570
#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
571
#define MODE_Html     4  /* Generate an XHTML table */
572
#define MODE_Insert   5  /* Generate SQL "insert" statements */
573
#define MODE_Tcl      6  /* Generate ANSI-C or TCL quoted elements */
574
#define MODE_Csv      7  /* Quote strings, numbers are plain */
575
#define MODE_Explain  8  /* Like MODE_Column, but do not truncate data */
576
#define MODE_Ascii    9  /* Use ASCII unit and record separators (0x1F/0x1E) */
577
578
static const char *modeDescr[] = {
579
  "line",
580
  "column",
581
  "list",
582
  "semi",
583
  "html",
584
  "insert",
585
  "tcl",
586
  "csv",
587
  "explain",
588
  "ascii",
589
};
590
591
/*
592
** These are the column/row/line separators used by the various
593
** import/export modes.
594
*/
595
#define SEP_Column    "|"
596
#define SEP_Row       "\n"
597
#define SEP_Tab       "\t"
598
#define SEP_Space     " "
599
#define SEP_Comma     ","
600
#define SEP_CrLf      "\r\n"
601
#define SEP_Unit      "\x1F"
602
#define SEP_Record    "\x1E"
603
604
/*
605
** Number of elements in an array
606
*/
607
#define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
608
609
/*
610
** Compute a string length that is limited to what can be stored in
611
** lower 30 bits of a 32-bit signed integer.
612
*/
613
static int strlen30(const char *z){
614
  const char *z2 = z;
615
  while( *z2 ){ z2++; }
616
  return 0x3fffffff & (int)(z2 - z);
617
}
618
619
/*
620
** A callback for the sqlite3_log() interface.
621
*/
622
static void shellLog(void *pArg, int iErrCode, const char *zMsg){
623
  ShellState *p = (ShellState*)pArg;
624
  if( p->pLog==0 ) return;
625
  fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
626
  fflush(p->pLog);
627
}
628
629
/*
630
** Output the given string as a hex-encoded blob (eg. X'1234' )
631
*/
632
static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
633
  int i;
634
  char *zBlob = (char *)pBlob;
635
  fprintf(out,"X'");
636
  for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
637
  fprintf(out,"'");
638
}
639
640
/*
641
** Output the given string as a quoted string using SQL quoting conventions.
642
*/
643
static void output_quoted_string(FILE *out, const char *z){
644
  int i;
645
  int nSingle = 0;
646
  setBinaryMode(out);
647
  for(i=0; z[i]; i++){
648
    if( z[i]=='\'' ) nSingle++;
649
  }
650
  if( nSingle==0 ){
651
    fprintf(out,"'%s'",z);
652
  }else{
653
    fprintf(out,"'");
654
    while( *z ){
655
      for(i=0; z[i] && z[i]!='\''; i++){}
656
      if( i==0 ){
657
        fprintf(out,"''");
658
        z++;
659
      }else if( z[i]=='\'' ){
660
        fprintf(out,"%.*s''",i,z);
661
        z += i+1;
662
      }else{
663
        fprintf(out,"%s",z);
664
        break;
665
      }
666
    }
667
    fprintf(out,"'");
668
  }
669
  setTextMode(out);
670
}
671
672
/*
673
** Output the given string as a quoted according to C or TCL quoting rules.
674
*/
675
static void output_c_string(FILE *out, const char *z){
676
  unsigned int c;
677
  fputc('"', out);
678
  while( (c = *(z++))!=0 ){
679
    if( c=='\\' ){
680
      fputc(c, out);
681
      fputc(c, out);
682
    }else if( c=='"' ){
683
      fputc('\\', out);
684
      fputc('"', out);
685
    }else if( c=='\t' ){
686
      fputc('\\', out);
687
      fputc('t', out);
688
    }else if( c=='\n' ){
689
      fputc('\\', out);
690
      fputc('n', out);
691
    }else if( c=='\r' ){
692
      fputc('\\', out);
693
      fputc('r', out);
694
    }else if( !isprint(c&0xff) ){
695
      fprintf(out, "\\%03o", c&0xff);
696
    }else{
697
      fputc(c, out);
698
    }
699
  }
700
  fputc('"', out);
701
}
702
703
/*
704
** Output the given string with characters that are special to
705
** HTML escaped.
706
*/
707
static void output_html_string(FILE *out, const char *z){
708
  int i;
709
  if( z==0 ) z = "";
710
  while( *z ){
711
    for(i=0;   z[i]
712
            && z[i]!='<'
713
            && z[i]!='&'
714
            && z[i]!='>'
715
            && z[i]!='\"'
716
            && z[i]!='\'';
717
        i++){}
718
    if( i>0 ){
719
      fprintf(out,"%.*s",i,z);
720
    }
721
    if( z[i]=='<' ){
722
      fprintf(out,"&lt;");
723
    }else if( z[i]=='&' ){
724
      fprintf(out,"&amp;");
725
    }else if( z[i]=='>' ){
726
      fprintf(out,"&gt;");
727
    }else if( z[i]=='\"' ){
728
      fprintf(out,"&quot;");
729
    }else if( z[i]=='\'' ){
730
      fprintf(out,"&#39;");
731
    }else{
732
      break;
733
    }
734
    z += i + 1;
735
  }
736
}
737
738
/*
739
** If a field contains any character identified by a 1 in the following
740
** array, then the string must be quoted for CSV.
741
*/
742
static const char needCsvQuote[] = {
743
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
744
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
745
  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
746
  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
747
  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
748
  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
749
  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
750
  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
751
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
752
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
753
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
754
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
755
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
756
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
757
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
758
  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
759
};
760
761
/*
762
** Output a single term of CSV.  Actually, p->colSeparator is used for
763
** the separator, which may or may not be a comma.  p->nullValue is
764
** the null value.  Strings are quoted if necessary.  The separator
765
** is only issued if bSep is true.
766
*/
767
static void output_csv(ShellState *p, const char *z, int bSep){
768
  FILE *out = p->out;
769
  if( z==0 ){
770
    fprintf(out,"%s",p->nullValue);
771
  }else{
772
    int i;
773
    int nSep = strlen30(p->colSeparator);
774
    for(i=0; z[i]; i++){
775
      if( needCsvQuote[((unsigned char*)z)[i]]
776
         || (z[i]==p->colSeparator[0] &&
777
             (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
778
        i = 0;
779
        break;
780
      }
781
    }
782
    if( i==0 ){
783
      putc('"', out);
784
      for(i=0; z[i]; i++){
785
        if( z[i]=='"' ) putc('"', out);
786
        putc(z[i], out);
787
      }
788
      putc('"', out);
789
    }else{
790
      fprintf(out, "%s", z);
791
    }
792
  }
793
  if( bSep ){
794
    fprintf(p->out, "%s", p->colSeparator);
795
  }
796
}
797
798
#ifdef SIGINT
799
/*
800
** This routine runs when the user presses Ctrl-C
801
*/
802
static void interrupt_handler(int NotUsed){
803
  UNUSED_PARAMETER(NotUsed);
804
  seenInterrupt++;
805
  if( seenInterrupt>2 ) exit(1);
806
  if( globalDb ) sqlite3_interrupt(globalDb);
807
}
808
#endif
809
810
/*
811
** This is the callback routine that the shell
812
** invokes for each row of a query result.
813
*/
814
static int shell_callback(
815
  void *pArg,
816
  int nArg,        /* Number of result columns */
817
  char **azArg,    /* Text of each result column */
818
  char **azCol,    /* Column names */
819
  int *aiType      /* Column types */
820
){
821
  int i;
822
  ShellState *p = (ShellState*)pArg;
823
824
  switch( p->mode ){
825
    case MODE_Line: {
826
      int w = 5;
827
      if( azArg==0 ) break;
828
      for(i=0; i<nArg; i++){
829
        int len = strlen30(azCol[i] ? azCol[i] : "");
830
        if( len>w ) w = len;
831
      }
832
      if( p->cnt++>0 ) fprintf(p->out, "%s", p->rowSeparator);
833
      for(i=0; i<nArg; i++){
834
        fprintf(p->out,"%*s = %s%s", w, azCol[i],
835
                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
836
      }
837
      break;
838
    }
839
    case MODE_Explain:
840
    case MODE_Column: {
841
      if( p->cnt++==0 ){
842
        for(i=0; i<nArg; i++){
843
          int w, n;
844
          if( i<ArraySize(p->colWidth) ){
845
            w = p->colWidth[i];
846
          }else{
847
            w = 0;
848
          }
849
          if( w==0 ){
850
            w = strlen30(azCol[i] ? azCol[i] : "");
851
            if( w<10 ) w = 10;
852
            n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
853
            if( w<n ) w = n;
854
          }
855
          if( i<ArraySize(p->actualWidth) ){
856
            p->actualWidth[i] = w;
857
          }
858
          if( p->showHeader ){
859
            if( w<0 ){
860
              fprintf(p->out,"%*.*s%s",-w,-w,azCol[i],
861
                      i==nArg-1 ? p->rowSeparator : "  ");
862
            }else{
863
              fprintf(p->out,"%-*.*s%s",w,w,azCol[i],
864
                      i==nArg-1 ? p->rowSeparator : "  ");
865
            }
866
          }
867
        }
868
        if( p->showHeader ){
869
          for(i=0; i<nArg; i++){
870
            int w;
871
            if( i<ArraySize(p->actualWidth) ){
872
               w = p->actualWidth[i];
873
               if( w<0 ) w = -w;
874
            }else{
875
               w = 10;
876
            }
877
            fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
878
                   "----------------------------------------------------------",
879
                    i==nArg-1 ? p->rowSeparator : "  ");
880
          }
881
        }
882
      }
883
      if( azArg==0 ) break;
884
      for(i=0; i<nArg; i++){
885
        int w;
886
        if( i<ArraySize(p->actualWidth) ){
887
           w = p->actualWidth[i];
888
        }else{
889
           w = 10;
890
        }
891
        if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
892
          w = strlen30(azArg[i]);
893
        }
894
        if( i==1 && p->aiIndent && p->pStmt ){
895
          if( p->iIndent<p->nIndent ){
896
            fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
897
          }
898
          p->iIndent++;
899
        }
900
        if( w<0 ){
901
          fprintf(p->out,"%*.*s%s",-w,-w,
902
              azArg[i] ? azArg[i] : p->nullValue,
903
              i==nArg-1 ? p->rowSeparator : "  ");
904
        }else{
905
          fprintf(p->out,"%-*.*s%s",w,w,
906
              azArg[i] ? azArg[i] : p->nullValue,
907
              i==nArg-1 ? p->rowSeparator : "  ");
908
        }
909
      }
910
      break;
911
    }
912
    case MODE_Semi:
913
    case MODE_List: {
914
      if( p->cnt++==0 && p->showHeader ){
915
        for(i=0; i<nArg; i++){
916
          fprintf(p->out,"%s%s",azCol[i],
917
                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
918
        }
919
      }
920
      if( azArg==0 ) break;
921
      for(i=0; i<nArg; i++){
922
        char *z = azArg[i];
923
        if( z==0 ) z = p->nullValue;
924
        fprintf(p->out, "%s", z);
925
        if( i<nArg-1 ){
926
          fprintf(p->out, "%s", p->colSeparator);
927
        }else if( p->mode==MODE_Semi ){
928
          fprintf(p->out, ";%s", p->rowSeparator);
929
        }else{
930
          fprintf(p->out, "%s", p->rowSeparator);
931
        }
932
      }
933
      break;
934
    }
935
    case MODE_Html: {
936
      if( p->cnt++==0 && p->showHeader ){
937
        fprintf(p->out,"<TR>");
938
        for(i=0; i<nArg; i++){
939
          fprintf(p->out,"<TH>");
940
          output_html_string(p->out, azCol[i]);
941
          fprintf(p->out,"</TH>\n");
942
        }
943
        fprintf(p->out,"</TR>\n");
944
      }
945
      if( azArg==0 ) break;
946
      fprintf(p->out,"<TR>");
947
      for(i=0; i<nArg; i++){
948
        fprintf(p->out,"<TD>");
949
        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
950
        fprintf(p->out,"</TD>\n");
951
      }
952
      fprintf(p->out,"</TR>\n");
953
      break;
954
    }
955
    case MODE_Tcl: {
956
      if( p->cnt++==0 && p->showHeader ){
957
        for(i=0; i<nArg; i++){
958
          output_c_string(p->out,azCol[i] ? azCol[i] : "");
959
          if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
960
        }
961
        fprintf(p->out, "%s", p->rowSeparator);
962
      }
963
      if( azArg==0 ) break;
964
      for(i=0; i<nArg; i++){
965
        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
966
        if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
967
      }
968
      fprintf(p->out, "%s", p->rowSeparator);
969
      break;
970
    }
971
    case MODE_Csv: {
972
      setBinaryMode(p->out);
973
      if( p->cnt++==0 && p->showHeader ){
974
        for(i=0; i<nArg; i++){
975
          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
976
        }
977
        fprintf(p->out, "%s", p->rowSeparator);
978
      }
979
      if( nArg>0 ){
980
        for(i=0; i<nArg; i++){
981
          output_csv(p, azArg[i], i<nArg-1);
982
        }
983
        fprintf(p->out, "%s", p->rowSeparator);
984
      }
985
      setTextMode(p->out);
986
      break;
987
    }
988
    case MODE_Insert: {
989
      p->cnt++;
990
      if( azArg==0 ) break;
991
      fprintf(p->out,"INSERT INTO %s",p->zDestTable);
992
      if( p->showHeader ){
993
        fprintf(p->out,"(");
994
        for(i=0; i<nArg; i++){
995
          char *zSep = i>0 ? ",": "";
996
          fprintf(p->out, "%s%s", zSep, azCol[i]);
997
        }
998
        fprintf(p->out,")");
999
      }
1000
      fprintf(p->out," VALUES(");
1001
      for(i=0; i<nArg; i++){
1002
        char *zSep = i>0 ? ",": "";
1003
        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1004
          fprintf(p->out,"%sNULL",zSep);
1005
        }else if( aiType && aiType[i]==SQLITE_TEXT ){
1006
          if( zSep[0] ) fprintf(p->out,"%s",zSep);
1007
          output_quoted_string(p->out, azArg[i]);
1008
        }else if( aiType && (aiType[i]==SQLITE_INTEGER
1009
                             || aiType[i]==SQLITE_FLOAT) ){
1010
          fprintf(p->out,"%s%s",zSep, azArg[i]);
1011
        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1012
          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1013
          int nBlob = sqlite3_column_bytes(p->pStmt, i);
1014
          if( zSep[0] ) fprintf(p->out,"%s",zSep);
1015
          output_hex_blob(p->out, pBlob, nBlob);
1016
        }else if( isNumber(azArg[i], 0) ){
1017
          fprintf(p->out,"%s%s",zSep, azArg[i]);
1018
        }else{
1019
          if( zSep[0] ) fprintf(p->out,"%s",zSep);
1020
          output_quoted_string(p->out, azArg[i]);
1021
        }
1022
      }
1023
      fprintf(p->out,");\n");
1024
      break;
1025
    }
1026
    case MODE_Ascii: {
1027
      if( p->cnt++==0 && p->showHeader ){
1028
        for(i=0; i<nArg; i++){
1029
          if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1030
          fprintf(p->out,"%s",azCol[i] ? azCol[i] : "");
1031
        }
1032
        fprintf(p->out, "%s", p->rowSeparator);
1033
      }
1034
      if( azArg==0 ) break;
1035
      for(i=0; i<nArg; i++){
1036
        if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1037
        fprintf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
1038
      }
1039
      fprintf(p->out, "%s", p->rowSeparator);
1040
      break;
1041
    }
1042
  }
1043
  return 0;
1044
}
1045
1046
/*
1047
** This is the callback routine that the SQLite library
1048
** invokes for each row of a query result.
1049
*/
1050
static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1051
  /* since we don't have type info, call the shell_callback with a NULL value */
1052
  return shell_callback(pArg, nArg, azArg, azCol, NULL);
1053
}
1054
1055
/*
1056
** Set the destination table field of the ShellState structure to
1057
** the name of the table given.  Escape any quote characters in the
1058
** table name.
1059
*/
1060
static void set_table_name(ShellState *p, const char *zName){
1061
  int i, n;
1062
  int needQuote;
1063
  char *z;
1064
1065
  if( p->zDestTable ){
1066
    free(p->zDestTable);
1067
    p->zDestTable = 0;
1068
  }
1069
  if( zName==0 ) return;
1070
  needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
1071
  for(i=n=0; zName[i]; i++, n++){
1072
    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
1073
      needQuote = 1;
1074
      if( zName[i]=='\'' ) n++;
1075
    }
1076
  }
1077
  if( needQuote ) n += 2;
1078
  z = p->zDestTable = malloc( n+1 );
1079
  if( z==0 ){
1080
    fprintf(stderr,"Error: out of memory\n");
1081
    exit(1);
1082
  }
1083
  n = 0;
1084
  if( needQuote ) z[n++] = '\'';
1085
  for(i=0; zName[i]; i++){
1086
    z[n++] = zName[i];
1087
    if( zName[i]=='\'' ) z[n++] = '\'';
1088
  }
1089
  if( needQuote ) z[n++] = '\'';
1090
  z[n] = 0;
1091
}
1092
1093
/* zIn is either a pointer to a NULL-terminated string in memory obtained
1094
** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1095
** added to zIn, and the result returned in memory obtained from malloc().
1096
** zIn, if it was not NULL, is freed.
1097
**
1098
** If the third argument, quote, is not '\0', then it is used as a
1099
** quote character for zAppend.
1100
*/
1101
static char *appendText(char *zIn, char const *zAppend, char quote){
1102
  int len;
1103
  int i;
1104
  int nAppend = strlen30(zAppend);
1105
  int nIn = (zIn?strlen30(zIn):0);
1106
1107
  len = nAppend+nIn+1;
1108
  if( quote ){
1109
    len += 2;
1110
    for(i=0; i<nAppend; i++){
1111
      if( zAppend[i]==quote ) len++;
1112
    }
1113
  }
1114
1115
  zIn = (char *)realloc(zIn, len);
1116
  if( !zIn ){
1117
    return 0;
1118
  }
1119
1120
  if( quote ){
1121
    char *zCsr = &zIn[nIn];
1122
    *zCsr++ = quote;
1123
    for(i=0; i<nAppend; i++){
1124
      *zCsr++ = zAppend[i];
1125
      if( zAppend[i]==quote ) *zCsr++ = quote;
1126
    }
1127
    *zCsr++ = quote;
1128
    *zCsr++ = '\0';
1129
    assert( (zCsr-zIn)==len );
1130
  }else{
1131
    memcpy(&zIn[nIn], zAppend, nAppend);
1132
    zIn[len-1] = '\0';
1133
  }
1134
1135
  return zIn;
1136
}
1137
1138
1139
/*
1140
** Execute a query statement that will generate SQL output.  Print
1141
** the result columns, comma-separated, on a line and then add a
1142
** semicolon terminator to the end of that line.
1143
**
1144
** If the number of columns is 1 and that column contains text "--"
1145
** then write the semicolon on a separate line.  That way, if a
1146
** "--" comment occurs at the end of the statement, the comment
1147
** won't consume the semicolon terminator.
1148
*/
1149
static int run_table_dump_query(
1150
  ShellState *p,           /* Query context */
1151
  const char *zSelect,     /* SELECT statement to extract content */
1152
  const char *zFirstRow    /* Print before first row, if not NULL */
1153
){
1154
  sqlite3_stmt *pSelect;
1155
  int rc;
1156
  int nResult;
1157
  int i;
1158
  const char *z;
1159
  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
1160
  if( rc!=SQLITE_OK || !pSelect ){
1161
    fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1162
    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1163
    return rc;
1164
  }
1165
  rc = sqlite3_step(pSelect);
1166
  nResult = sqlite3_column_count(pSelect);
1167
  while( rc==SQLITE_ROW ){
1168
    if( zFirstRow ){
1169
      fprintf(p->out, "%s", zFirstRow);
1170
      zFirstRow = 0;
1171
    }
1172
    z = (const char*)sqlite3_column_text(pSelect, 0);
1173
    fprintf(p->out, "%s", z);
1174
    for(i=1; i<nResult; i++){
1175
      fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1176
    }
1177
    if( z==0 ) z = "";
1178
    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1179
    if( z[0] ){
1180
      fprintf(p->out, "\n;\n");
1181
    }else{
1182
      fprintf(p->out, ";\n");
1183
    }
1184
    rc = sqlite3_step(pSelect);
1185
  }
1186
  rc = sqlite3_finalize(pSelect);
1187
  if( rc!=SQLITE_OK ){
1188
    fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1189
    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1190
  }
1191
  return rc;
1192
}
1193
1194
/*
1195
** Allocate space and save off current error string.
1196
*/
1197
static char *save_err_msg(
1198
  sqlite3 *db            /* Database to query */
1199
){
1200
  int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1201
  char *zErrMsg = sqlite3_malloc64(nErrMsg);
1202
  if( zErrMsg ){
1203
    memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1204
  }
1205
  return zErrMsg;
1206
}
1207
1208
/*
1209
** Display memory stats.
1210
*/
1211
static int display_stats(
1212
  sqlite3 *db,                /* Database to query */
1213
  ShellState *pArg,           /* Pointer to ShellState */
1214
  int bReset                  /* True to reset the stats */
1215
){
1216
  int iCur;
1217
  int iHiwtr;
1218
1219
  if( pArg && pArg->out ){
1220
1221
    iHiwtr = iCur = -1;
1222
    sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
1223
    fprintf(pArg->out,
1224
            "Memory Used:                         %d (max %d) bytes\n",
1225
            iCur, iHiwtr);
1226
    iHiwtr = iCur = -1;
1227
    sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
1228
    fprintf(pArg->out, "Number of Outstanding Allocations:   %d (max %d)\n",
1229
            iCur, iHiwtr);
1230
    if( pArg->shellFlgs & SHFLG_Pagecache ){
1231
      iHiwtr = iCur = -1;
1232
      sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1233
      fprintf(pArg->out,
1234
              "Number of Pcache Pages Used:         %d (max %d) pages\n",
1235
              iCur, iHiwtr);
1236
    }
1237
    iHiwtr = iCur = -1;
1238
    sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1239
    fprintf(pArg->out,
1240
            "Number of Pcache Overflow Bytes:     %d (max %d) bytes\n",
1241
            iCur, iHiwtr);
1242
    if( pArg->shellFlgs & SHFLG_Scratch ){
1243
      iHiwtr = iCur = -1;
1244
      sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1245
      fprintf(pArg->out, "Number of Scratch Allocations Used:  %d (max %d)\n",
1246
              iCur, iHiwtr);
1247
    }
1248
    iHiwtr = iCur = -1;
1249
    sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1250
    fprintf(pArg->out,
1251
            "Number of Scratch Overflow Bytes:    %d (max %d) bytes\n",
1252
            iCur, iHiwtr);
1253
    iHiwtr = iCur = -1;
1254
    sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1255
    fprintf(pArg->out, "Largest Allocation:                  %d bytes\n",
1256
            iHiwtr);
1257
    iHiwtr = iCur = -1;
1258
    sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1259
    fprintf(pArg->out, "Largest Pcache Allocation:           %d bytes\n",
1260
            iHiwtr);
1261
    iHiwtr = iCur = -1;
1262
    sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1263
    fprintf(pArg->out, "Largest Scratch Allocation:          %d bytes\n",
1264
            iHiwtr);
1265
#ifdef YYTRACKMAXSTACKDEPTH
1266
    iHiwtr = iCur = -1;
1267
    sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1268
    fprintf(pArg->out, "Deepest Parser Stack:                %d (max %d)\n",
1269
            iCur, iHiwtr);
1270
#endif
1271
  }
1272
1273
  if( pArg && pArg->out && db ){
1274
    if( pArg->shellFlgs & SHFLG_Lookaside ){
1275
      iHiwtr = iCur = -1;
1276
      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1277
                        &iCur, &iHiwtr, bReset);
1278
      fprintf(pArg->out, "Lookaside Slots Used:                %d (max %d)\n",
1279
              iCur, iHiwtr);
1280
      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1281
                        &iCur, &iHiwtr, bReset);
1282
      fprintf(pArg->out, "Successful lookaside attempts:       %d\n", iHiwtr);
1283
      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1284
                        &iCur, &iHiwtr, bReset);
1285
      fprintf(pArg->out, "Lookaside failures due to size:      %d\n", iHiwtr);
1286
      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1287
                        &iCur, &iHiwtr, bReset);
1288
      fprintf(pArg->out, "Lookaside failures due to OOM:       %d\n", iHiwtr);
1289
    }
1290
    iHiwtr = iCur = -1;
1291
    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1292
    fprintf(pArg->out, "Pager Heap Usage:                    %d bytes\n",iCur);
1293
    iHiwtr = iCur = -1;
1294
    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1295
    fprintf(pArg->out, "Page cache hits:                     %d\n", iCur);
1296
    iHiwtr = iCur = -1;
1297
    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1298
    fprintf(pArg->out, "Page cache misses:                   %d\n", iCur);
1299
    iHiwtr = iCur = -1;
1300
    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1301
    fprintf(pArg->out, "Page cache writes:                   %d\n", iCur);
1302
    iHiwtr = iCur = -1;
1303
    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1304
    fprintf(pArg->out, "Schema Heap Usage:                   %d bytes\n",iCur);
1305
    iHiwtr = iCur = -1;
1306
    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1307
    fprintf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",iCur);
1308
  }
1309
1310
  if( pArg && pArg->out && db && pArg->pStmt ){
1311
    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1312
                               bReset);
1313
    fprintf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
1314
    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1315
    fprintf(pArg->out, "Sort Operations:                     %d\n", iCur);
1316
    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
1317
    fprintf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
1318
    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1319
    fprintf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
1320
  }
1321
1322
  /* Do not remove this machine readable comment: extra-stats-output-here */
1323
1324
  return 0;
1325
}
1326
1327
/*
1328
** Display scan stats.
1329
*/
1330
static void display_scanstats(
1331
  sqlite3 *db,                    /* Database to query */
1332
  ShellState *pArg                /* Pointer to ShellState */
1333
){
1334
#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1335
  UNUSED_PARAMETER(db);
1336
  UNUSED_PARAMETER(pArg);
1337
#else
1338
  int i, k, n, mx;
1339
  fprintf(pArg->out, "-------- scanstats --------\n");
1340
  mx = 0;
1341
  for(k=0; k<=mx; k++){
1342
    double rEstLoop = 1.0;
1343
    for(i=n=0; 1; i++){
1344
      sqlite3_stmt *p = pArg->pStmt;
1345
      sqlite3_int64 nLoop, nVisit;
1346
      double rEst;
1347
      int iSid;
1348
      const char *zExplain;
1349
      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1350
        break;
1351
      }
1352
      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
1353
      if( iSid>mx ) mx = iSid;
1354
      if( iSid!=k ) continue;
1355
      if( n==0 ){
1356
        rEstLoop = (double)nLoop;
1357
        if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
1358
      }
1359
      n++;
1360
      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1361
      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1362
      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1363
      fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1364
      rEstLoop *= rEst;
1365
      fprintf(pArg->out,
1366
          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
1367
          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
1368
      );
1369
    }
1370
  }
1371
  fprintf(pArg->out, "---------------------------\n");
1372
#endif
1373
}
1374
1375
/*
1376
** Parameter azArray points to a zero-terminated array of strings. zStr
1377
** points to a single nul-terminated string. Return non-zero if zStr
1378
** is equal, according to strcmp(), to any of the strings in the array.
1379
** Otherwise, return zero.
1380
*/
1381
static int str_in_array(const char *zStr, const char **azArray){
1382
  int i;
1383
  for(i=0; azArray[i]; i++){
1384
    if( 0==strcmp(zStr, azArray[i]) ) return 1;
1385
  }
1386
  return 0;
1387
}
1388
1389
/*
1390
** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1391
** and populate the ShellState.aiIndent[] array with the number of
1392
** spaces each opcode should be indented before it is output.
1393
**
1394
** The indenting rules are:
1395
**
1396
**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1397
**       all opcodes that occur between the p2 jump destination and the opcode
1398
**       itself by 2 spaces.
1399
**
1400
**     * For each "Goto", if the jump destination is earlier in the program
1401
**       and ends on one of:
1402
**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
1403
**       or if the P1 parameter is one instead of zero,
1404
**       then indent all opcodes between the earlier instruction
1405
**       and "Goto" by 2 spaces.
1406
*/
1407
static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
1408
  const char *zSql;               /* The text of the SQL statement */
1409
  const char *z;                  /* Used to check if this is an EXPLAIN */
1410
  int *abYield = 0;               /* True if op is an OP_Yield */
1411
  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
1412
  int iOp;                        /* Index of operation in p->aiIndent[] */
1413
1414
  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1415
                           "NextIfOpen", "PrevIfOpen", 0 };
1416
  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1417
                            "Rewind", 0 };
1418
  const char *azGoto[] = { "Goto", 0 };
1419
1420
  /* Try to figure out if this is really an EXPLAIN statement. If this
1421
  ** cannot be verified, return early.  */
1422
  zSql = sqlite3_sql(pSql);
1423
  if( zSql==0 ) return;
1424
  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1425
  if( sqlite3_strnicmp(z, "explain", 7) ) return;
1426
1427
  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1428
    int i;
1429
    int iAddr = sqlite3_column_int(pSql, 0);
1430
    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1431
1432
    /* Set p2 to the P2 field of the current opcode. Then, assuming that
1433
    ** p2 is an instruction address, set variable p2op to the index of that
1434
    ** instruction in the aiIndent[] array. p2 and p2op may be different if
1435
    ** the current instruction is part of a sub-program generated by an
1436
    ** SQL trigger or foreign key.  */
1437
    int p2 = sqlite3_column_int(pSql, 3);
1438
    int p2op = (p2 + (iOp-iAddr));
1439
1440
    /* Grow the p->aiIndent array as required */
1441
    if( iOp>=nAlloc ){
1442
      nAlloc += 100;
1443
      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1444
      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
1445
    }
1446
    abYield[iOp] = str_in_array(zOp, azYield);
1447
    p->aiIndent[iOp] = 0;
1448
    p->nIndent = iOp+1;
1449
1450
    if( str_in_array(zOp, azNext) ){
1451
      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
1452
    }
1453
    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1454
     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1455
    ){
1456
      for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
1457
    }
1458
  }
1459
1460
  p->iIndent = 0;
1461
  sqlite3_free(abYield);
1462
  sqlite3_reset(pSql);
1463
}
1464
1465
/*
1466
** Free the array allocated by explain_data_prepare().
1467
*/
1468
static void explain_data_delete(ShellState *p){
1469
  sqlite3_free(p->aiIndent);
1470
  p->aiIndent = 0;
1471
  p->nIndent = 0;
1472
  p->iIndent = 0;
1473
}
1474
1475
/*
1476
** Execute a statement or set of statements.  Print
1477
** any result rows/columns depending on the current mode
1478
** set via the supplied callback.
1479
**
1480
** This is very similar to SQLite's built-in sqlite3_exec()
1481
** function except it takes a slightly different callback
1482
** and callback data argument.
1483
*/
1484
static int shell_exec(
1485
  sqlite3 *db,                              /* An open database */
1486
  const char *zSql,                         /* SQL to be evaluated */
1487
  int (*xCallback)(void*,int,char**,char**,int*),   /* Callback function */
1488
                                            /* (not the same as sqlite3_exec) */
1489
  ShellState *pArg,                         /* Pointer to ShellState */
1490
  char **pzErrMsg                           /* Error msg written here */
1491
){
1492
  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
1493
  int rc = SQLITE_OK;             /* Return Code */
1494
  int rc2;
1495
  const char *zLeftover;          /* Tail of unprocessed SQL */
1496
1497
  if( pzErrMsg ){
1498
    *pzErrMsg = NULL;
1499
  }
1500
1501
  while( zSql[0] && (SQLITE_OK == rc) ){
1502
    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1503
    if( SQLITE_OK != rc ){
1504
      if( pzErrMsg ){
1505
        *pzErrMsg = save_err_msg(db);
1506
      }
1507
    }else{
1508
      if( !pStmt ){
1509
        /* this happens for a comment or white-space */
1510
        zSql = zLeftover;
1511
        while( IsSpace(zSql[0]) ) zSql++;
1512
        continue;
1513
      }
1514
1515
      /* save off the prepared statment handle and reset row count */
1516
      if( pArg ){
1517
        pArg->pStmt = pStmt;
1518
        pArg->cnt = 0;
1519
      }
1520
1521
      /* echo the sql statement if echo on */
1522
      if( pArg && pArg->echoOn ){
1523
        const char *zStmtSql = sqlite3_sql(pStmt);
1524
        fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
1525
      }
1526
1527
      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1528
      if( pArg && pArg->autoEQP ){
1529
        sqlite3_stmt *pExplain;
1530
        char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1531
                                     sqlite3_sql(pStmt));
1532
        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1533
        if( rc==SQLITE_OK ){
1534
          while( sqlite3_step(pExplain)==SQLITE_ROW ){
1535
            fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1536
            fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1537
            fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1538
            fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1539
          }
1540
        }
1541
        sqlite3_finalize(pExplain);
1542
        sqlite3_free(zEQP);
1543
      }
1544
1545
      /* If the shell is currently in ".explain" mode, gather the extra
1546
      ** data required to add indents to the output.*/
1547
      if( pArg && pArg->mode==MODE_Explain ){
1548
        explain_data_prepare(pArg, pStmt);
1549
      }
1550
1551
      /* perform the first step.  this will tell us if we
1552
      ** have a result set or not and how wide it is.
1553
      */
1554
      rc = sqlite3_step(pStmt);
1555
      /* if we have a result set... */
1556
      if( SQLITE_ROW == rc ){
1557
        /* if we have a callback... */
1558
        if( xCallback ){
1559
          /* allocate space for col name ptr, value ptr, and type */
1560
          int nCol = sqlite3_column_count(pStmt);
1561
          void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
1562
          if( !pData ){
1563
            rc = SQLITE_NOMEM;
1564
          }else{
1565
            char **azCols = (char **)pData;      /* Names of result columns */
1566
            char **azVals = &azCols[nCol];       /* Results */
1567
            int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1568
            int i, x;
1569
            assert(sizeof(int) <= sizeof(char *));
1570
            /* save off ptrs to column names */
1571
            for(i=0; i<nCol; i++){
1572
              azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1573
            }
1574
            do{
1575
              /* extract the data and data types */
1576
              for(i=0; i<nCol; i++){
1577
                aiTypes[i] = x = sqlite3_column_type(pStmt, i);
1578
                if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
1579
                  azVals[i] = "";
1580
                }else{
1581
                  azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1582
                }
1583
                if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1584
                  rc = SQLITE_NOMEM;
1585
                  break; /* from for */
1586
                }
1587
              } /* end for */
1588
1589
              /* if data and types extracted successfully... */
1590
              if( SQLITE_ROW == rc ){
1591
                /* call the supplied callback with the result row data */
1592
                if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1593
                  rc = SQLITE_ABORT;
1594
                }else{
1595
                  rc = sqlite3_step(pStmt);
1596
                }
1597
              }
1598
            } while( SQLITE_ROW == rc );
1599
            sqlite3_free(pData);
1600
          }
1601
        }else{
1602
          do{
1603
            rc = sqlite3_step(pStmt);
1604
          } while( rc == SQLITE_ROW );
1605
        }
1606
      }
1607
1608
      explain_data_delete(pArg);
1609
1610
      /* print usage stats if stats on */
1611
      if( pArg && pArg->statsOn ){
1612
        display_stats(db, pArg, 0);
1613
      }
1614
1615
      /* print loop-counters if required */
1616
      if( pArg && pArg->scanstatsOn ){
1617
        display_scanstats(db, pArg);
1618
      }
1619
1620
      /* Finalize the statement just executed. If this fails, save a
1621
      ** copy of the error message. Otherwise, set zSql to point to the
1622
      ** next statement to execute. */
1623
      rc2 = sqlite3_finalize(pStmt);
1624
      if( rc!=SQLITE_NOMEM ) rc = rc2;
1625
      if( rc==SQLITE_OK ){
1626
        zSql = zLeftover;
1627
        while( IsSpace(zSql[0]) ) zSql++;
1628
      }else if( pzErrMsg ){
1629
        *pzErrMsg = save_err_msg(db);
1630
      }
1631
1632
      /* clear saved stmt handle */
1633
      if( pArg ){
1634
        pArg->pStmt = NULL;
1635
      }
1636
    }
1637
  } /* end while */
1638
1639
  return rc;
1640
}
1641
1642
1643
/*
1644
** This is a different callback routine used for dumping the database.
1645
** Each row received by this callback consists of a table name,
1646
** the table type ("index" or "table") and SQL to create the table.
1647
** This routine should print text sufficient to recreate the table.
1648
*/
1649
static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
1650
  int rc;
1651
  const char *zTable;
1652
  const char *zType;
1653
  const char *zSql;
1654
  const char *zPrepStmt = 0;
1655
  ShellState *p = (ShellState *)pArg;
1656
1657
  UNUSED_PARAMETER(azCol);
1658
  if( nArg!=3 ) return 1;
1659
  zTable = azArg[0];
1660
  zType = azArg[1];
1661
  zSql = azArg[2];
1662
1663
  if( strcmp(zTable, "sqlite_sequence")==0 ){
1664
    zPrepStmt = "DELETE FROM sqlite_sequence;\n";
1665
  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
1666
    fprintf(p->out, "ANALYZE sqlite_master;\n");
1667
  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1668
    return 0;
1669
  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1670
    char *zIns;
1671
    if( !p->writableSchema ){
1672
      fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1673
      p->writableSchema = 1;
1674
    }
1675
    zIns = sqlite3_mprintf(
1676
       "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1677
       "VALUES('table','%q','%q',0,'%q');",
1678
       zTable, zTable, zSql);
1679
    fprintf(p->out, "%s\n", zIns);
1680
    sqlite3_free(zIns);
1681
    return 0;
1682
  }else{
1683
    fprintf(p->out, "%s;\n", zSql);
1684
  }
1685
1686
  if( strcmp(zType, "table")==0 ){
1687
    sqlite3_stmt *pTableInfo = 0;
1688
    char *zSelect = 0;
1689
    char *zTableInfo = 0;
1690
    char *zTmp = 0;
1691
    int nRow = 0;
1692
1693
    zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1694
    zTableInfo = appendText(zTableInfo, zTable, '"');
1695
    zTableInfo = appendText(zTableInfo, ");", 0);
1696
1697
    rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
1698
    free(zTableInfo);
1699
    if( rc!=SQLITE_OK || !pTableInfo ){
1700
      return 1;
1701
    }
1702
1703
    zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1704
    /* Always quote the table name, even if it appears to be pure ascii,
1705
    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
1706
    zTmp = appendText(zTmp, zTable, '"');
1707
    if( zTmp ){
1708
      zSelect = appendText(zSelect, zTmp, '\'');
1709
      free(zTmp);
1710
    }
1711
    zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1712
    rc = sqlite3_step(pTableInfo);
1713
    while( rc==SQLITE_ROW ){
1714
      const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
1715
      zSelect = appendText(zSelect, "quote(", 0);
1716
      zSelect = appendText(zSelect, zText, '"');
1717
      rc = sqlite3_step(pTableInfo);
1718
      if( rc==SQLITE_ROW ){
1719
        zSelect = appendText(zSelect, "), ", 0);
1720
      }else{
1721
        zSelect = appendText(zSelect, ") ", 0);
1722
      }
1723
      nRow++;
1724
    }
1725
    rc = sqlite3_finalize(pTableInfo);
1726
    if( rc!=SQLITE_OK || nRow==0 ){
1727
      free(zSelect);
1728
      return 1;
1729
    }
1730
    zSelect = appendText(zSelect, "|| ')' FROM  ", 0);
1731
    zSelect = appendText(zSelect, zTable, '"');
1732
1733
    rc = run_table_dump_query(p, zSelect, zPrepStmt);
1734
    if( rc==SQLITE_CORRUPT ){
1735
      zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1736
      run_table_dump_query(p, zSelect, 0);
1737
    }
1738
    free(zSelect);
1739
  }
1740
  return 0;
1741
}
1742
1743
/*
1744
** Run zQuery.  Use dump_callback() as the callback routine so that
1745
** the contents of the query are output as SQL statements.
1746
**
1747
** If we get a SQLITE_CORRUPT error, rerun the query after appending
1748
** "ORDER BY rowid DESC" to the end.
1749
*/
1750
static int run_schema_dump_query(
1751
  ShellState *p,
1752
  const char *zQuery
1753
){
1754
  int rc;
1755
  char *zErr = 0;
1756
  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
1757
  if( rc==SQLITE_CORRUPT ){
1758
    char *zQ2;
1759
    int len = strlen30(zQuery);
1760
    fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1761
    if( zErr ){
1762
      fprintf(p->out, "/****** %s ******/\n", zErr);
1763
      sqlite3_free(zErr);
1764
      zErr = 0;
1765
    }
1766
    zQ2 = malloc( len+100 );
1767
    if( zQ2==0 ) return rc;
1768
    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
1769
    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1770
    if( rc ){
1771
      fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1772
    }else{
1773
      rc = SQLITE_CORRUPT;
1774
    }
1775
    sqlite3_free(zErr);
1776
    free(zQ2);
1777
  }
1778
  return rc;
1779
}
1780
1781
/*
1782
** Text of a help message
1783
*/
1784
static char zHelp[] =
1785
  ".backup ?DB? FILE      Backup DB (default \"main\") to FILE\n"
1786
  ".bail on|off           Stop after hitting an error.  Default OFF\n"
1787
  ".binary on|off         Turn binary output on or off.  Default OFF\n"
1788
  ".clone NEWDB           Clone data into NEWDB from the existing database\n"
1789
  ".databases             List names and files of attached databases\n"
1790
  ".dbinfo ?DB?           Show status information about the database\n"
1791
  ".dump ?TABLE? ...      Dump the database in an SQL text format\n"
1792
  "                         If TABLE specified, only dump tables matching\n"
1793
  "                         LIKE pattern TABLE.\n"
1794
  ".echo on|off           Turn command echo on or off\n"
1795
  ".eqp on|off            Enable or disable automatic EXPLAIN QUERY PLAN\n"
1796
  ".exit                  Exit this program\n"
1797
  ".explain ?on|off?      Turn output mode suitable for EXPLAIN on or off.\n"
1798
  "                         With no args, it turns EXPLAIN on.\n"
1799
  ".fullschema            Show schema and the content of sqlite_stat tables\n"
1800
  ".headers on|off        Turn display of headers on or off\n"
1801
  ".help                  Show this message\n"
1802
  ".import FILE TABLE     Import data from FILE into TABLE\n"
1803
  ".indexes ?TABLE?       Show names of all indexes\n"
1804
  "                         If TABLE specified, only show indexes for tables\n"
1805
  "                         matching LIKE pattern TABLE.\n"
1806
#ifdef SQLITE_ENABLE_IOTRACE
1807
  ".iotrace FILE          Enable I/O diagnostic logging to FILE\n"
1808
#endif
1809
  ".limit ?LIMIT? ?VAL?   Display or change the value of an SQLITE_LIMIT\n"
1810
#ifndef SQLITE_OMIT_LOAD_EXTENSION
1811
  ".load FILE ?ENTRY?     Load an extension library\n"
1812
#endif
1813
  ".log FILE|off          Turn logging on or off.  FILE can be stderr/stdout\n"
1814
  ".mode MODE ?TABLE?     Set output mode where MODE is one of:\n"
1815
  "                         ascii    Columns/rows delimited by 0x1F and 0x1E\n"
1816
  "                         csv      Comma-separated values\n"
1817
  "                         column   Left-aligned columns.  (See .width)\n"
1818
  "                         html     HTML <table> code\n"
1819
  "                         insert   SQL insert statements for TABLE\n"
1820
  "                         line     One value per line\n"
1821
  "                         list     Values delimited by .separator strings\n"
1822
  "                         tabs     Tab-separated values\n"
1823
  "                         tcl      TCL list elements\n"
1824
  ".nullvalue STRING      Use STRING in place of NULL values\n"
1825
  ".once FILENAME         Output for the next SQL command only to FILENAME\n"
1826
  ".open ?FILENAME?       Close existing database and reopen FILENAME\n"
1827
  ".output ?FILENAME?     Send output to FILENAME or stdout\n"
1828
  ".print STRING...       Print literal STRING\n"
1829
  ".prompt MAIN CONTINUE  Replace the standard prompts\n"
1830
  ".quit                  Exit this program\n"
1831
  ".read FILENAME         Execute SQL in FILENAME\n"
1832
  ".restore ?DB? FILE     Restore content of DB (default \"main\") from FILE\n"
1833
  ".save FILE             Write in-memory database into FILE\n"
1834
  ".scanstats on|off      Turn sqlite3_stmt_scanstatus() metrics on or off\n"
1835
  ".schema ?TABLE?        Show the CREATE statements\n"
1836
  "                         If TABLE specified, only show tables matching\n"
1837
  "                         LIKE pattern TABLE.\n"
1838
  ".separator COL ?ROW?   Change the column separator and optionally the row\n"
1839
  "                         separator for both the output mode and .import\n"
1840
  ".shell CMD ARGS...     Run CMD ARGS... in a system shell\n"
1841
  ".show                  Show the current values for various settings\n"
1842
  ".stats on|off          Turn stats on or off\n"
1843
  ".system CMD ARGS...    Run CMD ARGS... in a system shell\n"
1844
  ".tables ?TABLE?        List names of tables\n"
1845
  "                         If TABLE specified, only list tables matching\n"
1846
  "                         LIKE pattern TABLE.\n"
1847
  ".timeout MS            Try opening locked tables for MS milliseconds\n"
1848
  ".timer on|off          Turn SQL timer on or off\n"
1849
  ".trace FILE|off        Output each SQL statement as it is run\n"
1850
  ".vfsname ?AUX?         Print the name of the VFS stack\n"
1851
  ".width NUM1 NUM2 ...   Set column widths for \"column\" mode\n"
1852
  "                         Negative values right-justify\n"
1853
;
1854
1855
/* Forward reference */
1856
static int process_input(ShellState *p, FILE *in);
1857
/*
1858
** Implementation of the "readfile(X)" SQL function.  The entire content
1859
** of the file named X is read and returned as a BLOB.  NULL is returned
1860
** if the file does not exist or is unreadable.
1861
*/
1862
static void readfileFunc(
1863
  sqlite3_context *context,
1864
  int argc,
1865
  sqlite3_value **argv
1866
){
1867
  const char *zName;
1868
  FILE *in;
1869
  long nIn;
1870
  void *pBuf;
1871
1872
  UNUSED_PARAMETER(argc);
1873
  zName = (const char*)sqlite3_value_text(argv[0]);
1874
  if( zName==0 ) return;
1875
  in = fopen(zName, "rb");
1876
  if( in==0 ) return;
1877
  fseek(in, 0, SEEK_END);
1878
  nIn = ftell(in);
1879
  rewind(in);
1880
  pBuf = sqlite3_malloc64( nIn );
1881
  if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1882
    sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1883
  }else{
1884
    sqlite3_free(pBuf);
1885
  }
1886
  fclose(in);
1887
}
1888
1889
/*
1890
** Implementation of the "writefile(X,Y)" SQL function.  The argument Y
1891
** is written into file X.  The number of bytes written is returned.  Or
1892
** NULL is returned if something goes wrong, such as being unable to open
1893
** file X for writing.
1894
*/
1895
static void writefileFunc(
1896
  sqlite3_context *context,
1897
  int argc,
1898
  sqlite3_value **argv
1899
){
1900
  FILE *out;
1901
  const char *z;
1902
  sqlite3_int64 rc;
1903
  const char *zFile;
1904
1905
  UNUSED_PARAMETER(argc);
1906
  zFile = (const char*)sqlite3_value_text(argv[0]);
1907
  if( zFile==0 ) return;
1908
  out = fopen(zFile, "wb");
1909
  if( out==0 ) return;
1910
  z = (const char*)sqlite3_value_blob(argv[1]);
1911
  if( z==0 ){
1912
    rc = 0;
1913
  }else{
1914
    rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
1915
  }
1916
  fclose(out);
1917
  sqlite3_result_int64(context, rc);
1918
}
1919
1920
/*
1921
** Make sure the database is open.  If it is not, then open it.  If
1922
** the database fails to open, print an error message and exit.
1923
*/
1924
static void open_db(ShellState *p, int keepAlive){
1925
  if( p->db==0 ){
1926
    sqlite3_initialize();
1927
    sqlite3_open(p->zDbFilename, &p->db);
1928
    globalDb = p->db;
1929
    if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
1930
      sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
1931
          shellstaticFunc, 0, 0);
1932
    }
1933
    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
1934
      fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
1935
          p->zDbFilename, sqlite3_errmsg(p->db));
1936
      if( keepAlive ) return;
1937
      exit(1);
1938
    }
1939
#ifndef SQLITE_OMIT_LOAD_EXTENSION
1940
    sqlite3_enable_load_extension(p->db, 1);
1941
#endif
1942
    sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
1943
                            readfileFunc, 0, 0);
1944
    sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
1945
                            writefileFunc, 0, 0);
1946
  }
1947
}
1948
1949
/*
1950
** Do C-language style dequoting.
1951
**
1952
**    \a    -> alarm
1953
**    \b    -> backspace
1954
**    \t    -> tab
1955
**    \n    -> newline
1956
**    \v    -> vertical tab
1957
**    \f    -> form feed
1958
**    \r    -> carriage return
1959
**    \s    -> space
1960
**    \"    -> "
1961
**    \'    -> '
1962
**    \\    -> backslash
1963
**    \NNN  -> ascii character NNN in octal
1964
*/
1965
static void resolve_backslashes(char *z){
1966
  int i, j;
1967
  char c;
1968
  while( *z && *z!='\\' ) z++;
1969
  for(i=j=0; (c = z[i])!=0; i++, j++){
1970
    if( c=='\\' && z[i+1]!=0 ){
1971
      c = z[++i];
1972
      if( c=='a' ){
1973
        c = '\a';
1974
      }else if( c=='b' ){
1975
        c = '\b';
1976
      }else if( c=='t' ){
1977
        c = '\t';
1978
      }else if( c=='n' ){
1979
        c = '\n';
1980
      }else if( c=='v' ){
1981
        c = '\v';
1982
      }else if( c=='f' ){
1983
        c = '\f';
1984
      }else if( c=='r' ){
1985
        c = '\r';
1986
      }else if( c=='"' ){
1987
        c = '"';
1988
      }else if( c=='\'' ){
1989
        c = '\'';
1990
      }else if( c=='\\' ){
1991
        c = '\\';
1992
      }else if( c>='0' && c<='7' ){
1993
        c -= '0';
1994
        if( z[i+1]>='0' && z[i+1]<='7' ){
1995
          i++;
1996
          c = (c<<3) + z[i] - '0';
1997
          if( z[i+1]>='0' && z[i+1]<='7' ){
1998
            i++;
1999
            c = (c<<3) + z[i] - '0';
2000
          }
2001
        }
2002
      }
2003
    }
2004
    z[j] = c;
2005
  }
2006
  if( j<i ) z[j] = 0;
2007
}
2008
2009
/*
2010
** Return the value of a hexadecimal digit.  Return -1 if the input
2011
** is not a hex digit.
2012
*/
2013
static int hexDigitValue(char c){
2014
  if( c>='0' && c<='9' ) return c - '0';
2015
  if( c>='a' && c<='f' ) return c - 'a' + 10;
2016
  if( c>='A' && c<='F' ) return c - 'A' + 10;
2017
  return -1;
2018
}
2019
2020
/*
2021
** Interpret zArg as an integer value, possibly with suffixes.
2022
*/
2023
static sqlite3_int64 integerValue(const char *zArg){
2024
  sqlite3_int64 v = 0;
2025
  static const struct { char *zSuffix; int iMult; } aMult[] = {
2026
    { "KiB", 1024 },
2027
    { "MiB", 1024*1024 },
2028
    { "GiB", 1024*1024*1024 },
2029
    { "KB",  1000 },
2030
    { "MB",  1000000 },
2031
    { "GB",  1000000000 },
2032
    { "K",   1000 },
2033
    { "M",   1000000 },
2034
    { "G",   1000000000 },
2035
  };
2036
  int i;
2037
  int isNeg = 0;
2038
  if( zArg[0]=='-' ){
2039
    isNeg = 1;
2040
    zArg++;
2041
  }else if( zArg[0]=='+' ){
2042
    zArg++;
2043
  }
2044
  if( zArg[0]=='0' && zArg[1]=='x' ){
2045
    int x;
2046
    zArg += 2;
2047
    while( (x = hexDigitValue(zArg[0]))>=0 ){
2048
      v = (v<<4) + x;
2049
      zArg++;
2050
    }
2051
  }else{
2052
    while( IsDigit(zArg[0]) ){
2053
      v = v*10 + zArg[0] - '0';
2054
      zArg++;
2055
    }
2056
  }
2057
  for(i=0; i<ArraySize(aMult); i++){
2058
    if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2059
      v *= aMult[i].iMult;
2060
      break;
2061
    }
2062
  }
2063
  return isNeg? -v : v;
2064
}
2065
2066
/*
2067
** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
2068
** for TRUE and FALSE.  Return the integer value if appropriate.
2069
*/
2070
static int booleanValue(char *zArg){
2071
  int i;
2072
  if( zArg[0]=='0' && zArg[1]=='x' ){
2073
    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2074
  }else{
2075
    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2076
  }
2077
  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2078
  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2079
    return 1;
2080
  }
2081
  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2082
    return 0;
2083
  }
2084
  fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2085
          zArg);
2086
  return 0;
2087
}
2088
2089
/*
2090
** Close an output file, assuming it is not stderr or stdout
2091
*/
2092
static void output_file_close(FILE *f){
2093
  if( f && f!=stdout && f!=stderr ) fclose(f);
2094
}
2095
2096
/*
2097
** Try to open an output file.   The names "stdout" and "stderr" are
2098
** recognized and do the right thing.  NULL is returned if the output
2099
** filename is "off".
2100
*/
2101
static FILE *output_file_open(const char *zFile){
2102
  FILE *f;
2103
  if( strcmp(zFile,"stdout")==0 ){
2104
    f = stdout;
2105
  }else if( strcmp(zFile, "stderr")==0 ){
2106
    f = stderr;
2107
  }else if( strcmp(zFile, "off")==0 ){
2108
    f = 0;
2109
  }else{
2110
    f = fopen(zFile, "wb");
2111
    if( f==0 ){
2112
      fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2113
    }
2114
  }
2115
  return f;
2116
}
2117
2118
/*
2119
** A routine for handling output from sqlite3_trace().
2120
*/
2121
static void sql_trace_callback(void *pArg, const char *z){
2122
  FILE *f = (FILE*)pArg;
2123
  if( f ){
2124
    int i = (int)strlen(z);
2125
    while( i>0 && z[i-1]==';' ){ i--; }
2126
    fprintf(f, "%.*s;\n", i, z);
2127
  }
2128
}
2129
2130
/*
2131
** A no-op routine that runs with the ".breakpoint" doc-command.  This is
2132
** a useful spot to set a debugger breakpoint.
2133
*/
2134
static void test_breakpoint(void){
2135
  static int nCall = 0;
2136
  nCall++;
2137
}
2138
2139
/*
2140
** An object used to read a CSV and other files for import.
2141
*/
2142
typedef struct ImportCtx ImportCtx;
2143
struct ImportCtx {
2144
  const char *zFile;  /* Name of the input file */
2145
  FILE *in;           /* Read the CSV text from this input stream */
2146
  char *z;            /* Accumulated text for a field */
2147
  int n;              /* Number of bytes in z */
2148
  int nAlloc;         /* Space allocated for z[] */
2149
  int nLine;          /* Current line number */
2150
  int cTerm;          /* Character that terminated the most recent field */
2151
  int cColSep;        /* The column separator character.  (Usually ",") */
2152
  int cRowSep;        /* The row separator character.  (Usually "\n") */
2153
};
2154
2155
/* Append a single byte to z[] */
2156
static void import_append_char(ImportCtx *p, int c){
2157
  if( p->n+1>=p->nAlloc ){
2158
    p->nAlloc += p->nAlloc + 100;
2159
    p->z = sqlite3_realloc64(p->z, p->nAlloc);
2160
    if( p->z==0 ){
2161
      fprintf(stderr, "out of memory\n");
2162
      exit(1);
2163
    }
2164
  }
2165
  p->z[p->n++] = (char)c;
2166
}
2167
2168
/* Read a single field of CSV text.  Compatible with rfc4180 and extended
2169
** with the option of having a separator other than ",".
2170
**
2171
**   +  Input comes from p->in.
2172
**   +  Store results in p->z of length p->n.  Space to hold p->z comes
2173
**      from sqlite3_malloc64().
2174
**   +  Use p->cSep as the column separator.  The default is ",".
2175
**   +  Use p->rSep as the row separator.  The default is "\n".
2176
**   +  Keep track of the line number in p->nLine.
2177
**   +  Store the character that terminates the field in p->cTerm.  Store
2178
**      EOF on end-of-file.
2179
**   +  Report syntax errors on stderr
2180
*/
2181
static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
2182
  int c;
2183
  int cSep = p->cColSep;
2184
  int rSep = p->cRowSep;
2185
  p->n = 0;
2186
  c = fgetc(p->in);
2187
  if( c==EOF || seenInterrupt ){
2188
    p->cTerm = EOF;
2189
    return 0;
2190
  }
2191
  if( c=='"' ){
2192
    int pc, ppc;
2193
    int startLine = p->nLine;
2194
    int cQuote = c;
2195
    pc = ppc = 0;
2196
    while( 1 ){
2197
      c = fgetc(p->in);
2198
      if( c==rSep ) p->nLine++;
2199
      if( c==cQuote ){
2200
        if( pc==cQuote ){
2201
          pc = 0;
2202
          continue;
2203
        }
2204
      }
2205
      if( (c==cSep && pc==cQuote)
2206
       || (c==rSep && pc==cQuote)
2207
       || (c==rSep && pc=='\r' && ppc==cQuote)
2208
       || (c==EOF && pc==cQuote)
2209
      ){
2210
        do{ p->n--; }while( p->z[p->n]!=cQuote );
2211
        p->cTerm = c;
2212
        break;
2213
      }
2214
      if( pc==cQuote && c!='\r' ){
2215
        fprintf(stderr, "%s:%d: unescaped %c character\n",
2216
                p->zFile, p->nLine, cQuote);
2217
      }
2218
      if( c==EOF ){
2219
        fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2220
                p->zFile, startLine, cQuote);
2221
        p->cTerm = c;
2222
        break;
2223
      }
2224
      import_append_char(p, c);
2225
      ppc = pc;
2226
      pc = c;
2227
    }
2228
  }else{
2229
    while( c!=EOF && c!=cSep && c!=rSep ){
2230
      import_append_char(p, c);
2231
      c = fgetc(p->in);
2232
    }
2233
    if( c==rSep ){
2234
      p->nLine++;
2235
      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
2236
    }
2237
    p->cTerm = c;
2238
  }
2239
  if( p->z ) p->z[p->n] = 0;
2240
  return p->z;
2241
}
2242
2243
/* Read a single field of ASCII delimited text.
2244
**
2245
**   +  Input comes from p->in.
2246
**   +  Store results in p->z of length p->n.  Space to hold p->z comes
2247
**      from sqlite3_malloc64().
2248
**   +  Use p->cSep as the column separator.  The default is "\x1F".
2249
**   +  Use p->rSep as the row separator.  The default is "\x1E".
2250
**   +  Keep track of the row number in p->nLine.
2251
**   +  Store the character that terminates the field in p->cTerm.  Store
2252
**      EOF on end-of-file.
2253
**   +  Report syntax errors on stderr
2254
*/
2255
static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
2256
  int c;
2257
  int cSep = p->cColSep;
2258
  int rSep = p->cRowSep;
2259
  p->n = 0;
2260
  c = fgetc(p->in);
2261
  if( c==EOF || seenInterrupt ){
2262
    p->cTerm = EOF;
2263
    return 0;
2264
  }
2265
  while( c!=EOF && c!=cSep && c!=rSep ){
2266
    import_append_char(p, c);
2267
    c = fgetc(p->in);
2268
  }
2269
  if( c==rSep ){
2270
    p->nLine++;
2271
  }
2272
  p->cTerm = c;
2273
  if( p->z ) p->z[p->n] = 0;
2274
  return p->z;
2275
}
2276
2277
/*
2278
** Try to transfer data for table zTable.  If an error is seen while
2279
** moving forward, try to go backwards.  The backwards movement won't
2280
** work for WITHOUT ROWID tables.
2281
*/
2282
static void tryToCloneData(
2283
  ShellState *p,
2284
  sqlite3 *newDb,
2285
  const char *zTable
2286
){
2287
  sqlite3_stmt *pQuery = 0;
2288
  sqlite3_stmt *pInsert = 0;
2289
  char *zQuery = 0;
2290
  char *zInsert = 0;
2291
  int rc;
2292
  int i, j, n;
2293
  int nTable = (int)strlen(zTable);
2294
  int k = 0;
2295
  int cnt = 0;
2296
  const int spinRate = 10000;
2297
2298
  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2299
  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2300
  if( rc ){
2301
    fprintf(stderr, "Error %d: %s on [%s]\n",
2302
            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2303
            zQuery);
2304
    goto end_data_xfer;
2305
  }
2306
  n = sqlite3_column_count(pQuery);
2307
  zInsert = sqlite3_malloc64(200 + nTable + n*3);
2308
  if( zInsert==0 ){
2309
    fprintf(stderr, "out of memory\n");
2310
    goto end_data_xfer;
2311
  }
2312
  sqlite3_snprintf(200+nTable,zInsert,
2313
                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2314
  i = (int)strlen(zInsert);
2315
  for(j=1; j<n; j++){
2316
    memcpy(zInsert+i, ",?", 2);
2317
    i += 2;
2318
  }
2319
  memcpy(zInsert+i, ");", 3);
2320
  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2321
  if( rc ){
2322
    fprintf(stderr, "Error %d: %s on [%s]\n",
2323
            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2324
            zQuery);
2325
    goto end_data_xfer;
2326
  }
2327
  for(k=0; k<2; k++){
2328
    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2329
      for(i=0; i<n; i++){
2330
        switch( sqlite3_column_type(pQuery, i) ){
2331
          case SQLITE_NULL: {
2332
            sqlite3_bind_null(pInsert, i+1);
2333
            break;
2334
          }
2335
          case SQLITE_INTEGER: {
2336
            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2337
            break;
2338
          }
2339
          case SQLITE_FLOAT: {
2340
            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2341
            break;
2342
          }
2343
          case SQLITE_TEXT: {
2344
            sqlite3_bind_text(pInsert, i+1,
2345
                             (const char*)sqlite3_column_text(pQuery,i),
2346
                             -1, SQLITE_STATIC);
2347
            break;
2348
          }
2349
          case SQLITE_BLOB: {
2350
            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2351
                                            sqlite3_column_bytes(pQuery,i),
2352
                                            SQLITE_STATIC);
2353
            break;
2354
          }
2355
        }
2356
      } /* End for */
2357
      rc = sqlite3_step(pInsert);
2358
      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2359
        fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2360
                        sqlite3_errmsg(newDb));
2361
      }
2362
      sqlite3_reset(pInsert);
2363
      cnt++;
2364
      if( (cnt%spinRate)==0 ){
2365
        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2366
        fflush(stdout);
2367
      }
2368
    } /* End while */
2369
    if( rc==SQLITE_DONE ) break;
2370
    sqlite3_finalize(pQuery);
2371
    sqlite3_free(zQuery);
2372
    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2373
                             zTable);
2374
    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2375
    if( rc ){
2376
      fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2377
      break;
2378
    }
2379
  } /* End for(k=0...) */
2380
2381
end_data_xfer:
2382
  sqlite3_finalize(pQuery);
2383
  sqlite3_finalize(pInsert);
2384
  sqlite3_free(zQuery);
2385
  sqlite3_free(zInsert);
2386
}
2387
2388
2389
/*
2390
** Try to transfer all rows of the schema that match zWhere.  For
2391
** each row, invoke xForEach() on the object defined by that row.
2392
** If an error is encountered while moving forward through the
2393
** sqlite_master table, try again moving backwards.
2394
*/
2395
static void tryToCloneSchema(
2396
  ShellState *p,
2397
  sqlite3 *newDb,
2398
  const char *zWhere,
2399
  void (*xForEach)(ShellState*,sqlite3*,const char*)
2400
){
2401
  sqlite3_stmt *pQuery = 0;
2402
  char *zQuery = 0;
2403
  int rc;
2404
  const unsigned char *zName;
2405
  const unsigned char *zSql;
2406
  char *zErrMsg = 0;
2407
2408
  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2409
                           " WHERE %s", zWhere);
2410
  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2411
  if( rc ){
2412
    fprintf(stderr, "Error: (%d) %s on [%s]\n",
2413
                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2414
                    zQuery);
2415
    goto end_schema_xfer;
2416
  }
2417
  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2418
    zName = sqlite3_column_text(pQuery, 0);
2419
    zSql = sqlite3_column_text(pQuery, 1);
2420
    printf("%s... ", zName); fflush(stdout);
2421
    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2422
    if( zErrMsg ){
2423
      fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2424
      sqlite3_free(zErrMsg);
2425
      zErrMsg = 0;
2426
    }
2427
    if( xForEach ){
2428
      xForEach(p, newDb, (const char*)zName);
2429
    }
2430
    printf("done\n");
2431
  }
2432
  if( rc!=SQLITE_DONE ){
2433
    sqlite3_finalize(pQuery);
2434
    sqlite3_free(zQuery);
2435
    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2436
                             " WHERE %s ORDER BY rowid DESC", zWhere);
2437
    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2438
    if( rc ){
2439
      fprintf(stderr, "Error: (%d) %s on [%s]\n",
2440
                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2441
                      zQuery);
2442
      goto end_schema_xfer;
2443
    }
2444
    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2445
      zName = sqlite3_column_text(pQuery, 0);
2446
      zSql = sqlite3_column_text(pQuery, 1);
2447
      printf("%s... ", zName); fflush(stdout);
2448
      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2449
      if( zErrMsg ){
2450
        fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2451
        sqlite3_free(zErrMsg);
2452
        zErrMsg = 0;
2453
      }
2454
      if( xForEach ){
2455
        xForEach(p, newDb, (const char*)zName);
2456
      }
2457
      printf("done\n");
2458
    }
2459
  }
2460
end_schema_xfer:
2461
  sqlite3_finalize(pQuery);
2462
  sqlite3_free(zQuery);
2463
}
2464
2465
/*
2466
** Open a new database file named "zNewDb".  Try to recover as much information
2467
** as possible out of the main database (which might be corrupt) and write it
2468
** into zNewDb.
2469
*/
2470
static void tryToClone(ShellState *p, const char *zNewDb){
2471
  int rc;
2472
  sqlite3 *newDb = 0;
2473
  if( access(zNewDb,0)==0 ){
2474
    fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2475
    return;
2476
  }
2477
  rc = sqlite3_open(zNewDb, &newDb);
2478
  if( rc ){
2479
    fprintf(stderr, "Cannot create output database: %s\n",
2480
            sqlite3_errmsg(newDb));
2481
  }else{
2482
    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
2483
    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
2484
    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2485
    tryToCloneSchema(p, newDb, "type!='table'", 0);
2486
    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2487
    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2488
  }
2489
  sqlite3_close(newDb);
2490
}
2491
2492
/*
2493
** Change the output file back to stdout
2494
*/
2495
static void output_reset(ShellState *p){
2496
  if( p->outfile[0]=='|' ){
2497
#ifndef SQLITE_OMIT_POPEN
2498
    pclose(p->out);
2499
#endif
2500
  }else{
2501
    output_file_close(p->out);
2502
  }
2503
  p->outfile[0] = 0;
2504
  p->out = stdout;
2505
}
2506
2507
/*
2508
** Run an SQL command and return the single integer result.
2509
*/
2510
static int db_int(ShellState *p, const char *zSql){
2511
  sqlite3_stmt *pStmt;
2512
  int res = 0;
2513
  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2514
  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2515
    res = sqlite3_column_int(pStmt,0);
2516
  }
2517
  sqlite3_finalize(pStmt);
2518
  return res;
2519
}
2520
2521
/*
2522
** Convert a 2-byte or 4-byte big-endian integer into a native integer
2523
*/
2524
unsigned int get2byteInt(unsigned char *a){
2525
  return (a[0]<<8) + a[1];
2526
}
2527
unsigned int get4byteInt(unsigned char *a){
2528
  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2529
}
2530
2531
/*
2532
** Implementation of the ".info" command.
2533
**
2534
** Return 1 on error, 2 to exit, and 0 otherwise.
2535
*/
2536
static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
2537
  static const struct { const char *zName; int ofst; } aField[] = {
2538
     { "file change counter:",  24  },
2539
     { "database page count:",  28  },
2540
     { "freelist page count:",  36  },
2541
     { "schema cookie:",        40  },
2542
     { "schema format:",        44  },
2543
     { "default cache size:",   48  },
2544
     { "autovacuum top root:",  52  },
2545
     { "incremental vacuum:",   64  },
2546
     { "text encoding:",        56  },
2547
     { "user version:",         60  },
2548
     { "application id:",       68  },
2549
     { "software version:",     96  },
2550
  };
2551
  static const struct { const char *zName; const char *zSql; } aQuery[] = {
2552
     { "number of tables:",
2553
       "SELECT count(*) FROM %s WHERE type='table'" },
2554
     { "number of indexes:",
2555
       "SELECT count(*) FROM %s WHERE type='index'" },
2556
     { "number of triggers:",
2557
       "SELECT count(*) FROM %s WHERE type='trigger'" },
2558
     { "number of views:",
2559
       "SELECT count(*) FROM %s WHERE type='view'" },
2560
     { "schema size:",
2561
       "SELECT total(length(sql)) FROM %s" },
2562
  };
2563
  sqlite3_file *pFile;
2564
  int i;
2565
  char *zSchemaTab;
2566
  char *zDb = nArg>=2 ? azArg[1] : "main";
2567
  unsigned char aHdr[100];
2568
  open_db(p, 0);
2569
  if( p->db==0 ) return 1;
2570
  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
2571
  if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2572
    return 1;
2573
  }
2574
  i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2575
  if( i!=SQLITE_OK ){
2576
    fprintf(stderr, "unable to read database header\n");
2577
    return 1;
2578
  }
2579
  i = get2byteInt(aHdr+16);
2580
  if( i==1 ) i = 65536;
2581
  fprintf(p->out, "%-20s %d\n", "database page size:", i);
2582
  fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2583
  fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2584
  fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
2585
  for(i=0; i<ArraySize(aField); i++){
2586
    int ofst = aField[i].ofst;
2587
    unsigned int val = get4byteInt(aHdr + ofst);
2588
    fprintf(p->out, "%-20s %u", aField[i].zName, val);
2589
    switch( ofst ){
2590
      case 56: {
2591
        if( val==1 ) fprintf(p->out, " (utf8)");
2592
        if( val==2 ) fprintf(p->out, " (utf16le)");
2593
        if( val==3 ) fprintf(p->out, " (utf16be)");
2594
      }
2595
    }
2596
    fprintf(p->out, "\n");
2597
  }
2598
  if( zDb==0 ){
2599
    zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2600
  }else if( strcmp(zDb,"temp")==0 ){
2601
    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2602
  }else{
2603
    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2604
  }
2605
  for(i=0; i<ArraySize(aQuery); i++){
2606
    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2607
    int val = db_int(p, zSql);
2608
    sqlite3_free(zSql);
2609
    fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
2610
  }
2611
  sqlite3_free(zSchemaTab);
2612
  return 0;
2613
}
2614
2615
/*
2616
** Print the current sqlite3_errmsg() value to stderr and return 1.
2617
*/
2618
static int shellDatabaseError(sqlite3 *db){
2619
  const char *zErr = sqlite3_errmsg(db);
2620
  fprintf(stderr, "Error: %s\n", zErr);
2621
  return 1;
2622
}
2623
2624
/*
2625
** Print an out-of-memory message to stderr and return 1.
2626
*/
2627
static int shellNomemError(void){
2628
  fprintf(stderr, "Error: out of memory\n");
2629
  return 1;
2630
}
2631
2632
/*
2633
** If an input line begins with "." then invoke this routine to
2634
** process that line.
2635
**
2636
** Return 1 on error, 2 to exit, and 0 otherwise.
2637
*/
2638
static int do_meta_command(char *zLine, ShellState *p){
2639
  int h = 1;
2640
  int nArg = 0;
2641
  int n, c;
2642
  int rc = 0;
2643
  char *azArg[50];
2644
2645
  /* Parse the input line into tokens.
2646
  */
2647
  while( zLine[h] && nArg<ArraySize(azArg) ){
2648
    while( IsSpace(zLine[h]) ){ h++; }
2649
    if( zLine[h]==0 ) break;
2650
    if( zLine[h]=='\'' || zLine[h]=='"' ){
2651
      int delim = zLine[h++];
2652
      azArg[nArg++] = &zLine[h];
2653
      while( zLine[h] && zLine[h]!=delim ){
2654
        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2655
        h++;
2656
      }
2657
      if( zLine[h]==delim ){
2658
        zLine[h++] = 0;
2659
      }
2660
      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
2661
    }else{
2662
      azArg[nArg++] = &zLine[h];
2663
      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2664
      if( zLine[h] ) zLine[h++] = 0;
2665
      resolve_backslashes(azArg[nArg-1]);
2666
    }
2667
  }
2668
2669
  /* Process the input line.
2670
  */
2671
  if( nArg==0 ) return 0; /* no tokens, no error */
2672
  n = strlen30(azArg[0]);
2673
  c = azArg[0][0];
2674
  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2675
   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2676
  ){
2677
    const char *zDestFile = 0;
2678
    const char *zDb = 0;
2679
    sqlite3 *pDest;
2680
    sqlite3_backup *pBackup;
2681
    int j;
2682
    for(j=1; j<nArg; j++){
2683
      const char *z = azArg[j];
2684
      if( z[0]=='-' ){
2685
        while( z[0]=='-' ) z++;
2686
        /* No options to process at this time */
2687
        {
2688
          fprintf(stderr, "unknown option: %s\n", azArg[j]);
2689
          return 1;
2690
        }
2691
      }else if( zDestFile==0 ){
2692
        zDestFile = azArg[j];
2693
      }else if( zDb==0 ){
2694
        zDb = zDestFile;
2695
        zDestFile = azArg[j];
2696
      }else{
2697
        fprintf(stderr, "too many arguments to .backup\n");
2698
        return 1;
2699
      }
2700
    }
2701
    if( zDestFile==0 ){
2702
      fprintf(stderr, "missing FILENAME argument on .backup\n");
2703
      return 1;
2704
    }
2705
    if( zDb==0 ) zDb = "main";
2706
    rc = sqlite3_open(zDestFile, &pDest);
2707
    if( rc!=SQLITE_OK ){
2708
      fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
2709
      sqlite3_close(pDest);
2710
      return 1;
2711
    }
2712
    open_db(p, 0);
2713
    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2714
    if( pBackup==0 ){
2715
      fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2716
      sqlite3_close(pDest);
2717
      return 1;
2718
    }
2719
    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2720
    sqlite3_backup_finish(pBackup);
2721
    if( rc==SQLITE_DONE ){
2722
      rc = 0;
2723
    }else{
2724
      fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2725
      rc = 1;
2726
    }
2727
    sqlite3_close(pDest);
2728
  }else
2729
2730
  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2731
    if( nArg==2 ){
2732
      bail_on_error = booleanValue(azArg[1]);
2733
    }else{
2734
      fprintf(stderr, "Usage: .bail on|off\n");
2735
      rc = 1;
2736
    }
2737
  }else
2738
2739
  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2740
    if( nArg==2 ){
2741
      if( booleanValue(azArg[1]) ){
2742
        setBinaryMode(p->out);
2743
      }else{
2744
        setTextMode(p->out);
2745
      }
2746
    }else{
2747
      fprintf(stderr, "Usage: .binary on|off\n");
2748
      rc = 1;
2749
    }
2750
  }else
2751
2752
  /* The undocumented ".breakpoint" command causes a call to the no-op
2753
  ** routine named test_breakpoint().
2754
  */
2755
  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2756
    test_breakpoint();
2757
  }else
2758
2759
  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2760
    if( nArg==2 ){
2761
      tryToClone(p, azArg[1]);
2762
    }else{
2763
      fprintf(stderr, "Usage: .clone FILENAME\n");
2764
      rc = 1;
2765
    }
2766
  }else
2767
2768
  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
2769
    ShellState data;
2770
    char *zErrMsg = 0;
2771
    open_db(p, 0);
2772
    memcpy(&data, p, sizeof(data));
2773
    data.showHeader = 1;
2774
    data.mode = MODE_Column;
2775
    data.colWidth[0] = 3;
2776
    data.colWidth[1] = 15;
2777
    data.colWidth[2] = 58;
2778
    data.cnt = 0;
2779
    sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
2780
    if( zErrMsg ){
2781
      fprintf(stderr,"Error: %s\n", zErrMsg);
2782
      sqlite3_free(zErrMsg);
2783
      rc = 1;
2784
    }
2785
  }else
2786
2787
  if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2788
    rc = shell_dbinfo_command(p, nArg, azArg);
2789
  }else
2790
2791
  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
2792
    open_db(p, 0);
2793
    /* When playing back a "dump", the content might appear in an order
2794
    ** which causes immediate foreign key constraints to be violated.
2795
    ** So disable foreign-key constraint enforcement to prevent problems. */
2796
    if( nArg!=1 && nArg!=2 ){
2797
      fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2798
      rc = 1;
2799
      goto meta_command_exit;
2800
    }
2801
    fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
2802
    fprintf(p->out, "BEGIN TRANSACTION;\n");
2803
    p->writableSchema = 0;
2804
    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
2805
    p->nErr = 0;
2806
    if( nArg==1 ){
2807
      run_schema_dump_query(p,
2808
        "SELECT name, type, sql FROM sqlite_master "
2809
        "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
2810
      );
2811
      run_schema_dump_query(p,
2812
        "SELECT name, type, sql FROM sqlite_master "
2813
        "WHERE name=='sqlite_sequence'"
2814
      );
2815
      run_table_dump_query(p,
2816
        "SELECT sql FROM sqlite_master "
2817
        "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
2818
      );
2819
    }else{
2820
      int i;
2821
      for(i=1; i<nArg; i++){
2822
        zShellStatic = azArg[i];
2823
        run_schema_dump_query(p,
2824
          "SELECT name, type, sql FROM sqlite_master "
2825
          "WHERE tbl_name LIKE shellstatic() AND type=='table'"
2826
          "  AND sql NOT NULL");
2827
        run_table_dump_query(p,
2828
          "SELECT sql FROM sqlite_master "
2829
          "WHERE sql NOT NULL"
2830
          "  AND type IN ('index','trigger','view')"
2831
          "  AND tbl_name LIKE shellstatic()", 0
2832
        );
2833
        zShellStatic = 0;
2834
      }
2835
    }
2836
    if( p->writableSchema ){
2837
      fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
2838
      p->writableSchema = 0;
2839
    }
2840
    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2841
    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
2842
    fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
2843
  }else
2844
2845
  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2846
    if( nArg==2 ){
2847
      p->echoOn = booleanValue(azArg[1]);
2848
    }else{
2849
      fprintf(stderr, "Usage: .echo on|off\n");
2850
      rc = 1;
2851
    }
2852
  }else
2853
2854
  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2855
    if( nArg==2 ){
2856
      p->autoEQP = booleanValue(azArg[1]);
2857
    }else{
2858
      fprintf(stderr, "Usage: .eqp on|off\n");
2859
      rc = 1;
2860
    }
2861
  }else
2862
2863
  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
2864
    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
2865
    rc = 2;
2866
  }else
2867
2868
  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
2869
    int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
2870
    if(val == 1) {
2871
      if(!p->normalMode.valid) {
2872
        p->normalMode.valid = 1;
2873
        p->normalMode.mode = p->mode;
2874
        p->normalMode.showHeader = p->showHeader;
2875
        memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
2876
      }
2877
      /* We could put this code under the !p->explainValid
2878
      ** condition so that it does not execute if we are already in
2879
      ** explain mode. However, always executing it allows us an easy
2880
      ** was to reset to explain mode in case the user previously
2881
      ** did an .explain followed by a .width, .mode or .header
2882
      ** command.
2883
      */
2884
      p->mode = MODE_Explain;
2885
      p->showHeader = 1;
2886
      memset(p->colWidth,0,sizeof(p->colWidth));
2887
      p->colWidth[0] = 4;                  /* addr */
2888
      p->colWidth[1] = 13;                 /* opcode */
2889
      p->colWidth[2] = 4;                  /* P1 */
2890
      p->colWidth[3] = 4;                  /* P2 */
2891
      p->colWidth[4] = 4;                  /* P3 */
2892
      p->colWidth[5] = 13;                 /* P4 */
2893
      p->colWidth[6] = 2;                  /* P5 */
2894
      p->colWidth[7] = 13;                  /* Comment */
2895
    }else if (p->normalMode.valid) {
2896
      p->normalMode.valid = 0;
2897
      p->mode = p->normalMode.mode;
2898
      p->showHeader = p->normalMode.showHeader;
2899
      memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
2900
    }
2901
  }else
2902
2903
  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
2904
    ShellState data;
2905
    char *zErrMsg = 0;
2906
    int doStats = 0;
2907
    if( nArg!=1 ){
2908
      fprintf(stderr, "Usage: .fullschema\n");
2909
      rc = 1;
2910
      goto meta_command_exit;
2911
    }
2912
    open_db(p, 0);
2913
    memcpy(&data, p, sizeof(data));
2914
    data.showHeader = 0;
2915
    data.mode = MODE_Semi;
2916
    rc = sqlite3_exec(p->db,
2917
       "SELECT sql FROM"
2918
       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2919
       "     FROM sqlite_master UNION ALL"
2920
       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2921
       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
2922
       "ORDER BY rowid",
2923
       callback, &data, &zErrMsg
2924
    );
2925
    if( rc==SQLITE_OK ){
2926
      sqlite3_stmt *pStmt;
2927
      rc = sqlite3_prepare_v2(p->db,
2928
               "SELECT rowid FROM sqlite_master"
2929
               " WHERE name GLOB 'sqlite_stat[134]'",
2930
               -1, &pStmt, 0);
2931
      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2932
      sqlite3_finalize(pStmt);
2933
    }
2934
    if( doStats==0 ){
2935
      fprintf(p->out, "/* No STAT tables available */\n");
2936
    }else{
2937
      fprintf(p->out, "ANALYZE sqlite_master;\n");
2938
      sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2939
                   callback, &data, &zErrMsg);
2940
      data.mode = MODE_Insert;
2941
      data.zDestTable = "sqlite_stat1";
2942
      shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2943
                 shell_callback, &data,&zErrMsg);
2944
      data.zDestTable = "sqlite_stat3";
2945
      shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2946
                 shell_callback, &data,&zErrMsg);
2947
      data.zDestTable = "sqlite_stat4";
2948
      shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2949
                 shell_callback, &data, &zErrMsg);
2950
      fprintf(p->out, "ANALYZE sqlite_master;\n");
2951
    }
2952
  }else
2953
2954
  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2955
    if( nArg==2 ){
2956
      p->showHeader = booleanValue(azArg[1]);
2957
    }else{
2958
      fprintf(stderr, "Usage: .headers on|off\n");
2959
      rc = 1;
2960
    }
2961
  }else
2962
2963
  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2964
    fprintf(p->out, "%s", zHelp);
2965
  }else
2966
2967
  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
2968
    char *zTable;               /* Insert data into this table */
2969
    char *zFile;                /* Name of file to extra content from */
2970
    sqlite3_stmt *pStmt = NULL; /* A statement */
2971
    int nCol;                   /* Number of columns in the table */
2972
    int nByte;                  /* Number of bytes in an SQL string */
2973
    int i, j;                   /* Loop counters */
2974
    int needCommit;             /* True to COMMIT or ROLLBACK at end */
2975
    int nSep;                   /* Number of bytes in p->colSeparator[] */
2976
    char *zSql;                 /* An SQL statement */
2977
    ImportCtx sCtx;             /* Reader context */
2978
    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
2979
    int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close file */
2980
2981
    if( nArg!=3 ){
2982
      fprintf(stderr, "Usage: .import FILE TABLE\n");
2983
      goto meta_command_exit;
2984
    }
2985
    zFile = azArg[1];
2986
    zTable = azArg[2];
2987
    seenInterrupt = 0;
2988
    memset(&sCtx, 0, sizeof(sCtx));
2989
    open_db(p, 0);
2990
    nSep = strlen30(p->colSeparator);
2991
    if( nSep==0 ){
2992
      fprintf(stderr, "Error: non-null column separator required for import\n");
2993
      return 1;
2994
    }
2995
    if( nSep>1 ){
2996
      fprintf(stderr, "Error: multi-character column separators not allowed"
2997
                      " for import\n");
2998
      return 1;
2999
    }
3000
    nSep = strlen30(p->rowSeparator);
3001
    if( nSep==0 ){
3002
      fprintf(stderr, "Error: non-null row separator required for import\n");
3003
      return 1;
3004
    }
3005
    if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
3006
      /* When importing CSV (only), if the row separator is set to the
3007
      ** default output row separator, change it to the default input
3008
      ** row separator.  This avoids having to maintain different input
3009
      ** and output row separators. */
3010
      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
3011
      nSep = strlen30(p->rowSeparator);
3012
    }
3013
    if( nSep>1 ){
3014
      fprintf(stderr, "Error: multi-character row separators not allowed"
3015
                      " for import\n");
3016
      return 1;
3017
    }
3018
    sCtx.zFile = zFile;
3019
    sCtx.nLine = 1;
3020
    if( sCtx.zFile[0]=='|' ){
3021
#ifdef SQLITE_OMIT_POPEN
3022
      fprintf(stderr, "Error: pipes are not supported in this OS\n");
3023
      return 1;
3024
#else
3025
      sCtx.in = popen(sCtx.zFile+1, "r");
3026
      sCtx.zFile = "<pipe>";
3027
      xCloser = pclose;
3028
#endif
3029
    }else{
3030
      sCtx.in = fopen(sCtx.zFile, "rb");
3031
      xCloser = fclose;
3032
    }
3033
    if( p->mode==MODE_Ascii ){
3034
      xRead = ascii_read_one_field;
3035
    }else{
3036
      xRead = csv_read_one_field;
3037
    }
3038
    if( sCtx.in==0 ){
3039
      fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
3040
      return 1;
3041
    }
3042
    sCtx.cColSep = p->colSeparator[0];
3043
    sCtx.cRowSep = p->rowSeparator[0];
3044
    zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
3045
    if( zSql==0 ){
3046
      fprintf(stderr, "Error: out of memory\n");
3047
      xCloser(sCtx.in);
3048
      return 1;
3049
    }
3050
    nByte = strlen30(zSql);
3051
    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3052
    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
3053
    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
3054
      char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3055
      char cSep = '(';
3056
      while( xRead(&sCtx) ){
3057
        zCreate = sqlite3_mprintf("%z%c\n  \"%s\" TEXT", zCreate, cSep, sCtx.z);
3058
        cSep = ',';
3059
        if( sCtx.cTerm!=sCtx.cColSep ) break;
3060
      }
3061
      if( cSep=='(' ){
3062
        sqlite3_free(zCreate);
3063
        sqlite3_free(sCtx.z);
3064
        xCloser(sCtx.in);
3065
        fprintf(stderr,"%s: empty file\n", sCtx.zFile);
3066
        return 1;
3067
      }
3068
      zCreate = sqlite3_mprintf("%z\n)", zCreate);
3069
      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3070
      sqlite3_free(zCreate);
3071
      if( rc ){
3072
        fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
3073
                sqlite3_errmsg(p->db));
3074
        sqlite3_free(sCtx.z);
3075
        xCloser(sCtx.in);
3076
        return 1;
3077
      }
3078
      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3079
    }
3080
    sqlite3_free(zSql);
3081
    if( rc ){
3082
      if (pStmt) sqlite3_finalize(pStmt);
3083
      fprintf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
3084
      xCloser(sCtx.in);
3085
      return 1;
3086
    }
3087
    nCol = sqlite3_column_count(pStmt);
3088
    sqlite3_finalize(pStmt);
3089
    pStmt = 0;
3090
    if( nCol==0 ) return 0; /* no columns, no error */
3091
    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
3092
    if( zSql==0 ){
3093
      fprintf(stderr, "Error: out of memory\n");
3094
      xCloser(sCtx.in);
3095
      return 1;
3096
    }
3097
    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
3098
    j = strlen30(zSql);
3099
    for(i=1; i<nCol; i++){
3100
      zSql[j++] = ',';
3101
      zSql[j++] = '?';
3102
    }
3103
    zSql[j++] = ')';
3104
    zSql[j] = 0;
3105
    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3106
    sqlite3_free(zSql);
3107
    if( rc ){
3108
      fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3109
      if (pStmt) sqlite3_finalize(pStmt);
3110
      xCloser(sCtx.in);
3111
      return 1;
3112
    }
3113
    needCommit = sqlite3_get_autocommit(p->db);
3114
    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
3115
    do{
3116
      int startLine = sCtx.nLine;
3117
      for(i=0; i<nCol; i++){
3118
        char *z = xRead(&sCtx);
3119
        /*
3120
        ** Did we reach end-of-file before finding any columns?
3121
        ** If so, stop instead of NULL filling the remaining columns.
3122
        */
3123
        if( z==0 && i==0 ) break;
3124
        /*
3125
        ** Did we reach end-of-file OR end-of-line before finding any
3126
        ** columns in ASCII mode?  If so, stop instead of NULL filling
3127
        ** the remaining columns.
3128
        */
3129
        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
3130
        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
3131
        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
3132
          fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3133
                          "filling the rest with NULL\n",
3134
                          sCtx.zFile, startLine, nCol, i+1);
3135
          i += 2;
3136
          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
3137
        }
3138
      }
3139
      if( sCtx.cTerm==sCtx.cColSep ){
3140
        do{
3141
          xRead(&sCtx);
3142
          i++;
3143
        }while( sCtx.cTerm==sCtx.cColSep );
3144
        fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3145
                        "extras ignored\n",
3146
                        sCtx.zFile, startLine, nCol, i);
3147
      }
3148
      if( i>=nCol ){
3149
        sqlite3_step(pStmt);
3150
        rc = sqlite3_reset(pStmt);
3151
        if( rc!=SQLITE_OK ){
3152
          fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
3153
                  sqlite3_errmsg(p->db));
3154
        }
3155
      }
3156
    }while( sCtx.cTerm!=EOF );
3157
3158
    xCloser(sCtx.in);
3159
    sqlite3_free(sCtx.z);
3160
    sqlite3_finalize(pStmt);
3161
    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
3162
  }else
3163
3164
  if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3165
                 || strncmp(azArg[0], "indexes", n)==0) ){
3166
    ShellState data;
3167
    char *zErrMsg = 0;
3168
    open_db(p, 0);
3169
    memcpy(&data, p, sizeof(data));
3170
    data.showHeader = 0;
3171
    data.mode = MODE_List;
3172
    if( nArg==1 ){
3173
      rc = sqlite3_exec(p->db,
3174
        "SELECT name FROM sqlite_master "
3175
        "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3176
        "UNION ALL "
3177
        "SELECT name FROM sqlite_temp_master "
3178
        "WHERE type='index' "
3179
        "ORDER BY 1",
3180
        callback, &data, &zErrMsg
3181
      );
3182
    }else if( nArg==2 ){
3183
      zShellStatic = azArg[1];
3184
      rc = sqlite3_exec(p->db,
3185
        "SELECT name FROM sqlite_master "
3186
        "WHERE type='index' AND tbl_name LIKE shellstatic() "
3187
        "UNION ALL "
3188
        "SELECT name FROM sqlite_temp_master "
3189
        "WHERE type='index' AND tbl_name LIKE shellstatic() "
3190
        "ORDER BY 1",
3191
        callback, &data, &zErrMsg
3192
      );
3193
      zShellStatic = 0;
3194
    }else{
3195
      fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
3196
      rc = 1;
3197
      goto meta_command_exit;
3198
    }
3199
    if( zErrMsg ){
3200
      fprintf(stderr,"Error: %s\n", zErrMsg);
3201
      sqlite3_free(zErrMsg);
3202
      rc = 1;
3203
    }else if( rc != SQLITE_OK ){
3204
      fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3205
      rc = 1;
3206
    }
3207
  }else
3208
3209
#ifdef SQLITE_ENABLE_IOTRACE
3210
  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
3211
    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
3212
    if( iotrace && iotrace!=stdout ) fclose(iotrace);
3213
    iotrace = 0;
3214
    if( nArg<2 ){
3215
      sqlite3IoTrace = 0;
3216
    }else if( strcmp(azArg[1], "-")==0 ){
3217
      sqlite3IoTrace = iotracePrintf;
3218
      iotrace = stdout;
3219
    }else{
3220
      iotrace = fopen(azArg[1], "w");
3221
      if( iotrace==0 ){
3222
        fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
3223
        sqlite3IoTrace = 0;
3224
        rc = 1;
3225
      }else{
3226
        sqlite3IoTrace = iotracePrintf;
3227
      }
3228
    }
3229
  }else
3230
#endif
3231
  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3232
    static const struct {
3233
       const char *zLimitName;   /* Name of a limit */
3234
       int limitCode;            /* Integer code for that limit */
3235
    } aLimit[] = {
3236
      { "length",                SQLITE_LIMIT_LENGTH                    },
3237
      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
3238
      { "column",                SQLITE_LIMIT_COLUMN                    },
3239
      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
3240
      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
3241
      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
3242
      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
3243
      { "attached",              SQLITE_LIMIT_ATTACHED                  },
3244
      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
3245
      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
3246
      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
3247
      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
3248
    };
3249
    int i, n2;
3250
    open_db(p, 0);
3251
    if( nArg==1 ){
3252
      for(i=0; i<ArraySize(aLimit); i++){
3253
        printf("%20s %d\n", aLimit[i].zLimitName,
3254
               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3255
      }
3256
    }else if( nArg>3 ){
3257
      fprintf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
3258
      rc = 1;
3259
      goto meta_command_exit;
3260
    }else{
3261
      int iLimit = -1;
3262
      n2 = strlen30(azArg[1]);
3263
      for(i=0; i<ArraySize(aLimit); i++){
3264
        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3265
          if( iLimit<0 ){
3266
            iLimit = i;
3267
          }else{
3268
            fprintf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
3269
            rc = 1;
3270
            goto meta_command_exit;
3271
          }
3272
        }
3273
      }
3274
      if( iLimit<0 ){
3275
        fprintf(stderr, "unknown limit: \"%s\"\n"
3276
                        "enter \".limits\" with no arguments for a list.\n",
3277
                         azArg[1]);
3278
        rc = 1;
3279
        goto meta_command_exit;
3280
      }
3281
      if( nArg==3 ){
3282
        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3283
                      (int)integerValue(azArg[2]));
3284
      }
3285
      printf("%20s %d\n", aLimit[iLimit].zLimitName,
3286
             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3287
    }
3288
  }else
3289
3290
#ifndef SQLITE_OMIT_LOAD_EXTENSION
3291
  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
3292
    const char *zFile, *zProc;
3293
    char *zErrMsg = 0;
3294
    if( nArg<2 ){
3295
      fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3296
      rc = 1;
3297
      goto meta_command_exit;
3298
    }
3299
    zFile = azArg[1];
3300
    zProc = nArg>=3 ? azArg[2] : 0;
3301
    open_db(p, 0);
3302
    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3303
    if( rc!=SQLITE_OK ){
3304
      fprintf(stderr, "Error: %s\n", zErrMsg);
3305
      sqlite3_free(zErrMsg);
3306
      rc = 1;
3307
    }
3308
  }else
3309
#endif
3310
3311
  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3312
    if( nArg!=2 ){
3313
      fprintf(stderr, "Usage: .log FILENAME\n");
3314
      rc = 1;
3315
    }else{
3316
      const char *zFile = azArg[1];
3317
      output_file_close(p->pLog);
3318
      p->pLog = output_file_open(zFile);
3319
    }
3320
  }else
3321
3322
  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3323
    const char *zMode = nArg>=2 ? azArg[1] : "";
3324
    int n2 = (int)strlen(zMode);
3325
    int c2 = zMode[0];
3326
    if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
3327
      p->mode = MODE_Line;
3328
    }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
3329
      p->mode = MODE_Column;
3330
    }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
3331
      p->mode = MODE_List;
3332
    }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
3333
      p->mode = MODE_Html;
3334
    }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
3335
      p->mode = MODE_Tcl;
3336
      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
3337
    }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
3338
      p->mode = MODE_Csv;
3339
      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
3340
      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
3341
    }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
3342
      p->mode = MODE_List;
3343
      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
3344
    }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
3345
      p->mode = MODE_Insert;
3346
      set_table_name(p, nArg>=3 ? azArg[2] : "table");
3347
    }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3348
      p->mode = MODE_Ascii;
3349
      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3350
      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
3351
    }else {
3352
      fprintf(stderr,"Error: mode should be one of: "
3353
         "ascii column csv html insert line list tabs tcl\n");
3354
      rc = 1;
3355
    }
3356
  }else
3357
3358
  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3359
    if( nArg==2 ){
3360
      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3361
                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
3362
    }else{
3363
      fprintf(stderr, "Usage: .nullvalue STRING\n");
3364
      rc = 1;
3365
    }
3366
  }else
3367
3368
  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3369
    sqlite3 *savedDb = p->db;
3370
    const char *zSavedFilename = p->zDbFilename;
3371
    char *zNewFilename = 0;
3372
    p->db = 0;
3373
    if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3374
    p->zDbFilename = zNewFilename;
3375
    open_db(p, 1);
3376
    if( p->db!=0 ){
3377
      sqlite3_close(savedDb);
3378
      sqlite3_free(p->zFreeOnClose);
3379
      p->zFreeOnClose = zNewFilename;
3380
    }else{
3381
      sqlite3_free(zNewFilename);
3382
      p->db = savedDb;
3383
      p->zDbFilename = zSavedFilename;
3384
    }
3385
  }else
3386
3387
  if( c=='o'
3388
   && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3389
  ){
3390
    const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3391
    if( nArg>2 ){
3392
      fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3393
      rc = 1;
3394
      goto meta_command_exit;
3395
    }
3396
    if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3397
      if( nArg<2 ){
3398
        fprintf(stderr, "Usage: .once FILE\n");
3399
        rc = 1;
3400
        goto meta_command_exit;
3401
      }
3402
      p->outCount = 2;
3403
    }else{
3404
      p->outCount = 0;
3405
    }
3406
    output_reset(p);
3407
    if( zFile[0]=='|' ){
3408
#ifdef SQLITE_OMIT_POPEN
3409
      fprintf(stderr,"Error: pipes are not supported in this OS\n");
3410
      rc = 1;
3411
      p->out = stdout;
3412
#else
3413
      p->out = popen(zFile + 1, "w");
3414
      if( p->out==0 ){
3415
        fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
3416
        p->out = stdout;
3417
        rc = 1;
3418
      }else{
3419
        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3420
      }
3421
#endif
3422
    }else{
3423
      p->out = output_file_open(zFile);
3424
      if( p->out==0 ){
3425
        if( strcmp(zFile,"off")!=0 ){
3426
          fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
3427
        }
3428
        p->out = stdout;
3429
        rc = 1;
3430
      } else {
3431
        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3432
      }
3433
    }
3434
  }else
3435
3436
  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3437
    int i;
3438
    for(i=1; i<nArg; i++){
3439
      if( i>1 ) fprintf(p->out, " ");
3440
      fprintf(p->out, "%s", azArg[i]);
3441
    }
3442
    fprintf(p->out, "\n");
3443
  }else
3444
3445
  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
3446
    if( nArg >= 2) {
3447
      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3448
    }
3449
    if( nArg >= 3) {
3450
      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3451
    }
3452
  }else
3453
3454
  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
3455
    rc = 2;
3456
  }else
3457
3458
  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3459
    FILE *alt;
3460
    if( nArg!=2 ){
3461
      fprintf(stderr, "Usage: .read FILE\n");
3462
      rc = 1;
3463
      goto meta_command_exit;
3464
    }
3465
    alt = fopen(azArg[1], "rb");
3466
    if( alt==0 ){
3467
      fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3468
      rc = 1;
3469
    }else{
3470
      rc = process_input(p, alt);
3471
      fclose(alt);
3472
    }
3473
  }else
3474
3475
  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
3476
    const char *zSrcFile;
3477
    const char *zDb;
3478
    sqlite3 *pSrc;
3479
    sqlite3_backup *pBackup;
3480
    int nTimeout = 0;
3481
3482
    if( nArg==2 ){
3483
      zSrcFile = azArg[1];
3484
      zDb = "main";
3485
    }else if( nArg==3 ){
3486
      zSrcFile = azArg[2];
3487
      zDb = azArg[1];
3488
    }else{
3489
      fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3490
      rc = 1;
3491
      goto meta_command_exit;
3492
    }
3493
    rc = sqlite3_open(zSrcFile, &pSrc);
3494
    if( rc!=SQLITE_OK ){
3495
      fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
3496
      sqlite3_close(pSrc);
3497
      return 1;
3498
    }
3499
    open_db(p, 0);
3500
    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3501
    if( pBackup==0 ){
3502
      fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3503
      sqlite3_close(pSrc);
3504
      return 1;
3505
    }
3506
    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3507
          || rc==SQLITE_BUSY  ){
3508
      if( rc==SQLITE_BUSY ){
3509
        if( nTimeout++ >= 3 ) break;
3510
        sqlite3_sleep(100);
3511
      }
3512
    }
3513
    sqlite3_backup_finish(pBackup);
3514
    if( rc==SQLITE_DONE ){
3515
      rc = 0;
3516
    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
3517
      fprintf(stderr, "Error: source database is busy\n");
3518
      rc = 1;
3519
    }else{
3520
      fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3521
      rc = 1;
3522
    }
3523
    sqlite3_close(pSrc);
3524
  }else
3525
3526
3527
  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3528
    if( nArg==2 ){
3529
      p->scanstatsOn = booleanValue(azArg[1]);
3530
#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3531
      fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3532
#endif
3533
    }else{
3534
      fprintf(stderr, "Usage: .scanstats on|off\n");
3535
      rc = 1;
3536
    }
3537
  }else
3538
3539
  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
3540
    ShellState data;
3541
    char *zErrMsg = 0;
3542
    open_db(p, 0);
3543
    memcpy(&data, p, sizeof(data));
3544
    data.showHeader = 0;
3545
    data.mode = MODE_Semi;
3546
    if( nArg==2 ){
3547
      int i;
3548
      for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
3549
      if( strcmp(azArg[1],"sqlite_master")==0 ){
3550
        char *new_argv[2], *new_colv[2];
3551
        new_argv[0] = "CREATE TABLE sqlite_master (\n"
3552
                      "  type text,\n"
3553
                      "  name text,\n"
3554
                      "  tbl_name text,\n"
3555
                      "  rootpage integer,\n"
3556
                      "  sql text\n"
3557
                      ")";
3558
        new_argv[1] = 0;
3559
        new_colv[0] = "sql";
3560
        new_colv[1] = 0;
3561
        callback(&data, 1, new_argv, new_colv);
3562
        rc = SQLITE_OK;
3563
      }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
3564
        char *new_argv[2], *new_colv[2];
3565
        new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3566
                      "  type text,\n"
3567
                      "  name text,\n"
3568
                      "  tbl_name text,\n"
3569
                      "  rootpage integer,\n"
3570
                      "  sql text\n"
3571
                      ")";
3572
        new_argv[1] = 0;
3573
        new_colv[0] = "sql";
3574
        new_colv[1] = 0;
3575
        callback(&data, 1, new_argv, new_colv);
3576
        rc = SQLITE_OK;
3577
      }else{
3578
        zShellStatic = azArg[1];
3579
        rc = sqlite3_exec(p->db,
3580
          "SELECT sql FROM "
3581
          "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3582
          "     FROM sqlite_master UNION ALL"
3583
          "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
3584
          "WHERE lower(tbl_name) LIKE shellstatic()"
3585
          "  AND type!='meta' AND sql NOTNULL "
3586
          "ORDER BY rowid",
3587
          callback, &data, &zErrMsg);
3588
        zShellStatic = 0;
3589
      }
3590
    }else if( nArg==1 ){
3591
      rc = sqlite3_exec(p->db,
3592
         "SELECT sql FROM "
3593
         "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3594
         "     FROM sqlite_master UNION ALL"
3595
         "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
3596
         "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
3597
         "ORDER BY rowid",
3598
         callback, &data, &zErrMsg
3599
      );
3600
    }else{
3601
      fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3602
      rc = 1;
3603
      goto meta_command_exit;
3604
    }
3605
    if( zErrMsg ){
3606
      fprintf(stderr,"Error: %s\n", zErrMsg);
3607
      sqlite3_free(zErrMsg);
3608
      rc = 1;
3609
    }else if( rc != SQLITE_OK ){
3610
      fprintf(stderr,"Error: querying schema information\n");
3611
      rc = 1;
3612
    }else{
3613
      rc = 0;
3614
    }
3615
  }else
3616
3617
3618
#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3619
  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3620
    extern int sqlite3SelectTrace;
3621
    sqlite3SelectTrace = integerValue(azArg[1]);
3622
  }else
3623
#endif
3624
3625
3626
#ifdef SQLITE_DEBUG
3627
  /* Undocumented commands for internal testing.  Subject to change
3628
  ** without notice. */
3629
  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3630
    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3631
      int i, v;
3632
      for(i=1; i<nArg; i++){
3633
        v = booleanValue(azArg[i]);
3634
        fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3635
      }
3636
    }
3637
    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3638
      int i; sqlite3_int64 v;
3639
      for(i=1; i<nArg; i++){
3640
        char zBuf[200];
3641
        v = integerValue(azArg[i]);
3642
        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
3643
        fprintf(p->out, "%s", zBuf);
3644
      }
3645
    }
3646
  }else
3647
#endif
3648
3649
  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
3650
    if( nArg<2 || nArg>3 ){
3651
      fprintf(stderr, "Usage: .separator COL ?ROW?\n");
3652
      rc = 1;
3653
    }
3654
    if( nArg>=2 ){
3655
      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
3656
                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
3657
    }
3658
    if( nArg>=3 ){
3659
      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3660
                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
3661
    }
3662
  }else
3663
3664
  if( c=='s'
3665
   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
3666
  ){
3667
    char *zCmd;
3668
    int i, x;
3669
    if( nArg<2 ){
3670
      fprintf(stderr, "Usage: .system COMMAND\n");
3671
      rc = 1;
3672
      goto meta_command_exit;
3673
    }
3674
    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
3675
    for(i=2; i<nArg; i++){
3676
      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3677
                             zCmd, azArg[i]);
3678
    }
3679
    x = system(zCmd);
3680
    sqlite3_free(zCmd);
3681
    if( x ) fprintf(stderr, "System command returns %d\n", x);
3682
  }else
3683
3684
  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
3685
    int i;
3686
    if( nArg!=1 ){
3687
      fprintf(stderr, "Usage: .show\n");
3688
      rc = 1;
3689
      goto meta_command_exit;
3690
    }
3691
    fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3692
    fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
3693
    fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
3694
    fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3695
    fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3696
    fprintf(p->out,"%12.12s: ", "nullvalue");
3697
      output_c_string(p->out, p->nullValue);
3698
      fprintf(p->out, "\n");
3699
    fprintf(p->out,"%12.12s: %s\n","output",
3700
            strlen30(p->outfile) ? p->outfile : "stdout");
3701
    fprintf(p->out,"%12.12s: ", "colseparator");
3702
      output_c_string(p->out, p->colSeparator);
3703
      fprintf(p->out, "\n");
3704
    fprintf(p->out,"%12.12s: ", "rowseparator");
3705
      output_c_string(p->out, p->rowSeparator);
3706
      fprintf(p->out, "\n");
3707
    fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3708
    fprintf(p->out,"%12.12s: ","width");
3709
    for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
3710
      fprintf(p->out,"%d ",p->colWidth[i]);
3711
    }
3712
    fprintf(p->out,"\n");
3713
  }else
3714
3715
  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3716
    if( nArg==2 ){
3717
      p->statsOn = booleanValue(azArg[1]);
3718
    }else{
3719
      fprintf(stderr, "Usage: .stats on|off\n");
3720
      rc = 1;
3721
    }
3722
  }else
3723
3724
  if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
3725
    sqlite3_stmt *pStmt;
3726
    char **azResult;
3727
    int nRow, nAlloc;
3728
    char *zSql = 0;
3729
    int ii;
3730
    open_db(p, 0);
3731
    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3732
    if( rc ) return shellDatabaseError(p->db);
3733
3734
    /* Create an SQL statement to query for the list of tables in the
3735
    ** main and all attached databases where the table name matches the
3736
    ** LIKE pattern bound to variable "?1". */
3737
    zSql = sqlite3_mprintf(
3738
        "SELECT name FROM sqlite_master"
3739
        " WHERE type IN ('table','view')"
3740
        "   AND name NOT LIKE 'sqlite_%%'"
3741
        "   AND name LIKE ?1");
3742
    while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
3743
      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3744
      if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3745
      if( strcmp(zDbName,"temp")==0 ){
3746
        zSql = sqlite3_mprintf(
3747
                 "%z UNION ALL "
3748
                 "SELECT 'temp.' || name FROM sqlite_temp_master"
3749
                 " WHERE type IN ('table','view')"
3750
                 "   AND name NOT LIKE 'sqlite_%%'"
3751
                 "   AND name LIKE ?1", zSql);
3752
      }else{
3753
        zSql = sqlite3_mprintf(
3754
                 "%z UNION ALL "
3755
                 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3756
                 " WHERE type IN ('table','view')"
3757
                 "   AND name NOT LIKE 'sqlite_%%'"
3758
                 "   AND name LIKE ?1", zSql, zDbName, zDbName);
3759
      }
3760
    }
3761
    rc = sqlite3_finalize(pStmt);
3762
    if( zSql && rc==SQLITE_OK ){
3763
      zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3764
      if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3765
    }
3766
    sqlite3_free(zSql);
3767
    if( !zSql ) return shellNomemError();
3768
    if( rc ) return shellDatabaseError(p->db);
3769
3770
    /* Run the SQL statement prepared by the above block. Store the results
3771
    ** as an array of nul-terminated strings in azResult[].  */
3772
    nRow = nAlloc = 0;
3773
    azResult = 0;
3774
    if( nArg>1 ){
3775
      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
3776
    }else{
3777
      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3778
    }
3779
    while( sqlite3_step(pStmt)==SQLITE_ROW ){
3780
      if( nRow>=nAlloc ){
3781
        char **azNew;
3782
        int n2 = nAlloc*2 + 10;
3783
        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
3784
        if( azNew==0 ){
3785
          rc = shellNomemError();
3786
          break;
3787
        }
3788
        nAlloc = n2;
3789
        azResult = azNew;
3790
      }
3791
      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3792
      if( 0==azResult[nRow] ){
3793
        rc = shellNomemError();
3794
        break;
3795
      }
3796
      nRow++;
3797
    }
3798
    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
3799
      rc = shellDatabaseError(p->db);
3800
    }
3801
3802
    /* Pretty-print the contents of array azResult[] to the output */
3803
    if( rc==0 && nRow>0 ){
3804
      int len, maxlen = 0;
3805
      int i, j;
3806
      int nPrintCol, nPrintRow;
3807
      for(i=0; i<nRow; i++){
3808
        len = strlen30(azResult[i]);
3809
        if( len>maxlen ) maxlen = len;
3810
      }
3811
      nPrintCol = 80/(maxlen+2);
3812
      if( nPrintCol<1 ) nPrintCol = 1;
3813
      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3814
      for(i=0; i<nPrintRow; i++){
3815
        for(j=i; j<nRow; j+=nPrintRow){
3816
          char *zSp = j<nPrintRow ? "" : "  ";
3817
          fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
3818
        }
3819
        fprintf(p->out, "\n");
3820
      }
3821
    }
3822
3823
    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3824
    sqlite3_free(azResult);
3825
  }else
3826
3827
  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
3828
    static const struct {
3829
       const char *zCtrlName;   /* Name of a test-control option */
3830
       int ctrlCode;            /* Integer code for that option */
3831
    } aCtrl[] = {
3832
      { "prng_save",             SQLITE_TESTCTRL_PRNG_SAVE              },
3833
      { "prng_restore",          SQLITE_TESTCTRL_PRNG_RESTORE           },
3834
      { "prng_reset",            SQLITE_TESTCTRL_PRNG_RESET             },
3835
      { "bitvec_test",           SQLITE_TESTCTRL_BITVEC_TEST            },
3836
      { "fault_install",         SQLITE_TESTCTRL_FAULT_INSTALL          },
3837
      { "benign_malloc_hooks",   SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS    },
3838
      { "pending_byte",          SQLITE_TESTCTRL_PENDING_BYTE           },
3839
      { "assert",                SQLITE_TESTCTRL_ASSERT                 },
3840
      { "always",                SQLITE_TESTCTRL_ALWAYS                 },
3841
      { "reserve",               SQLITE_TESTCTRL_RESERVE                },
3842
      { "optimizations",         SQLITE_TESTCTRL_OPTIMIZATIONS          },
3843
      { "iskeyword",             SQLITE_TESTCTRL_ISKEYWORD              },
3844
      { "scratchmalloc",         SQLITE_TESTCTRL_SCRATCHMALLOC          },
3845
      { "byteorder",             SQLITE_TESTCTRL_BYTEORDER              },
3846
      { "never_corrupt",         SQLITE_TESTCTRL_NEVER_CORRUPT          },
3847
      { "imposter",              SQLITE_TESTCTRL_IMPOSTER               },
3848
    };
3849
    int testctrl = -1;
3850
    int rc2 = 0;
3851
    int i, n2;
3852
    open_db(p, 0);
3853
3854
    /* convert testctrl text option to value. allow any unique prefix
3855
    ** of the option name, or a numerical value. */
3856
    n2 = strlen30(azArg[1]);
3857
    for(i=0; i<ArraySize(aCtrl); i++){
3858
      if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
3859
        if( testctrl<0 ){
3860
          testctrl = aCtrl[i].ctrlCode;
3861
        }else{
3862
          fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
3863
          testctrl = -1;
3864
          break;
3865
        }
3866
      }
3867
    }
3868
    if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
3869
    if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3870
      fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3871
    }else{
3872
      switch(testctrl){
3873
3874
        /* sqlite3_test_control(int, db, int) */
3875
        case SQLITE_TESTCTRL_OPTIMIZATIONS:
3876
        case SQLITE_TESTCTRL_RESERVE:
3877
          if( nArg==3 ){
3878
            int opt = (int)strtol(azArg[2], 0, 0);
3879
            rc2 = sqlite3_test_control(testctrl, p->db, opt);
3880
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3881
          } else {
3882
            fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3883
                    azArg[1]);
3884
          }
3885
          break;
3886
3887
        /* sqlite3_test_control(int) */
3888
        case SQLITE_TESTCTRL_PRNG_SAVE:
3889
        case SQLITE_TESTCTRL_PRNG_RESTORE:
3890
        case SQLITE_TESTCTRL_PRNG_RESET:
3891
        case SQLITE_TESTCTRL_BYTEORDER:
3892
          if( nArg==2 ){
3893
            rc2 = sqlite3_test_control(testctrl);
3894
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3895
          } else {
3896
            fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3897
          }
3898
          break;
3899
3900
        /* sqlite3_test_control(int, uint) */
3901
        case SQLITE_TESTCTRL_PENDING_BYTE:
3902
          if( nArg==3 ){
3903
            unsigned int opt = (unsigned int)integerValue(azArg[2]);
3904
            rc2 = sqlite3_test_control(testctrl, opt);
3905
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3906
          } else {
3907
            fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3908
                           " int option\n", azArg[1]);
3909
          }
3910
          break;
3911
3912
        /* sqlite3_test_control(int, int) */
3913
        case SQLITE_TESTCTRL_ASSERT:
3914
        case SQLITE_TESTCTRL_ALWAYS:
3915
        case SQLITE_TESTCTRL_NEVER_CORRUPT:
3916
          if( nArg==3 ){
3917
            int opt = booleanValue(azArg[2]);
3918
            rc2 = sqlite3_test_control(testctrl, opt);
3919
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3920
          } else {
3921
            fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3922
                            azArg[1]);
3923
          }
3924
          break;
3925
3926
        /* sqlite3_test_control(int, char *) */
3927
#ifdef SQLITE_N_KEYWORD
3928
        case SQLITE_TESTCTRL_ISKEYWORD:
3929
          if( nArg==3 ){
3930
            const char *opt = azArg[2];
3931
            rc2 = sqlite3_test_control(testctrl, opt);
3932
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3933
          } else {
3934
            fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3935
                            azArg[1]);
3936
          }
3937
          break;
3938
#endif
3939
3940
        case SQLITE_TESTCTRL_IMPOSTER:
3941
          if( nArg==5 ){
3942
            rc2 = sqlite3_test_control(testctrl, p->db,
3943
                          azArg[2],
3944
                          integerValue(azArg[3]),
3945
                          integerValue(azArg[4]));
3946
            fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3947
          }else{
3948
            fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
3949
          }
3950
          break;
3951
3952
        case SQLITE_TESTCTRL_BITVEC_TEST:
3953
        case SQLITE_TESTCTRL_FAULT_INSTALL:
3954
        case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3955
        case SQLITE_TESTCTRL_SCRATCHMALLOC:
3956
        default:
3957
          fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3958
                  azArg[1]);
3959
          break;
3960
      }
3961
    }
3962
  }else
3963
3964
  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
3965
    open_db(p, 0);
3966
    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
3967
  }else
3968
3969
  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3970
    if( nArg==2 ){
3971
      enableTimer = booleanValue(azArg[1]);
3972
      if( enableTimer && !HAS_TIMER ){
3973
        fprintf(stderr, "Error: timer not available on this system.\n");
3974
        enableTimer = 0;
3975
      }
3976
    }else{
3977
      fprintf(stderr, "Usage: .timer on|off\n");
3978
      rc = 1;
3979
    }
3980
  }else
3981
3982
  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
3983
    open_db(p, 0);
3984
    if( nArg!=2 ){
3985
      fprintf(stderr, "Usage: .trace FILE|off\n");
3986
      rc = 1;
3987
      goto meta_command_exit;
3988
    }
3989
    output_file_close(p->traceOut);
3990
    p->traceOut = output_file_open(azArg[1]);
3991
#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3992
    if( p->traceOut==0 ){
3993
      sqlite3_trace(p->db, 0, 0);
3994
    }else{
3995
      sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3996
    }
3997
#endif
3998
  }else
3999
4000
#if SQLITE_USER_AUTHENTICATION
4001
  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
4002
    if( nArg<2 ){
4003
      fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
4004
      rc = 1;
4005
      goto meta_command_exit;
4006
    }
4007
    open_db(p, 0);
4008
    if( strcmp(azArg[1],"login")==0 ){
4009
      if( nArg!=4 ){
4010
        fprintf(stderr, "Usage: .user login USER PASSWORD\n");
4011
        rc = 1;
4012
        goto meta_command_exit;
4013
      }
4014
      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
4015
                                    (int)strlen(azArg[3]));
4016
      if( rc ){
4017
        fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
4018
        rc = 1;
4019
      }
4020
    }else if( strcmp(azArg[1],"add")==0 ){
4021
      if( nArg!=5 ){
4022
        fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
4023
        rc = 1;
4024
        goto meta_command_exit;
4025
      }
4026
      rc = sqlite3_user_add(p->db, azArg[2],
4027
                            azArg[3], (int)strlen(azArg[3]),
4028
                            booleanValue(azArg[4]));
4029
      if( rc ){
4030
        fprintf(stderr, "User-Add failed: %d\n", rc);
4031
        rc = 1;
4032
      }
4033
    }else if( strcmp(azArg[1],"edit")==0 ){
4034
      if( nArg!=5 ){
4035
        fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
4036
        rc = 1;
4037
        goto meta_command_exit;
4038
      }
4039
      rc = sqlite3_user_change(p->db, azArg[2],
4040
                              azArg[3], (int)strlen(azArg[3]),
4041
                              booleanValue(azArg[4]));
4042
      if( rc ){
4043
        fprintf(stderr, "User-Edit failed: %d\n", rc);
4044
        rc = 1;
4045
      }
4046
    }else if( strcmp(azArg[1],"delete")==0 ){
4047
      if( nArg!=3 ){
4048
        fprintf(stderr, "Usage: .user delete USER\n");
4049
        rc = 1;
4050
        goto meta_command_exit;
4051
      }
4052
      rc = sqlite3_user_delete(p->db, azArg[2]);
4053
      if( rc ){
4054
        fprintf(stderr, "User-Delete failed: %d\n", rc);
4055
        rc = 1;
4056
      }
4057
    }else{
4058
      fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
4059
      rc = 1;
4060
      goto meta_command_exit;
4061
    }
4062
  }else
4063
#endif /* SQLITE_USER_AUTHENTICATION */
4064
4065
  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
4066
    fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
4067
        sqlite3_libversion(), sqlite3_sourceid());
4068
  }else
4069
4070
  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4071
    const char *zDbName = nArg==2 ? azArg[1] : "main";
4072
    char *zVfsName = 0;
4073
    if( p->db ){
4074
      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4075
      if( zVfsName ){
4076
        fprintf(p->out, "%s\n", zVfsName);
4077
        sqlite3_free(zVfsName);
4078
      }
4079
    }
4080
  }else
4081
4082
#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4083
  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4084
    extern int sqlite3WhereTrace;
4085
    sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
4086
  }else
4087
#endif
4088
4089
  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
4090
    int j;
4091
    assert( nArg<=ArraySize(azArg) );
4092
    for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
4093
      p->colWidth[j-1] = (int)integerValue(azArg[j]);
4094
    }
4095
  }else
4096
4097
  {
4098
    fprintf(stderr, "Error: unknown command or invalid arguments: "
4099
      " \"%s\". Enter \".help\" for help\n", azArg[0]);
4100
    rc = 1;
4101
  }
4102
4103
meta_command_exit:
4104
  if( p->outCount ){
4105
    p->outCount--;
4106
    if( p->outCount==0 ) output_reset(p);
4107
  }
4108
  return rc;
4109
}
4110
4111
/*
4112
** Return TRUE if a semicolon occurs anywhere in the first N characters
4113
** of string z[].
4114
*/
4115
static int line_contains_semicolon(const char *z, int N){
4116
  int i;
4117
  for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
4118
  return 0;
4119
}
4120
4121
/*
4122
** Test to see if a line consists entirely of whitespace.
4123
*/
4124
static int _all_whitespace(const char *z){
4125
  for(; *z; z++){
4126
    if( IsSpace(z[0]) ) continue;
4127
    if( *z=='/' && z[1]=='*' ){
4128
      z += 2;
4129
      while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4130
      if( *z==0 ) return 0;
4131
      z++;
4132
      continue;
4133
    }
4134
    if( *z=='-' && z[1]=='-' ){
4135
      z += 2;
4136
      while( *z && *z!='\n' ){ z++; }
4137
      if( *z==0 ) return 1;
4138
      continue;
4139
    }
4140
    return 0;
4141
  }
4142
  return 1;
4143
}
4144
4145
/*
4146
** Return TRUE if the line typed in is an SQL command terminator other
4147
** than a semi-colon.  The SQL Server style "go" command is understood
4148
** as is the Oracle "/".
4149
*/
4150
static int line_is_command_terminator(const char *zLine){
4151
  while( IsSpace(zLine[0]) ){ zLine++; };
4152
  if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4153
    return 1;  /* Oracle */
4154
  }
4155
  if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
4156
         && _all_whitespace(&zLine[2]) ){
4157
    return 1;  /* SQL Server */
4158
  }
4159
  return 0;
4160
}
4161
4162
/*
4163
** Return true if zSql is a complete SQL statement.  Return false if it
4164
** ends in the middle of a string literal or C-style comment.
4165
*/
4166
static int line_is_complete(char *zSql, int nSql){
4167
  int rc;
4168
  if( zSql==0 ) return 1;
4169
  zSql[nSql] = ';';
4170
  zSql[nSql+1] = 0;
4171
  rc = sqlite3_complete(zSql);
4172
  zSql[nSql] = 0;
4173
  return rc;
4174
}
4175
4176
/*
4177
** Read input from *in and process it.  If *in==0 then input
4178
** is interactive - the user is typing it it.  Otherwise, input
4179
** is coming from a file or device.  A prompt is issued and history
4180
** is saved only if input is interactive.  An interrupt signal will
4181
** cause this routine to exit immediately, unless input is interactive.
4182
**
4183
** Return the number of errors.
4184
*/
4185
static int process_input(ShellState *p, FILE *in){
4186
  char *zLine = 0;          /* A single input line */
4187
  char *zSql = 0;           /* Accumulated SQL text */
4188
  int nLine;                /* Length of current line */
4189
  int nSql = 0;             /* Bytes of zSql[] used */
4190
  int nAlloc = 0;           /* Allocated zSql[] space */
4191
  int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
4192
  char *zErrMsg;            /* Error message returned */
4193
  int rc;                   /* Error code */
4194
  int errCnt = 0;           /* Number of errors seen */
4195
  int lineno = 0;           /* Current line number */
4196
  int startline = 0;        /* Line number for start of current input */
4197
4198
  while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4199
    fflush(p->out);
4200
    zLine = one_input_line(in, zLine, nSql>0);
4201
    if( zLine==0 ){
4202
      /* End of input */
4203
      if( stdin_is_interactive ) printf("\n");
4204
      break;
4205
    }
4206
    if( seenInterrupt ){
4207
      if( in!=0 ) break;
4208
      seenInterrupt = 0;
4209
    }
4210
    lineno++;
4211
    if( nSql==0 && _all_whitespace(zLine) ){
4212
      if( p->echoOn ) printf("%s\n", zLine);
4213
      continue;
4214
    }
4215
    if( zLine && zLine[0]=='.' && nSql==0 ){
4216
      if( p->echoOn ) printf("%s\n", zLine);
4217
      rc = do_meta_command(zLine, p);
4218
      if( rc==2 ){ /* exit requested */
4219
        break;
4220
      }else if( rc ){
4221
        errCnt++;
4222
      }
4223
      continue;
4224
    }
4225
    if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
4226
      memcpy(zLine,";",2);
4227
    }
4228
    nLine = strlen30(zLine);
4229
    if( nSql+nLine+2>=nAlloc ){
4230
      nAlloc = nSql+nLine+100;
4231
      zSql = realloc(zSql, nAlloc);
4232
      if( zSql==0 ){
4233
        fprintf(stderr, "Error: out of memory\n");
4234
        exit(1);
4235
      }
4236
    }
4237
    nSqlPrior = nSql;
4238
    if( nSql==0 ){
4239
      int i;
4240
      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
4241
      assert( nAlloc>0 && zSql!=0 );
4242
      memcpy(zSql, zLine+i, nLine+1-i);
4243
      startline = lineno;
4244
      nSql = nLine-i;
4245
    }else{
4246
      zSql[nSql++] = '\n';
4247
      memcpy(zSql+nSql, zLine, nLine+1);
4248
      nSql += nLine;
4249
    }
4250
    if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
4251
                && sqlite3_complete(zSql) ){
4252
      p->cnt = 0;
4253
      open_db(p, 0);
4254
      if( p->backslashOn ) resolve_backslashes(zSql);
4255
      BEGIN_TIMER;
4256
      rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
4257
      END_TIMER;
4258
      if( rc || zErrMsg ){
4259
        char zPrefix[100];
4260
        if( in!=0 || !stdin_is_interactive ){
4261
          sqlite3_snprintf(sizeof(zPrefix), zPrefix,
4262
                           "Error: near line %d:", startline);
4263
        }else{
4264
          sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
4265
        }
4266
        if( zErrMsg!=0 ){
4267
          fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
4268
          sqlite3_free(zErrMsg);
4269
          zErrMsg = 0;
4270
        }else{
4271
          fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
4272
        }
4273
        errCnt++;
4274
      }
4275
      nSql = 0;
4276
      if( p->outCount ){
4277
        output_reset(p);
4278
        p->outCount = 0;
4279
      }
4280
    }else if( nSql && _all_whitespace(zSql) ){
4281
      if( p->echoOn ) printf("%s\n", zSql);
4282
      nSql = 0;
4283
    }
4284
  }
4285
  if( nSql ){
4286
    if( !_all_whitespace(zSql) ){
4287
      fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
4288
      errCnt++;
4289
    }
4290
  }
4291
  free(zSql);
4292
  free(zLine);
4293
  return errCnt>0;
4294
}
4295
4296
/*
4297
** Return a pathname which is the user's home directory.  A
4298
** 0 return indicates an error of some kind.
4299
*/
4300
static char *find_home_dir(void){
4301
  static char *home_dir = NULL;
4302
  if( home_dir ) return home_dir;
4303
4304
#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4305
     && !defined(__RTP__) && !defined(_WRS_KERNEL)
4306
  {
4307
    struct passwd *pwent;
4308
    uid_t uid = getuid();
4309
    if( (pwent=getpwuid(uid)) != NULL) {
4310
      home_dir = pwent->pw_dir;
4311
    }
4312
  }
4313
#endif
4314
4315
#if defined(_WIN32_WCE)
4316
  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4317
   */
4318
  home_dir = "/";
4319
#else
4320
4321
#if defined(_WIN32) || defined(WIN32)
4322
  if (!home_dir) {
4323
    home_dir = getenv("USERPROFILE");
4324
  }
4325
#endif
4326
4327
  if (!home_dir) {
4328
    home_dir = getenv("HOME");
4329
  }
4330
4331
#if defined(_WIN32) || defined(WIN32)
4332
  if (!home_dir) {
4333
    char *zDrive, *zPath;
4334
    int n;
4335
    zDrive = getenv("HOMEDRIVE");
4336
    zPath = getenv("HOMEPATH");
4337
    if( zDrive && zPath ){
4338
      n = strlen30(zDrive) + strlen30(zPath) + 1;
4339
      home_dir = malloc( n );
4340
      if( home_dir==0 ) return 0;
4341
      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4342
      return home_dir;
4343
    }
4344
    home_dir = "c:\\";
4345
  }
4346
#endif
4347
4348
#endif /* !_WIN32_WCE */
4349
4350
  if( home_dir ){
4351
    int n = strlen30(home_dir) + 1;
4352
    char *z = malloc( n );
4353
    if( z ) memcpy(z, home_dir, n);
4354
    home_dir = z;
4355
  }
4356
4357
  return home_dir;
4358
}
4359
4360
/*
4361
** Read input from the file given by sqliterc_override.  Or if that
4362
** parameter is NULL, take input from ~/.sqliterc
4363
**
4364
** Returns the number of errors.
4365
*/
4366
static void process_sqliterc(
4367
  ShellState *p,                  /* Configuration data */
4368
  const char *sqliterc_override   /* Name of config file. NULL to use default */
4369
){
4370
  char *home_dir = NULL;
4371
  const char *sqliterc = sqliterc_override;
4372
  char *zBuf = 0;
4373
  FILE *in = NULL;
4374
4375
  if (sqliterc == NULL) {
4376
    home_dir = find_home_dir();
4377
    if( home_dir==0 ){
4378
      fprintf(stderr, "-- warning: cannot find home directory;"
4379
                      " cannot read ~/.sqliterc\n");
4380
      return;
4381
    }
4382
    sqlite3_initialize();
4383
    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4384
    sqliterc = zBuf;
4385
  }
4386
  in = fopen(sqliterc,"rb");
4387
  if( in ){
4388
    if( stdin_is_interactive ){
4389
      fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
4390
    }
4391
    process_input(p,in);
4392
    fclose(in);
4393
  }
4394
  sqlite3_free(zBuf);
4395
}
4396
4397
/*
4398
** Show available command line options
4399
*/
4400
static const char zOptions[] =
4401
  "   -ascii               set output mode to 'ascii'\n"
4402
  "   -bail                stop after hitting an error\n"
4403
  "   -batch               force batch I/O\n"
4404
  "   -column              set output mode to 'column'\n"
4405
  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
4406
  "   -csv                 set output mode to 'csv'\n"
4407
  "   -echo                print commands before execution\n"
4408
  "   -init FILENAME       read/process named file\n"
4409
  "   -[no]header          turn headers on or off\n"
4410
#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4411
  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
4412
#endif
4413
  "   -help                show this message\n"
4414
  "   -html                set output mode to HTML\n"
4415
  "   -interactive         force interactive I/O\n"
4416
  "   -line                set output mode to 'line'\n"
4417
  "   -list                set output mode to 'list'\n"
4418
  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
4419
  "   -mmap N              default mmap size set to N\n"
4420
#ifdef SQLITE_ENABLE_MULTIPLEX
4421
  "   -multiplex           enable the multiplexor VFS\n"
4422
#endif
4423
  "   -newline SEP         set output row separator. Default: '\\n'\n"
4424
  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
4425
  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
4426
  "   -scratch SIZE N      use N slots of SZ bytes each for scratch memory\n"
4427
  "   -separator SEP       set output column separator. Default: '|'\n"
4428
  "   -stats               print memory stats before each finalize\n"
4429
  "   -version             show SQLite version\n"
4430
  "   -vfs NAME            use NAME as the default VFS\n"
4431
#ifdef SQLITE_ENABLE_VFSTRACE
4432
  "   -vfstrace            enable tracing of all VFS calls\n"
4433
#endif
4434
;
4435
static void usage(int showDetail){
4436
  fprintf(stderr,
4437
      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4438
      "FILENAME is the name of an SQLite database. A new database is created\n"
4439
      "if the file does not previously exist.\n", Argv0);
4440
  if( showDetail ){
4441
    fprintf(stderr, "OPTIONS include:\n%s", zOptions);
4442
  }else{
4443
    fprintf(stderr, "Use the -help option for additional information\n");
4444
  }
4445
  exit(1);
4446
}
4447
4448
/*
4449
** Initialize the state information in data
4450
*/
4451
static void main_init(ShellState *data) {
4452
  memset(data, 0, sizeof(*data));
4453
  data->mode = MODE_List;
4454
  memcpy(data->colSeparator,SEP_Column, 2);
4455
  memcpy(data->rowSeparator,SEP_Row, 2);
4456
  data->showHeader = 0;
4457
  data->shellFlgs = SHFLG_Lookaside;
4458
  sqlite3_config(SQLITE_CONFIG_URI, 1);
4459
  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
4460
  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
4461
  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4462
  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
4463
}
4464
4465
/*
4466
** Output text to the console in a font that attracts extra attention.
4467
*/
4468
#ifdef _WIN32
4469
static void printBold(const char *zText){
4470
  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4471
  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4472
  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4473
  SetConsoleTextAttribute(out,
4474
         FOREGROUND_RED|FOREGROUND_INTENSITY
4475
  );
4476
  printf("%s", zText);
4477
  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
4478
}
4479
#else
4480
static void printBold(const char *zText){
4481
  printf("\033[1m%s\033[0m", zText);
4482
}
4483
#endif
4484
4485
/*
4486
** Get the argument to an --option.  Throw an error and die if no argument
4487
** is available.
4488
*/
4489
static char *cmdline_option_value(int argc, char **argv, int i){
4490
  if( i==argc ){
4491
    fprintf(stderr, "%s: Error: missing argument to %s\n",
4492
            argv[0], argv[argc-1]);
4493
    exit(1);
4494
  }
4495
  return argv[i];
4496
}
4497
4498
int SQLITE_CDECL main(int argc, char **argv){
4499
  char *zErrMsg = 0;
4500
  ShellState data;
4501
  const char *zInitFile = 0;
4502
  int i;
4503
  int rc = 0;
4504
  int warnInmemoryDb = 0;
4505
  int readStdin = 1;
4506
  int nCmd = 0;
4507
  char **azCmd = 0;
4508
4509
#if USE_SYSTEM_SQLITE+0!=1
4510
  if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4511
    fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4512
            sqlite3_sourceid(), SQLITE_SOURCE_ID);
4513
    exit(1);
4514
  }
4515
#endif
4516
  setBinaryMode(stdin);
4517
  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
4518
  Argv0 = argv[0];
4519
  main_init(&data);
4520
  stdin_is_interactive = isatty(0);
4521
4522
  /* Make sure we have a valid signal handler early, before anything
4523
  ** else is done.
4524
  */
4525
#ifdef SIGINT
4526
  signal(SIGINT, interrupt_handler);
4527
#endif
4528
4529
#ifdef SQLITE_SHELL_DBNAME_PROC
4530
  {
4531
    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4532
    ** of a C-function that will provide the name of the database file.  Use
4533
    ** this compile-time option to embed this shell program in larger
4534
    ** applications. */
4535
    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4536
    SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4537
    warnInmemoryDb = 0;
4538
  }
4539
#endif
4540
4541
  /* Do an initial pass through the command-line argument to locate
4542
  ** the name of the database file, the name of the initialization file,
4543
  ** the size of the alternative malloc heap,
4544
  ** and the first command to execute.
4545
  */
4546
  for(i=1; i<argc; i++){
4547
    char *z;
4548
    z = argv[i];
4549
    if( z[0]!='-' ){
4550
      if( data.zDbFilename==0 ){
4551
        data.zDbFilename = z;
4552
      }else{
4553
        /* Excesss arguments are interpreted as SQL (or dot-commands) and
4554
        ** mean that nothing is read from stdin */
4555
        readStdin = 0;
4556
        nCmd++;
4557
        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4558
        if( azCmd==0 ){
4559
          fprintf(stderr, "out of memory\n");
4560
          exit(1);
4561
        }
4562
        azCmd[nCmd-1] = z;
4563
      }
4564
    }
4565
    if( z[1]=='-' ) z++;
4566
    if( strcmp(z,"-separator")==0
4567
     || strcmp(z,"-nullvalue")==0
4568
     || strcmp(z,"-newline")==0
4569
     || strcmp(z,"-cmd")==0
4570
    ){
4571
      (void)cmdline_option_value(argc, argv, ++i);
4572
    }else if( strcmp(z,"-init")==0 ){
4573
      zInitFile = cmdline_option_value(argc, argv, ++i);
4574
    }else if( strcmp(z,"-batch")==0 ){
4575
      /* Need to check for batch mode here to so we can avoid printing
4576
      ** informational messages (like from process_sqliterc) before
4577
      ** we do the actual processing of arguments later in a second pass.
4578
      */
4579
      stdin_is_interactive = 0;
4580
    }else if( strcmp(z,"-heap")==0 ){
4581
#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4582
      const char *zSize;
4583
      sqlite3_int64 szHeap;
4584
4585
      zSize = cmdline_option_value(argc, argv, ++i);
4586
      szHeap = integerValue(zSize);
4587
      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
4588
      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4589
#endif
4590
    }else if( strcmp(z,"-scratch")==0 ){
4591
      int n, sz;
4592
      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4593
      if( sz>400000 ) sz = 400000;
4594
      if( sz<2500 ) sz = 2500;
4595
      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4596
      if( n>10 ) n = 10;
4597
      if( n<1 ) n = 1;
4598
      sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4599
      data.shellFlgs |= SHFLG_Scratch;
4600
    }else if( strcmp(z,"-pagecache")==0 ){
4601
      int n, sz;
4602
      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4603
      if( sz>70000 ) sz = 70000;
4604
      if( sz<800 ) sz = 800;
4605
      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4606
      if( n<10 ) n = 10;
4607
      sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4608
      data.shellFlgs |= SHFLG_Pagecache;
4609
    }else if( strcmp(z,"-lookaside")==0 ){
4610
      int n, sz;
4611
      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4612
      if( sz<0 ) sz = 0;
4613
      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4614
      if( n<0 ) n = 0;
4615
      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4616
      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
4617
#ifdef SQLITE_ENABLE_VFSTRACE
4618
    }else if( strcmp(z,"-vfstrace")==0 ){
4619
      extern int vfstrace_register(
4620
         const char *zTraceName,
4621
         const char *zOldVfsName,
4622
         int (*xOut)(const char*,void*),
4623
         void *pOutArg,
4624
         int makeDefault
4625
      );
4626
      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
4627
#endif
4628
#ifdef SQLITE_ENABLE_MULTIPLEX
4629
    }else if( strcmp(z,"-multiplex")==0 ){
4630
      extern int sqlite3_multiple_initialize(const char*,int);
4631
      sqlite3_multiplex_initialize(0, 1);
4632
#endif
4633
    }else if( strcmp(z,"-mmap")==0 ){
4634
      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4635
      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
4636
    }else if( strcmp(z,"-vfs")==0 ){
4637
      sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
4638
      if( pVfs ){
4639
        sqlite3_vfs_register(pVfs, 1);
4640
      }else{
4641
        fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4642
        exit(1);
4643
      }
4644
    }
4645
  }
4646
  if( data.zDbFilename==0 ){
4647
#ifndef SQLITE_OMIT_MEMORYDB
4648
    data.zDbFilename = ":memory:";
4649
    warnInmemoryDb = argc==1;
4650
#else
4651
    fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4652
    return 1;
4653
#endif
4654
  }
4655
  data.out = stdout;
4656
4657
  /* Go ahead and open the database file if it already exists.  If the
4658
  ** file does not exist, delay opening it.  This prevents empty database
4659
  ** files from being created if a user mistypes the database name argument
4660
  ** to the sqlite command-line tool.
4661
  */
4662
  if( access(data.zDbFilename, 0)==0 ){
4663
    open_db(&data, 0);
4664
  }
4665
4666
  /* Process the initialization file if there is one.  If no -init option
4667
  ** is given on the command line, look for a file named ~/.sqliterc and
4668
  ** try to process it.
4669
  */
4670
  process_sqliterc(&data,zInitFile);
4671
4672
  /* Make a second pass through the command-line argument and set
4673
  ** options.  This second pass is delayed until after the initialization
4674
  ** file is processed so that the command-line arguments will override
4675
  ** settings in the initialization file.
4676
  */
4677
  for(i=1; i<argc; i++){
4678
    char *z = argv[i];
4679
    if( z[0]!='-' ) continue;
4680
    if( z[1]=='-' ){ z++; }
4681
    if( strcmp(z,"-init")==0 ){
4682
      i++;
4683
    }else if( strcmp(z,"-html")==0 ){
4684
      data.mode = MODE_Html;
4685
    }else if( strcmp(z,"-list")==0 ){
4686
      data.mode = MODE_List;
4687
    }else if( strcmp(z,"-line")==0 ){
4688
      data.mode = MODE_Line;
4689
    }else if( strcmp(z,"-column")==0 ){
4690
      data.mode = MODE_Column;
4691
    }else if( strcmp(z,"-csv")==0 ){
4692
      data.mode = MODE_Csv;
4693
      memcpy(data.colSeparator,",",2);
4694
    }else if( strcmp(z,"-ascii")==0 ){
4695
      data.mode = MODE_Ascii;
4696
      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4697
                       SEP_Unit);
4698
      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
4699
                       SEP_Record);
4700
    }else if( strcmp(z,"-separator")==0 ){
4701
      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4702
                       "%s",cmdline_option_value(argc,argv,++i));
4703
    }else if( strcmp(z,"-newline")==0 ){
4704
      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
4705
                       "%s",cmdline_option_value(argc,argv,++i));
4706
    }else if( strcmp(z,"-nullvalue")==0 ){
4707
      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
4708
                       "%s",cmdline_option_value(argc,argv,++i));
4709
    }else if( strcmp(z,"-header")==0 ){
4710
      data.showHeader = 1;
4711
    }else if( strcmp(z,"-noheader")==0 ){
4712
      data.showHeader = 0;
4713
    }else if( strcmp(z,"-echo")==0 ){
4714
      data.echoOn = 1;
4715
    }else if( strcmp(z,"-eqp")==0 ){
4716
      data.autoEQP = 1;
4717
    }else if( strcmp(z,"-stats")==0 ){
4718
      data.statsOn = 1;
4719
    }else if( strcmp(z,"-scanstats")==0 ){
4720
      data.scanstatsOn = 1;
4721
    }else if( strcmp(z,"-backslash")==0 ){
4722
      /* Undocumented command-line option: -backslash
4723
      ** Causes C-style backslash escapes to be evaluated in SQL statements
4724
      ** prior to sending the SQL into SQLite.  Useful for injecting
4725
      ** crazy bytes in the middle of SQL statements for testing and debugging.
4726
      */
4727
      data.backslashOn = 1;
4728
    }else if( strcmp(z,"-bail")==0 ){
4729
      bail_on_error = 1;
4730
    }else if( strcmp(z,"-version")==0 ){
4731
      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
4732
      return 0;
4733
    }else if( strcmp(z,"-interactive")==0 ){
4734
      stdin_is_interactive = 1;
4735
    }else if( strcmp(z,"-batch")==0 ){
4736
      stdin_is_interactive = 0;
4737
    }else if( strcmp(z,"-heap")==0 ){
4738
      i++;
4739
    }else if( strcmp(z,"-scratch")==0 ){
4740
      i+=2;
4741
    }else if( strcmp(z,"-pagecache")==0 ){
4742
      i+=2;
4743
    }else if( strcmp(z,"-lookaside")==0 ){
4744
      i+=2;
4745
    }else if( strcmp(z,"-mmap")==0 ){
4746
      i++;
4747
    }else if( strcmp(z,"-vfs")==0 ){
4748
      i++;
4749
#ifdef SQLITE_ENABLE_VFSTRACE
4750
    }else if( strcmp(z,"-vfstrace")==0 ){
4751
      i++;
4752
#endif
4753
#ifdef SQLITE_ENABLE_MULTIPLEX
4754
    }else if( strcmp(z,"-multiplex")==0 ){
4755
      i++;
4756
#endif
4757
    }else if( strcmp(z,"-help")==0 ){
4758
      usage(1);
4759
    }else if( strcmp(z,"-cmd")==0 ){
4760
      /* Run commands that follow -cmd first and separately from commands
4761
      ** that simply appear on the command-line.  This seems goofy.  It would
4762
      ** be better if all commands ran in the order that they appear.  But
4763
      ** we retain the goofy behavior for historical compatibility. */
4764
      if( i==argc-1 ) break;
4765
      z = cmdline_option_value(argc,argv,++i);
4766
      if( z[0]=='.' ){
4767
        rc = do_meta_command(z, &data);
4768
        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
4769
      }else{
4770
        open_db(&data, 0);
4771
        rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4772
        if( zErrMsg!=0 ){
4773
          fprintf(stderr,"Error: %s\n", zErrMsg);
4774
          if( bail_on_error ) return rc!=0 ? rc : 1;
4775
        }else if( rc!=0 ){
4776
          fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4777
          if( bail_on_error ) return rc;
4778
        }
4779
      }
4780
    }else{
4781
      fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
4782
      fprintf(stderr,"Use -help for a list of options.\n");
4783
      return 1;
4784
    }
4785
  }
4786
4787
  if( !readStdin ){
4788
    /* Run all arguments that do not begin with '-' as if they were separate
4789
    ** command-line inputs, except for the argToSkip argument which contains
4790
    ** the database filename.
4791
    */
4792
    for(i=0; i<nCmd; i++){
4793
      if( azCmd[i][0]=='.' ){
4794
        rc = do_meta_command(azCmd[i], &data);
4795
        if( rc ) return rc==2 ? 0 : rc;
4796
      }else{
4797
        open_db(&data, 0);
4798
        rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4799
        if( zErrMsg!=0 ){
4800
          fprintf(stderr,"Error: %s\n", zErrMsg);
4801
          return rc!=0 ? rc : 1;
4802
        }else if( rc!=0 ){
4803
          fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4804
          return rc;
4805
        }
4806
      }
4807
    }
4808
    free(azCmd);
4809
  }else{
4810
    /* Run commands received from standard input
4811
    */
4812
    if( stdin_is_interactive ){
4813
      char *zHome;
4814
      char *zHistory = 0;
4815
      int nHistory;
4816
      printf(
4817
        "SQLite version %s %.19s\n" /*extra-version-info*/
4818
        "Enter \".help\" for usage hints.\n",
4819
        sqlite3_libversion(), sqlite3_sourceid()
4820
      );
4821
      if( warnInmemoryDb ){
4822
        printf("Connected to a ");
4823
        printBold("transient in-memory database");
4824
        printf(".\nUse \".open FILENAME\" to reopen on a "
4825
               "persistent database.\n");
4826
      }
4827
      zHome = find_home_dir();
4828
      if( zHome ){
4829
        nHistory = strlen30(zHome) + 20;
4830
        if( (zHistory = malloc(nHistory))!=0 ){
4831
          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4832
        }
4833
      }
4834
      if( zHistory ){ shell_read_history(zHistory); }
4835
      rc = process_input(&data, 0);
4836
      if( zHistory ){
4837
        shell_stifle_history(100);
4838
        shell_write_history(zHistory);
4839
        free(zHistory);
4840
      }
4841
    }else{
4842
      rc = process_input(&data, stdin);
4843
    }
4844
  }
4845
  set_table_name(&data, 0);
4846
  if( data.db ){
4847
    sqlite3_close(data.db);
4848
  }
4849
  sqlite3_free(data.zFreeOnClose);
4850
  return rc;
4851
}