Annotation of elwix/files/sqlite/dist/shell.c, revision 1.2

1.2     ! misho       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: ** Enable large-file support for fopen() and friends on unix.
        !            22: */
        !            23: #ifndef SQLITE_DISABLE_LFS
        !            24: # define _LARGE_FILE       1
        !            25: # ifndef _FILE_OFFSET_BITS
        !            26: #   define _FILE_OFFSET_BITS 64
        !            27: # endif
        !            28: # define _LARGEFILE_SOURCE 1
        !            29: #endif
        !            30: 
        !            31: #include <stdlib.h>
        !            32: #include <string.h>
        !            33: #include <stdio.h>
        !            34: #include <assert.h>
        !            35: #include "sqlite3.h"
        !            36: #include <ctype.h>
        !            37: #include <stdarg.h>
        !            38: 
        !            39: #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
        !            40: # include <signal.h>
        !            41: # if !defined(__RTP__) && !defined(_WRS_KERNEL)
        !            42: #  include <pwd.h>
        !            43: # endif
        !            44: # include <unistd.h>
        !            45: # include <sys/types.h>
        !            46: #endif
        !            47: 
        !            48: #ifdef __OS2__
        !            49: # include <unistd.h>
        !            50: #endif
        !            51: 
        !            52: #ifdef HAVE_EDITLINE
        !            53: # include <editline/editline.h>
        !            54: #endif
        !            55: #if defined(HAVE_READLINE) && HAVE_READLINE==1
        !            56: # include <readline/readline.h>
        !            57: # include <readline/history.h>
        !            58: #endif
        !            59: #if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
        !            60: # define readline(p) local_getline(p,stdin)
        !            61: # define add_history(X)
        !            62: # define read_history(X)
        !            63: # define write_history(X)
        !            64: # define stifle_history(X)
        !            65: #endif
        !            66: 
        !            67: #if defined(_WIN32) || defined(WIN32)
        !            68: # include <io.h>
        !            69: #define isatty(h) _isatty(h)
        !            70: #define access(f,m) _access((f),(m))
        !            71: #else
        !            72: /* Make sure isatty() has a prototype.
        !            73: */
        !            74: extern int isatty(int);
        !            75: #endif
        !            76: 
        !            77: #if defined(_WIN32_WCE)
        !            78: /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
        !            79:  * thus we always assume that we have a console. That can be
        !            80:  * overridden with the -batch command line option.
        !            81:  */
        !            82: #define isatty(x) 1
        !            83: #endif
        !            84: 
        !            85: /* True if the timer is enabled */
        !            86: static int enableTimer = 0;
        !            87: 
        !            88: /* ctype macros that work with signed characters */
        !            89: #define IsSpace(X)  isspace((unsigned char)X)
        !            90: #define IsDigit(X)  isdigit((unsigned char)X)
        !            91: #define ToLower(X)  (char)tolower((unsigned char)X)
        !            92: 
        !            93: #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__) && !defined(_WRS_KERNEL)
        !            94: #include <sys/time.h>
        !            95: #include <sys/resource.h>
        !            96: 
        !            97: /* Saved resource information for the beginning of an operation */
        !            98: static struct rusage sBegin;
        !            99: 
        !           100: /*
        !           101: ** Begin timing an operation
        !           102: */
        !           103: static void beginTimer(void){
        !           104:   if( enableTimer ){
        !           105:     getrusage(RUSAGE_SELF, &sBegin);
        !           106:   }
        !           107: }
        !           108: 
        !           109: /* Return the difference of two time_structs in seconds */
        !           110: static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
        !           111:   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 
        !           112:          (double)(pEnd->tv_sec - pStart->tv_sec);
        !           113: }
        !           114: 
        !           115: /*
        !           116: ** Print the timing results.
        !           117: */
        !           118: static void endTimer(void){
        !           119:   if( enableTimer ){
        !           120:     struct rusage sEnd;
        !           121:     getrusage(RUSAGE_SELF, &sEnd);
        !           122:     printf("CPU Time: user %f sys %f\n",
        !           123:        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
        !           124:        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
        !           125:   }
        !           126: }
        !           127: 
        !           128: #define BEGIN_TIMER beginTimer()
        !           129: #define END_TIMER endTimer()
        !           130: #define HAS_TIMER 1
        !           131: 
        !           132: #elif (defined(_WIN32) || defined(WIN32))
        !           133: 
        !           134: #include <windows.h>
        !           135: 
        !           136: /* Saved resource information for the beginning of an operation */
        !           137: static HANDLE hProcess;
        !           138: static FILETIME ftKernelBegin;
        !           139: static FILETIME ftUserBegin;
        !           140: typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
        !           141: static GETPROCTIMES getProcessTimesAddr = NULL;
        !           142: 
        !           143: /*
        !           144: ** Check to see if we have timer support.  Return 1 if necessary
        !           145: ** support found (or found previously).
        !           146: */
        !           147: static int hasTimer(void){
        !           148:   if( getProcessTimesAddr ){
        !           149:     return 1;
        !           150:   } else {
        !           151:     /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
        !           152:     ** See if the version we are running on has it, and if it does, save off
        !           153:     ** a pointer to it and the current process handle.
        !           154:     */
        !           155:     hProcess = GetCurrentProcess();
        !           156:     if( hProcess ){
        !           157:       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
        !           158:       if( NULL != hinstLib ){
        !           159:         getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
        !           160:         if( NULL != getProcessTimesAddr ){
        !           161:           return 1;
        !           162:         }
        !           163:         FreeLibrary(hinstLib); 
        !           164:       }
        !           165:     }
        !           166:   }
        !           167:   return 0;
        !           168: }
        !           169: 
        !           170: /*
        !           171: ** Begin timing an operation
        !           172: */
        !           173: static void beginTimer(void){
        !           174:   if( enableTimer && getProcessTimesAddr ){
        !           175:     FILETIME ftCreation, ftExit;
        !           176:     getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
        !           177:   }
        !           178: }
        !           179: 
        !           180: /* Return the difference of two FILETIME structs in seconds */
        !           181: static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
        !           182:   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
        !           183:   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
        !           184:   return (double) ((i64End - i64Start) / 10000000.0);
        !           185: }
        !           186: 
        !           187: /*
        !           188: ** Print the timing results.
        !           189: */
        !           190: static void endTimer(void){
        !           191:   if( enableTimer && getProcessTimesAddr){
        !           192:     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
        !           193:     getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
        !           194:     printf("CPU Time: user %f sys %f\n",
        !           195:        timeDiff(&ftUserBegin, &ftUserEnd),
        !           196:        timeDiff(&ftKernelBegin, &ftKernelEnd));
        !           197:   }
        !           198: }
        !           199: 
        !           200: #define BEGIN_TIMER beginTimer()
        !           201: #define END_TIMER endTimer()
        !           202: #define HAS_TIMER hasTimer()
        !           203: 
        !           204: #else
        !           205: #define BEGIN_TIMER 
        !           206: #define END_TIMER
        !           207: #define HAS_TIMER 0
        !           208: #endif
        !           209: 
        !           210: /*
        !           211: ** Used to prevent warnings about unused parameters
        !           212: */
        !           213: #define UNUSED_PARAMETER(x) (void)(x)
        !           214: 
        !           215: /*
        !           216: ** If the following flag is set, then command execution stops
        !           217: ** at an error if we are not interactive.
        !           218: */
        !           219: static int bail_on_error = 0;
        !           220: 
        !           221: /*
        !           222: ** Threat stdin as an interactive input if the following variable
        !           223: ** is true.  Otherwise, assume stdin is connected to a file or pipe.
        !           224: */
        !           225: static int stdin_is_interactive = 1;
        !           226: 
        !           227: /*
        !           228: ** The following is the open SQLite database.  We make a pointer
        !           229: ** to this database a static variable so that it can be accessed
        !           230: ** by the SIGINT handler to interrupt database processing.
        !           231: */
        !           232: static sqlite3 *db = 0;
        !           233: 
        !           234: /*
        !           235: ** True if an interrupt (Control-C) has been received.
        !           236: */
        !           237: static volatile int seenInterrupt = 0;
        !           238: 
        !           239: /*
        !           240: ** This is the name of our program. It is set in main(), used
        !           241: ** in a number of other places, mostly for error messages.
        !           242: */
        !           243: static char *Argv0;
        !           244: 
        !           245: /*
        !           246: ** Prompt strings. Initialized in main. Settable with
        !           247: **   .prompt main continue
        !           248: */
        !           249: static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
        !           250: static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
        !           251: 
        !           252: /*
        !           253: ** Write I/O traces to the following stream.
        !           254: */
        !           255: #ifdef SQLITE_ENABLE_IOTRACE
        !           256: static FILE *iotrace = 0;
        !           257: #endif
        !           258: 
        !           259: /*
        !           260: ** This routine works like printf in that its first argument is a
        !           261: ** format string and subsequent arguments are values to be substituted
        !           262: ** in place of % fields.  The result of formatting this string
        !           263: ** is written to iotrace.
        !           264: */
        !           265: #ifdef SQLITE_ENABLE_IOTRACE
        !           266: static void iotracePrintf(const char *zFormat, ...){
        !           267:   va_list ap;
        !           268:   char *z;
        !           269:   if( iotrace==0 ) return;
        !           270:   va_start(ap, zFormat);
        !           271:   z = sqlite3_vmprintf(zFormat, ap);
        !           272:   va_end(ap);
        !           273:   fprintf(iotrace, "%s", z);
        !           274:   sqlite3_free(z);
        !           275: }
        !           276: #endif
        !           277: 
        !           278: 
        !           279: /*
        !           280: ** Determines if a string is a number of not.
        !           281: */
        !           282: static int isNumber(const char *z, int *realnum){
        !           283:   if( *z=='-' || *z=='+' ) z++;
        !           284:   if( !IsDigit(*z) ){
        !           285:     return 0;
        !           286:   }
        !           287:   z++;
        !           288:   if( realnum ) *realnum = 0;
        !           289:   while( IsDigit(*z) ){ z++; }
        !           290:   if( *z=='.' ){
        !           291:     z++;
        !           292:     if( !IsDigit(*z) ) return 0;
        !           293:     while( IsDigit(*z) ){ z++; }
        !           294:     if( realnum ) *realnum = 1;
        !           295:   }
        !           296:   if( *z=='e' || *z=='E' ){
        !           297:     z++;
        !           298:     if( *z=='+' || *z=='-' ) z++;
        !           299:     if( !IsDigit(*z) ) return 0;
        !           300:     while( IsDigit(*z) ){ z++; }
        !           301:     if( realnum ) *realnum = 1;
        !           302:   }
        !           303:   return *z==0;
        !           304: }
        !           305: 
        !           306: /*
        !           307: ** A global char* and an SQL function to access its current value 
        !           308: ** from within an SQL statement. This program used to use the 
        !           309: ** sqlite_exec_printf() API to substitue a string into an SQL statement.
        !           310: ** The correct way to do this with sqlite3 is to use the bind API, but
        !           311: ** since the shell is built around the callback paradigm it would be a lot
        !           312: ** of work. Instead just use this hack, which is quite harmless.
        !           313: */
        !           314: static const char *zShellStatic = 0;
        !           315: static void shellstaticFunc(
        !           316:   sqlite3_context *context,
        !           317:   int argc,
        !           318:   sqlite3_value **argv
        !           319: ){
        !           320:   assert( 0==argc );
        !           321:   assert( zShellStatic );
        !           322:   UNUSED_PARAMETER(argc);
        !           323:   UNUSED_PARAMETER(argv);
        !           324:   sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
        !           325: }
        !           326: 
        !           327: 
        !           328: /*
        !           329: ** This routine reads a line of text from FILE in, stores
        !           330: ** the text in memory obtained from malloc() and returns a pointer
        !           331: ** to the text.  NULL is returned at end of file, or if malloc()
        !           332: ** fails.
        !           333: **
        !           334: ** The interface is like "readline" but no command-line editing
        !           335: ** is done.
        !           336: */
        !           337: static char *local_getline(char *zPrompt, FILE *in){
        !           338:   char *zLine;
        !           339:   int nLine;
        !           340:   int n;
        !           341: 
        !           342:   if( zPrompt && *zPrompt ){
        !           343:     printf("%s",zPrompt);
        !           344:     fflush(stdout);
        !           345:   }
        !           346:   nLine = 100;
        !           347:   zLine = malloc( nLine );
        !           348:   if( zLine==0 ) return 0;
        !           349:   n = 0;
        !           350:   while( 1 ){
        !           351:     if( n+100>nLine ){
        !           352:       nLine = nLine*2 + 100;
        !           353:       zLine = realloc(zLine, nLine);
        !           354:       if( zLine==0 ) return 0;
        !           355:     }
        !           356:     if( fgets(&zLine[n], nLine - n, in)==0 ){
        !           357:       if( n==0 ){
        !           358:         free(zLine);
        !           359:         return 0;
        !           360:       }
        !           361:       zLine[n] = 0;
        !           362:       break;
        !           363:     }
        !           364:     while( zLine[n] ){ n++; }
        !           365:     if( n>0 && zLine[n-1]=='\n' ){
        !           366:       n--;
        !           367:       if( n>0 && zLine[n-1]=='\r' ) n--;
        !           368:       zLine[n] = 0;
        !           369:       break;
        !           370:     }
        !           371:   }
        !           372:   zLine = realloc( zLine, n+1 );
        !           373:   return zLine;
        !           374: }
        !           375: 
        !           376: /*
        !           377: ** Retrieve a single line of input text.
        !           378: **
        !           379: ** zPrior is a string of prior text retrieved.  If not the empty
        !           380: ** string, then issue a continuation prompt.
        !           381: */
        !           382: static char *one_input_line(const char *zPrior, FILE *in){
        !           383:   char *zPrompt;
        !           384:   char *zResult;
        !           385:   if( in!=0 ){
        !           386:     return local_getline(0, in);
        !           387:   }
        !           388:   if( zPrior && zPrior[0] ){
        !           389:     zPrompt = continuePrompt;
        !           390:   }else{
        !           391:     zPrompt = mainPrompt;
        !           392:   }
        !           393:   zResult = readline(zPrompt);
        !           394: #if defined(HAVE_READLINE) && HAVE_READLINE==1
        !           395:   if( zResult && *zResult ) add_history(zResult);
        !           396: #endif
        !           397:   return zResult;
        !           398: }
        !           399: 
        !           400: struct previous_mode_data {
        !           401:   int valid;        /* Is there legit data in here? */
        !           402:   int mode;
        !           403:   int showHeader;
        !           404:   int colWidth[100];
        !           405: };
        !           406: 
        !           407: /*
        !           408: ** An pointer to an instance of this structure is passed from
        !           409: ** the main program to the callback.  This is used to communicate
        !           410: ** state and mode information.
        !           411: */
        !           412: struct callback_data {
        !           413:   sqlite3 *db;           /* The database */
        !           414:   int echoOn;            /* True to echo input commands */
        !           415:   int statsOn;           /* True to display memory stats before each finalize */
        !           416:   int cnt;               /* Number of records displayed so far */
        !           417:   FILE *out;             /* Write results here */
        !           418:   int nErr;              /* Number of errors seen */
        !           419:   int mode;              /* An output mode setting */
        !           420:   int writableSchema;    /* True if PRAGMA writable_schema=ON */
        !           421:   int showHeader;        /* True to show column names in List or Column mode */
        !           422:   char *zDestTable;      /* Name of destination table when MODE_Insert */
        !           423:   char separator[20];    /* Separator character for MODE_List */
        !           424:   int colWidth[100];     /* Requested width of each column when in column mode*/
        !           425:   int actualWidth[100];  /* Actual width of each column */
        !           426:   char nullvalue[20];    /* The text to print when a NULL comes back from
        !           427:                          ** the database */
        !           428:   struct previous_mode_data explainPrev;
        !           429:                          /* Holds the mode information just before
        !           430:                          ** .explain ON */
        !           431:   char outfile[FILENAME_MAX]; /* Filename for *out */
        !           432:   const char *zDbFilename;    /* name of the database file */
        !           433:   const char *zVfs;           /* Name of VFS to use */
        !           434:   sqlite3_stmt *pStmt;   /* Current statement if any. */
        !           435:   FILE *pLog;            /* Write log output here */
        !           436: };
        !           437: 
        !           438: /*
        !           439: ** These are the allowed modes.
        !           440: */
        !           441: #define MODE_Line     0  /* One column per line.  Blank line between records */
        !           442: #define MODE_Column   1  /* One record per line in neat columns */
        !           443: #define MODE_List     2  /* One record per line with a separator */
        !           444: #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
        !           445: #define MODE_Html     4  /* Generate an XHTML table */
        !           446: #define MODE_Insert   5  /* Generate SQL "insert" statements */
        !           447: #define MODE_Tcl      6  /* Generate ANSI-C or TCL quoted elements */
        !           448: #define MODE_Csv      7  /* Quote strings, numbers are plain */
        !           449: #define MODE_Explain  8  /* Like MODE_Column, but do not truncate data */
        !           450: 
        !           451: static const char *modeDescr[] = {
        !           452:   "line",
        !           453:   "column",
        !           454:   "list",
        !           455:   "semi",
        !           456:   "html",
        !           457:   "insert",
        !           458:   "tcl",
        !           459:   "csv",
        !           460:   "explain",
        !           461: };
        !           462: 
        !           463: /*
        !           464: ** Number of elements in an array
        !           465: */
        !           466: #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
        !           467: 
        !           468: /*
        !           469: ** Compute a string length that is limited to what can be stored in
        !           470: ** lower 30 bits of a 32-bit signed integer.
        !           471: */
        !           472: static int strlen30(const char *z){
        !           473:   const char *z2 = z;
        !           474:   while( *z2 ){ z2++; }
        !           475:   return 0x3fffffff & (int)(z2 - z);
        !           476: }
        !           477: 
        !           478: /*
        !           479: ** A callback for the sqlite3_log() interface.
        !           480: */
        !           481: static void shellLog(void *pArg, int iErrCode, const char *zMsg){
        !           482:   struct callback_data *p = (struct callback_data*)pArg;
        !           483:   if( p->pLog==0 ) return;
        !           484:   fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
        !           485:   fflush(p->pLog);
        !           486: }
        !           487: 
        !           488: /*
        !           489: ** Output the given string as a hex-encoded blob (eg. X'1234' )
        !           490: */
        !           491: static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
        !           492:   int i;
        !           493:   char *zBlob = (char *)pBlob;
        !           494:   fprintf(out,"X'");
        !           495:   for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); }
        !           496:   fprintf(out,"'");
        !           497: }
        !           498: 
        !           499: /*
        !           500: ** Output the given string as a quoted string using SQL quoting conventions.
        !           501: */
        !           502: static void output_quoted_string(FILE *out, const char *z){
        !           503:   int i;
        !           504:   int nSingle = 0;
        !           505:   for(i=0; z[i]; i++){
        !           506:     if( z[i]=='\'' ) nSingle++;
        !           507:   }
        !           508:   if( nSingle==0 ){
        !           509:     fprintf(out,"'%s'",z);
        !           510:   }else{
        !           511:     fprintf(out,"'");
        !           512:     while( *z ){
        !           513:       for(i=0; z[i] && z[i]!='\''; i++){}
        !           514:       if( i==0 ){
        !           515:         fprintf(out,"''");
        !           516:         z++;
        !           517:       }else if( z[i]=='\'' ){
        !           518:         fprintf(out,"%.*s''",i,z);
        !           519:         z += i+1;
        !           520:       }else{
        !           521:         fprintf(out,"%s",z);
        !           522:         break;
        !           523:       }
        !           524:     }
        !           525:     fprintf(out,"'");
        !           526:   }
        !           527: }
        !           528: 
        !           529: /*
        !           530: ** Output the given string as a quoted according to C or TCL quoting rules.
        !           531: */
        !           532: static void output_c_string(FILE *out, const char *z){
        !           533:   unsigned int c;
        !           534:   fputc('"', out);
        !           535:   while( (c = *(z++))!=0 ){
        !           536:     if( c=='\\' ){
        !           537:       fputc(c, out);
        !           538:       fputc(c, out);
        !           539:     }else if( c=='\t' ){
        !           540:       fputc('\\', out);
        !           541:       fputc('t', out);
        !           542:     }else if( c=='\n' ){
        !           543:       fputc('\\', out);
        !           544:       fputc('n', out);
        !           545:     }else if( c=='\r' ){
        !           546:       fputc('\\', out);
        !           547:       fputc('r', out);
        !           548:     }else if( !isprint(c) ){
        !           549:       fprintf(out, "\\%03o", c&0xff);
        !           550:     }else{
        !           551:       fputc(c, out);
        !           552:     }
        !           553:   }
        !           554:   fputc('"', out);
        !           555: }
        !           556: 
        !           557: /*
        !           558: ** Output the given string with characters that are special to
        !           559: ** HTML escaped.
        !           560: */
        !           561: static void output_html_string(FILE *out, const char *z){
        !           562:   int i;
        !           563:   while( *z ){
        !           564:     for(i=0;   z[i] 
        !           565:             && z[i]!='<' 
        !           566:             && z[i]!='&' 
        !           567:             && z[i]!='>' 
        !           568:             && z[i]!='\"' 
        !           569:             && z[i]!='\'';
        !           570:         i++){}
        !           571:     if( i>0 ){
        !           572:       fprintf(out,"%.*s",i,z);
        !           573:     }
        !           574:     if( z[i]=='<' ){
        !           575:       fprintf(out,"&lt;");
        !           576:     }else if( z[i]=='&' ){
        !           577:       fprintf(out,"&amp;");
        !           578:     }else if( z[i]=='>' ){
        !           579:       fprintf(out,"&gt;");
        !           580:     }else if( z[i]=='\"' ){
        !           581:       fprintf(out,"&quot;");
        !           582:     }else if( z[i]=='\'' ){
        !           583:       fprintf(out,"&#39;");
        !           584:     }else{
        !           585:       break;
        !           586:     }
        !           587:     z += i + 1;
        !           588:   }
        !           589: }
        !           590: 
        !           591: /*
        !           592: ** If a field contains any character identified by a 1 in the following
        !           593: ** array, then the string must be quoted for CSV.
        !           594: */
        !           595: static const char needCsvQuote[] = {
        !           596:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           597:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           598:   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0, 
        !           599:   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 
        !           600:   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 
        !           601:   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 
        !           602:   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 
        !           603:   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1, 
        !           604:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           605:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           606:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           607:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           608:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           609:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           610:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           611:   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,   
        !           612: };
        !           613: 
        !           614: /*
        !           615: ** Output a single term of CSV.  Actually, p->separator is used for
        !           616: ** the separator, which may or may not be a comma.  p->nullvalue is
        !           617: ** the null value.  Strings are quoted using ANSI-C rules.  Numbers
        !           618: ** appear outside of quotes.
        !           619: */
        !           620: static void output_csv(struct callback_data *p, const char *z, int bSep){
        !           621:   FILE *out = p->out;
        !           622:   if( z==0 ){
        !           623:     fprintf(out,"%s",p->nullvalue);
        !           624:   }else{
        !           625:     int i;
        !           626:     int nSep = strlen30(p->separator);
        !           627:     for(i=0; z[i]; i++){
        !           628:       if( needCsvQuote[((unsigned char*)z)[i]] 
        !           629:          || (z[i]==p->separator[0] && 
        !           630:              (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
        !           631:         i = 0;
        !           632:         break;
        !           633:       }
        !           634:     }
        !           635:     if( i==0 ){
        !           636:       putc('"', out);
        !           637:       for(i=0; z[i]; i++){
        !           638:         if( z[i]=='"' ) putc('"', out);
        !           639:         putc(z[i], out);
        !           640:       }
        !           641:       putc('"', out);
        !           642:     }else{
        !           643:       fprintf(out, "%s", z);
        !           644:     }
        !           645:   }
        !           646:   if( bSep ){
        !           647:     fprintf(p->out, "%s", p->separator);
        !           648:   }
        !           649: }
        !           650: 
        !           651: #ifdef SIGINT
        !           652: /*
        !           653: ** This routine runs when the user presses Ctrl-C
        !           654: */
        !           655: static void interrupt_handler(int NotUsed){
        !           656:   UNUSED_PARAMETER(NotUsed);
        !           657:   seenInterrupt = 1;
        !           658:   if( db ) sqlite3_interrupt(db);
        !           659: }
        !           660: #endif
        !           661: 
        !           662: /*
        !           663: ** This is the callback routine that the shell
        !           664: ** invokes for each row of a query result.
        !           665: */
        !           666: static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
        !           667:   int i;
        !           668:   struct callback_data *p = (struct callback_data*)pArg;
        !           669: 
        !           670:   switch( p->mode ){
        !           671:     case MODE_Line: {
        !           672:       int w = 5;
        !           673:       if( azArg==0 ) break;
        !           674:       for(i=0; i<nArg; i++){
        !           675:         int len = strlen30(azCol[i] ? azCol[i] : "");
        !           676:         if( len>w ) w = len;
        !           677:       }
        !           678:       if( p->cnt++>0 ) fprintf(p->out,"\n");
        !           679:       for(i=0; i<nArg; i++){
        !           680:         fprintf(p->out,"%*s = %s\n", w, azCol[i],
        !           681:                 azArg[i] ? azArg[i] : p->nullvalue);
        !           682:       }
        !           683:       break;
        !           684:     }
        !           685:     case MODE_Explain:
        !           686:     case MODE_Column: {
        !           687:       if( p->cnt++==0 ){
        !           688:         for(i=0; i<nArg; i++){
        !           689:           int w, n;
        !           690:           if( i<ArraySize(p->colWidth) ){
        !           691:             w = p->colWidth[i];
        !           692:           }else{
        !           693:             w = 0;
        !           694:           }
        !           695:           if( w<=0 ){
        !           696:             w = strlen30(azCol[i] ? azCol[i] : "");
        !           697:             if( w<10 ) w = 10;
        !           698:             n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
        !           699:             if( w<n ) w = n;
        !           700:           }
        !           701:           if( i<ArraySize(p->actualWidth) ){
        !           702:             p->actualWidth[i] = w;
        !           703:           }
        !           704:           if( p->showHeader ){
        !           705:             fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": "  ");
        !           706:           }
        !           707:         }
        !           708:         if( p->showHeader ){
        !           709:           for(i=0; i<nArg; i++){
        !           710:             int w;
        !           711:             if( i<ArraySize(p->actualWidth) ){
        !           712:                w = p->actualWidth[i];
        !           713:             }else{
        !           714:                w = 10;
        !           715:             }
        !           716:             fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
        !           717:                    "----------------------------------------------------------",
        !           718:                     i==nArg-1 ? "\n": "  ");
        !           719:           }
        !           720:         }
        !           721:       }
        !           722:       if( azArg==0 ) break;
        !           723:       for(i=0; i<nArg; i++){
        !           724:         int w;
        !           725:         if( i<ArraySize(p->actualWidth) ){
        !           726:            w = p->actualWidth[i];
        !           727:         }else{
        !           728:            w = 10;
        !           729:         }
        !           730:         if( p->mode==MODE_Explain && azArg[i] && 
        !           731:            strlen30(azArg[i])>w ){
        !           732:           w = strlen30(azArg[i]);
        !           733:         }
        !           734:         fprintf(p->out,"%-*.*s%s",w,w,
        !           735:             azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": "  ");
        !           736:       }
        !           737:       break;
        !           738:     }
        !           739:     case MODE_Semi:
        !           740:     case MODE_List: {
        !           741:       if( p->cnt++==0 && p->showHeader ){
        !           742:         for(i=0; i<nArg; i++){
        !           743:           fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
        !           744:         }
        !           745:       }
        !           746:       if( azArg==0 ) break;
        !           747:       for(i=0; i<nArg; i++){
        !           748:         char *z = azArg[i];
        !           749:         if( z==0 ) z = p->nullvalue;
        !           750:         fprintf(p->out, "%s", z);
        !           751:         if( i<nArg-1 ){
        !           752:           fprintf(p->out, "%s", p->separator);
        !           753:         }else if( p->mode==MODE_Semi ){
        !           754:           fprintf(p->out, ";\n");
        !           755:         }else{
        !           756:           fprintf(p->out, "\n");
        !           757:         }
        !           758:       }
        !           759:       break;
        !           760:     }
        !           761:     case MODE_Html: {
        !           762:       if( p->cnt++==0 && p->showHeader ){
        !           763:         fprintf(p->out,"<TR>");
        !           764:         for(i=0; i<nArg; i++){
        !           765:           fprintf(p->out,"<TH>");
        !           766:           output_html_string(p->out, azCol[i]);
        !           767:           fprintf(p->out,"</TH>\n");
        !           768:         }
        !           769:         fprintf(p->out,"</TR>\n");
        !           770:       }
        !           771:       if( azArg==0 ) break;
        !           772:       fprintf(p->out,"<TR>");
        !           773:       for(i=0; i<nArg; i++){
        !           774:         fprintf(p->out,"<TD>");
        !           775:         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
        !           776:         fprintf(p->out,"</TD>\n");
        !           777:       }
        !           778:       fprintf(p->out,"</TR>\n");
        !           779:       break;
        !           780:     }
        !           781:     case MODE_Tcl: {
        !           782:       if( p->cnt++==0 && p->showHeader ){
        !           783:         for(i=0; i<nArg; i++){
        !           784:           output_c_string(p->out,azCol[i] ? azCol[i] : "");
        !           785:           fprintf(p->out, "%s", p->separator);
        !           786:         }
        !           787:         fprintf(p->out,"\n");
        !           788:       }
        !           789:       if( azArg==0 ) break;
        !           790:       for(i=0; i<nArg; i++){
        !           791:         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
        !           792:         fprintf(p->out, "%s", p->separator);
        !           793:       }
        !           794:       fprintf(p->out,"\n");
        !           795:       break;
        !           796:     }
        !           797:     case MODE_Csv: {
        !           798:       if( p->cnt++==0 && p->showHeader ){
        !           799:         for(i=0; i<nArg; i++){
        !           800:           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
        !           801:         }
        !           802:         fprintf(p->out,"\n");
        !           803:       }
        !           804:       if( azArg==0 ) break;
        !           805:       for(i=0; i<nArg; i++){
        !           806:         output_csv(p, azArg[i], i<nArg-1);
        !           807:       }
        !           808:       fprintf(p->out,"\n");
        !           809:       break;
        !           810:     }
        !           811:     case MODE_Insert: {
        !           812:       p->cnt++;
        !           813:       if( azArg==0 ) break;
        !           814:       fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
        !           815:       for(i=0; i<nArg; i++){
        !           816:         char *zSep = i>0 ? ",": "";
        !           817:         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
        !           818:           fprintf(p->out,"%sNULL",zSep);
        !           819:         }else if( aiType && aiType[i]==SQLITE_TEXT ){
        !           820:           if( zSep[0] ) fprintf(p->out,"%s",zSep);
        !           821:           output_quoted_string(p->out, azArg[i]);
        !           822:         }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
        !           823:           fprintf(p->out,"%s%s",zSep, azArg[i]);
        !           824:         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
        !           825:           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
        !           826:           int nBlob = sqlite3_column_bytes(p->pStmt, i);
        !           827:           if( zSep[0] ) fprintf(p->out,"%s",zSep);
        !           828:           output_hex_blob(p->out, pBlob, nBlob);
        !           829:         }else if( isNumber(azArg[i], 0) ){
        !           830:           fprintf(p->out,"%s%s",zSep, azArg[i]);
        !           831:         }else{
        !           832:           if( zSep[0] ) fprintf(p->out,"%s",zSep);
        !           833:           output_quoted_string(p->out, azArg[i]);
        !           834:         }
        !           835:       }
        !           836:       fprintf(p->out,");\n");
        !           837:       break;
        !           838:     }
        !           839:   }
        !           840:   return 0;
        !           841: }
        !           842: 
        !           843: /*
        !           844: ** This is the callback routine that the SQLite library
        !           845: ** invokes for each row of a query result.
        !           846: */
        !           847: static int callback(void *pArg, int nArg, char **azArg, char **azCol){
        !           848:   /* since we don't have type info, call the shell_callback with a NULL value */
        !           849:   return shell_callback(pArg, nArg, azArg, azCol, NULL);
        !           850: }
        !           851: 
        !           852: /*
        !           853: ** Set the destination table field of the callback_data structure to
        !           854: ** the name of the table given.  Escape any quote characters in the
        !           855: ** table name.
        !           856: */
        !           857: static void set_table_name(struct callback_data *p, const char *zName){
        !           858:   int i, n;
        !           859:   int needQuote;
        !           860:   char *z;
        !           861: 
        !           862:   if( p->zDestTable ){
        !           863:     free(p->zDestTable);
        !           864:     p->zDestTable = 0;
        !           865:   }
        !           866:   if( zName==0 ) return;
        !           867:   needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
        !           868:   for(i=n=0; zName[i]; i++, n++){
        !           869:     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
        !           870:       needQuote = 1;
        !           871:       if( zName[i]=='\'' ) n++;
        !           872:     }
        !           873:   }
        !           874:   if( needQuote ) n += 2;
        !           875:   z = p->zDestTable = malloc( n+1 );
        !           876:   if( z==0 ){
        !           877:     fprintf(stderr,"Error: out of memory\n");
        !           878:     exit(1);
        !           879:   }
        !           880:   n = 0;
        !           881:   if( needQuote ) z[n++] = '\'';
        !           882:   for(i=0; zName[i]; i++){
        !           883:     z[n++] = zName[i];
        !           884:     if( zName[i]=='\'' ) z[n++] = '\'';
        !           885:   }
        !           886:   if( needQuote ) z[n++] = '\'';
        !           887:   z[n] = 0;
        !           888: }
        !           889: 
        !           890: /* zIn is either a pointer to a NULL-terminated string in memory obtained
        !           891: ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
        !           892: ** added to zIn, and the result returned in memory obtained from malloc().
        !           893: ** zIn, if it was not NULL, is freed.
        !           894: **
        !           895: ** If the third argument, quote, is not '\0', then it is used as a 
        !           896: ** quote character for zAppend.
        !           897: */
        !           898: static char *appendText(char *zIn, char const *zAppend, char quote){
        !           899:   int len;
        !           900:   int i;
        !           901:   int nAppend = strlen30(zAppend);
        !           902:   int nIn = (zIn?strlen30(zIn):0);
        !           903: 
        !           904:   len = nAppend+nIn+1;
        !           905:   if( quote ){
        !           906:     len += 2;
        !           907:     for(i=0; i<nAppend; i++){
        !           908:       if( zAppend[i]==quote ) len++;
        !           909:     }
        !           910:   }
        !           911: 
        !           912:   zIn = (char *)realloc(zIn, len);
        !           913:   if( !zIn ){
        !           914:     return 0;
        !           915:   }
        !           916: 
        !           917:   if( quote ){
        !           918:     char *zCsr = &zIn[nIn];
        !           919:     *zCsr++ = quote;
        !           920:     for(i=0; i<nAppend; i++){
        !           921:       *zCsr++ = zAppend[i];
        !           922:       if( zAppend[i]==quote ) *zCsr++ = quote;
        !           923:     }
        !           924:     *zCsr++ = quote;
        !           925:     *zCsr++ = '\0';
        !           926:     assert( (zCsr-zIn)==len );
        !           927:   }else{
        !           928:     memcpy(&zIn[nIn], zAppend, nAppend);
        !           929:     zIn[len-1] = '\0';
        !           930:   }
        !           931: 
        !           932:   return zIn;
        !           933: }
        !           934: 
        !           935: 
        !           936: /*
        !           937: ** Execute a query statement that has a single result column.  Print
        !           938: ** that result column on a line by itself with a semicolon terminator.
        !           939: **
        !           940: ** This is used, for example, to show the schema of the database by
        !           941: ** querying the SQLITE_MASTER table.
        !           942: */
        !           943: static int run_table_dump_query(
        !           944:   struct callback_data *p, /* Query context */
        !           945:   const char *zSelect,     /* SELECT statement to extract content */
        !           946:   const char *zFirstRow    /* Print before first row, if not NULL */
        !           947: ){
        !           948:   sqlite3_stmt *pSelect;
        !           949:   int rc;
        !           950:   rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
        !           951:   if( rc!=SQLITE_OK || !pSelect ){
        !           952:     fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
        !           953:     p->nErr++;
        !           954:     return rc;
        !           955:   }
        !           956:   rc = sqlite3_step(pSelect);
        !           957:   while( rc==SQLITE_ROW ){
        !           958:     if( zFirstRow ){
        !           959:       fprintf(p->out, "%s", zFirstRow);
        !           960:       zFirstRow = 0;
        !           961:     }
        !           962:     fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0));
        !           963:     rc = sqlite3_step(pSelect);
        !           964:   }
        !           965:   rc = sqlite3_finalize(pSelect);
        !           966:   if( rc!=SQLITE_OK ){
        !           967:     fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
        !           968:     p->nErr++;
        !           969:   }
        !           970:   return rc;
        !           971: }
        !           972: 
        !           973: /*
        !           974: ** Allocate space and save off current error string.
        !           975: */
        !           976: static char *save_err_msg(
        !           977:   sqlite3 *db            /* Database to query */
        !           978: ){
        !           979:   int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
        !           980:   char *zErrMsg = sqlite3_malloc(nErrMsg);
        !           981:   if( zErrMsg ){
        !           982:     memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
        !           983:   }
        !           984:   return zErrMsg;
        !           985: }
        !           986: 
        !           987: /*
        !           988: ** Display memory stats.
        !           989: */
        !           990: static int display_stats(
        !           991:   sqlite3 *db,                /* Database to query */
        !           992:   struct callback_data *pArg, /* Pointer to struct callback_data */
        !           993:   int bReset                  /* True to reset the stats */
        !           994: ){
        !           995:   int iCur;
        !           996:   int iHiwtr;
        !           997: 
        !           998:   if( pArg && pArg->out ){
        !           999:     
        !          1000:     iHiwtr = iCur = -1;
        !          1001:     sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
        !          1002:     fprintf(pArg->out, "Memory Used:                         %d (max %d) bytes\n", iCur, iHiwtr);
        !          1003:     iHiwtr = iCur = -1;
        !          1004:     sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
        !          1005:     fprintf(pArg->out, "Number of Outstanding Allocations:   %d (max %d)\n", iCur, iHiwtr);
        !          1006: /*
        !          1007: ** Not currently used by the CLI.
        !          1008: **    iHiwtr = iCur = -1;
        !          1009: **    sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
        !          1010: **    fprintf(pArg->out, "Number of Pcache Pages Used:         %d (max %d) pages\n", iCur, iHiwtr);
        !          1011: */
        !          1012:     iHiwtr = iCur = -1;
        !          1013:     sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
        !          1014:     fprintf(pArg->out, "Number of Pcache Overflow Bytes:     %d (max %d) bytes\n", iCur, iHiwtr);
        !          1015: /*
        !          1016: ** Not currently used by the CLI.
        !          1017: **    iHiwtr = iCur = -1;
        !          1018: **    sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
        !          1019: **    fprintf(pArg->out, "Number of Scratch Allocations Used:  %d (max %d)\n", iCur, iHiwtr);
        !          1020: */
        !          1021:     iHiwtr = iCur = -1;
        !          1022:     sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
        !          1023:     fprintf(pArg->out, "Number of Scratch Overflow Bytes:    %d (max %d) bytes\n", iCur, iHiwtr);
        !          1024:     iHiwtr = iCur = -1;
        !          1025:     sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
        !          1026:     fprintf(pArg->out, "Largest Allocation:                  %d bytes\n", iHiwtr);
        !          1027:     iHiwtr = iCur = -1;
        !          1028:     sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
        !          1029:     fprintf(pArg->out, "Largest Pcache Allocation:           %d bytes\n", iHiwtr);
        !          1030:     iHiwtr = iCur = -1;
        !          1031:     sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
        !          1032:     fprintf(pArg->out, "Largest Scratch Allocation:          %d bytes\n", iHiwtr);
        !          1033: #ifdef YYTRACKMAXSTACKDEPTH
        !          1034:     iHiwtr = iCur = -1;
        !          1035:     sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
        !          1036:     fprintf(pArg->out, "Deepest Parser Stack:                %d (max %d)\n", iCur, iHiwtr);
        !          1037: #endif
        !          1038:   }
        !          1039: 
        !          1040:   if( pArg && pArg->out && db ){
        !          1041:     iHiwtr = iCur = -1;
        !          1042:     sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
        !          1043:     fprintf(pArg->out, "Lookaside Slots Used:                %d (max %d)\n", iCur, iHiwtr);
        !          1044:     sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
        !          1045:     fprintf(pArg->out, "Successful lookaside attempts:       %d\n", iHiwtr);
        !          1046:     sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
        !          1047:     fprintf(pArg->out, "Lookaside failures due to size:      %d\n", iHiwtr);
        !          1048:     sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
        !          1049:     fprintf(pArg->out, "Lookaside failures due to OOM:       %d\n", iHiwtr);
        !          1050:     iHiwtr = iCur = -1;
        !          1051:     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
        !          1052:     fprintf(pArg->out, "Pager Heap Usage:                    %d bytes\n", iCur);    iHiwtr = iCur = -1;
        !          1053:     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
        !          1054:     fprintf(pArg->out, "Page cache hits:                     %d\n", iCur);
        !          1055:     iHiwtr = iCur = -1;
        !          1056:     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
        !          1057:     fprintf(pArg->out, "Page cache misses:                   %d\n", iCur); 
        !          1058:     iHiwtr = iCur = -1;
        !          1059:     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
        !          1060:     fprintf(pArg->out, "Schema Heap Usage:                   %d bytes\n", iCur); 
        !          1061:     iHiwtr = iCur = -1;
        !          1062:     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
        !          1063:     fprintf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n", iCur); 
        !          1064:   }
        !          1065: 
        !          1066:   if( pArg && pArg->out && db && pArg->pStmt ){
        !          1067:     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
        !          1068:     fprintf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
        !          1069:     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
        !          1070:     fprintf(pArg->out, "Sort Operations:                     %d\n", iCur);
        !          1071:     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
        !          1072:     fprintf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
        !          1073:   }
        !          1074: 
        !          1075:   return 0;
        !          1076: }
        !          1077: 
        !          1078: /*
        !          1079: ** Execute a statement or set of statements.  Print 
        !          1080: ** any result rows/columns depending on the current mode 
        !          1081: ** set via the supplied callback.
        !          1082: **
        !          1083: ** This is very similar to SQLite's built-in sqlite3_exec() 
        !          1084: ** function except it takes a slightly different callback 
        !          1085: ** and callback data argument.
        !          1086: */
        !          1087: static int shell_exec(
        !          1088:   sqlite3 *db,                                /* An open database */
        !          1089:   const char *zSql,                           /* SQL to be evaluated */
        !          1090:   int (*xCallback)(void*,int,char**,char**,int*),   /* Callback function */
        !          1091:                                               /* (not the same as sqlite3_exec) */
        !          1092:   struct callback_data *pArg,                 /* Pointer to struct callback_data */
        !          1093:   char **pzErrMsg                             /* Error msg written here */
        !          1094: ){
        !          1095:   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
        !          1096:   int rc = SQLITE_OK;             /* Return Code */
        !          1097:   int rc2;
        !          1098:   const char *zLeftover;          /* Tail of unprocessed SQL */
        !          1099: 
        !          1100:   if( pzErrMsg ){
        !          1101:     *pzErrMsg = NULL;
        !          1102:   }
        !          1103: 
        !          1104:   while( zSql[0] && (SQLITE_OK == rc) ){
        !          1105:     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
        !          1106:     if( SQLITE_OK != rc ){
        !          1107:       if( pzErrMsg ){
        !          1108:         *pzErrMsg = save_err_msg(db);
        !          1109:       }
        !          1110:     }else{
        !          1111:       if( !pStmt ){
        !          1112:         /* this happens for a comment or white-space */
        !          1113:         zSql = zLeftover;
        !          1114:         while( IsSpace(zSql[0]) ) zSql++;
        !          1115:         continue;
        !          1116:       }
        !          1117: 
        !          1118:       /* save off the prepared statment handle and reset row count */
        !          1119:       if( pArg ){
        !          1120:         pArg->pStmt = pStmt;
        !          1121:         pArg->cnt = 0;
        !          1122:       }
        !          1123: 
        !          1124:       /* echo the sql statement if echo on */
        !          1125:       if( pArg && pArg->echoOn ){
        !          1126:         const char *zStmtSql = sqlite3_sql(pStmt);
        !          1127:         fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
        !          1128:       }
        !          1129: 
        !          1130:       /* Output TESTCTRL_EXPLAIN text of requested */
        !          1131:       if( pArg && pArg->mode==MODE_Explain ){
        !          1132:         const char *zExplain = 0;
        !          1133:         sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
        !          1134:         if( zExplain && zExplain[0] ){
        !          1135:           fprintf(pArg->out, "%s", zExplain);
        !          1136:         }
        !          1137:       }
        !          1138: 
        !          1139:       /* perform the first step.  this will tell us if we
        !          1140:       ** have a result set or not and how wide it is.
        !          1141:       */
        !          1142:       rc = sqlite3_step(pStmt);
        !          1143:       /* if we have a result set... */
        !          1144:       if( SQLITE_ROW == rc ){
        !          1145:         /* if we have a callback... */
        !          1146:         if( xCallback ){
        !          1147:           /* allocate space for col name ptr, value ptr, and type */
        !          1148:           int nCol = sqlite3_column_count(pStmt);
        !          1149:           void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
        !          1150:           if( !pData ){
        !          1151:             rc = SQLITE_NOMEM;
        !          1152:           }else{
        !          1153:             char **azCols = (char **)pData;      /* Names of result columns */
        !          1154:             char **azVals = &azCols[nCol];       /* Results */
        !          1155:             int *aiTypes = (int *)&azVals[nCol]; /* Result types */
        !          1156:             int i;
        !          1157:             assert(sizeof(int) <= sizeof(char *)); 
        !          1158:             /* save off ptrs to column names */
        !          1159:             for(i=0; i<nCol; i++){
        !          1160:               azCols[i] = (char *)sqlite3_column_name(pStmt, i);
        !          1161:             }
        !          1162:             do{
        !          1163:               /* extract the data and data types */
        !          1164:               for(i=0; i<nCol; i++){
        !          1165:                 azVals[i] = (char *)sqlite3_column_text(pStmt, i);
        !          1166:                 aiTypes[i] = sqlite3_column_type(pStmt, i);
        !          1167:                 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
        !          1168:                   rc = SQLITE_NOMEM;
        !          1169:                   break; /* from for */
        !          1170:                 }
        !          1171:               } /* end for */
        !          1172: 
        !          1173:               /* if data and types extracted successfully... */
        !          1174:               if( SQLITE_ROW == rc ){ 
        !          1175:                 /* call the supplied callback with the result row data */
        !          1176:                 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
        !          1177:                   rc = SQLITE_ABORT;
        !          1178:                 }else{
        !          1179:                   rc = sqlite3_step(pStmt);
        !          1180:                 }
        !          1181:               }
        !          1182:             } while( SQLITE_ROW == rc );
        !          1183:             sqlite3_free(pData);
        !          1184:           }
        !          1185:         }else{
        !          1186:           do{
        !          1187:             rc = sqlite3_step(pStmt);
        !          1188:           } while( rc == SQLITE_ROW );
        !          1189:         }
        !          1190:       }
        !          1191: 
        !          1192:       /* print usage stats if stats on */
        !          1193:       if( pArg && pArg->statsOn ){
        !          1194:         display_stats(db, pArg, 0);
        !          1195:       }
        !          1196: 
        !          1197:       /* Finalize the statement just executed. If this fails, save a 
        !          1198:       ** copy of the error message. Otherwise, set zSql to point to the
        !          1199:       ** next statement to execute. */
        !          1200:       rc2 = sqlite3_finalize(pStmt);
        !          1201:       if( rc!=SQLITE_NOMEM ) rc = rc2;
        !          1202:       if( rc==SQLITE_OK ){
        !          1203:         zSql = zLeftover;
        !          1204:         while( IsSpace(zSql[0]) ) zSql++;
        !          1205:       }else if( pzErrMsg ){
        !          1206:         *pzErrMsg = save_err_msg(db);
        !          1207:       }
        !          1208: 
        !          1209:       /* clear saved stmt handle */
        !          1210:       if( pArg ){
        !          1211:         pArg->pStmt = NULL;
        !          1212:       }
        !          1213:     }
        !          1214:   } /* end while */
        !          1215: 
        !          1216:   return rc;
        !          1217: }
        !          1218: 
        !          1219: 
        !          1220: /*
        !          1221: ** This is a different callback routine used for dumping the database.
        !          1222: ** Each row received by this callback consists of a table name,
        !          1223: ** the table type ("index" or "table") and SQL to create the table.
        !          1224: ** This routine should print text sufficient to recreate the table.
        !          1225: */
        !          1226: static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
        !          1227:   int rc;
        !          1228:   const char *zTable;
        !          1229:   const char *zType;
        !          1230:   const char *zSql;
        !          1231:   const char *zPrepStmt = 0;
        !          1232:   struct callback_data *p = (struct callback_data *)pArg;
        !          1233: 
        !          1234:   UNUSED_PARAMETER(azCol);
        !          1235:   if( nArg!=3 ) return 1;
        !          1236:   zTable = azArg[0];
        !          1237:   zType = azArg[1];
        !          1238:   zSql = azArg[2];
        !          1239:   
        !          1240:   if( strcmp(zTable, "sqlite_sequence")==0 ){
        !          1241:     zPrepStmt = "DELETE FROM sqlite_sequence;\n";
        !          1242:   }else if( strcmp(zTable, "sqlite_stat1")==0 ){
        !          1243:     fprintf(p->out, "ANALYZE sqlite_master;\n");
        !          1244:   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
        !          1245:     return 0;
        !          1246:   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
        !          1247:     char *zIns;
        !          1248:     if( !p->writableSchema ){
        !          1249:       fprintf(p->out, "PRAGMA writable_schema=ON;\n");
        !          1250:       p->writableSchema = 1;
        !          1251:     }
        !          1252:     zIns = sqlite3_mprintf(
        !          1253:        "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
        !          1254:        "VALUES('table','%q','%q',0,'%q');",
        !          1255:        zTable, zTable, zSql);
        !          1256:     fprintf(p->out, "%s\n", zIns);
        !          1257:     sqlite3_free(zIns);
        !          1258:     return 0;
        !          1259:   }else{
        !          1260:     fprintf(p->out, "%s;\n", zSql);
        !          1261:   }
        !          1262: 
        !          1263:   if( strcmp(zType, "table")==0 ){
        !          1264:     sqlite3_stmt *pTableInfo = 0;
        !          1265:     char *zSelect = 0;
        !          1266:     char *zTableInfo = 0;
        !          1267:     char *zTmp = 0;
        !          1268:     int nRow = 0;
        !          1269:    
        !          1270:     zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
        !          1271:     zTableInfo = appendText(zTableInfo, zTable, '"');
        !          1272:     zTableInfo = appendText(zTableInfo, ");", 0);
        !          1273: 
        !          1274:     rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
        !          1275:     free(zTableInfo);
        !          1276:     if( rc!=SQLITE_OK || !pTableInfo ){
        !          1277:       return 1;
        !          1278:     }
        !          1279: 
        !          1280:     zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
        !          1281:     zTmp = appendText(zTmp, zTable, '"');
        !          1282:     if( zTmp ){
        !          1283:       zSelect = appendText(zSelect, zTmp, '\'');
        !          1284:     }
        !          1285:     zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
        !          1286:     rc = sqlite3_step(pTableInfo);
        !          1287:     while( rc==SQLITE_ROW ){
        !          1288:       const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
        !          1289:       zSelect = appendText(zSelect, "quote(", 0);
        !          1290:       zSelect = appendText(zSelect, zText, '"');
        !          1291:       rc = sqlite3_step(pTableInfo);
        !          1292:       if( rc==SQLITE_ROW ){
        !          1293:         zSelect = appendText(zSelect, ") || ',' || ", 0);
        !          1294:       }else{
        !          1295:         zSelect = appendText(zSelect, ") ", 0);
        !          1296:       }
        !          1297:       nRow++;
        !          1298:     }
        !          1299:     rc = sqlite3_finalize(pTableInfo);
        !          1300:     if( rc!=SQLITE_OK || nRow==0 ){
        !          1301:       free(zSelect);
        !          1302:       return 1;
        !          1303:     }
        !          1304:     zSelect = appendText(zSelect, "|| ')' FROM  ", 0);
        !          1305:     zSelect = appendText(zSelect, zTable, '"');
        !          1306: 
        !          1307:     rc = run_table_dump_query(p, zSelect, zPrepStmt);
        !          1308:     if( rc==SQLITE_CORRUPT ){
        !          1309:       zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
        !          1310:       run_table_dump_query(p, zSelect, 0);
        !          1311:     }
        !          1312:     if( zSelect ) free(zSelect);
        !          1313:   }
        !          1314:   return 0;
        !          1315: }
        !          1316: 
        !          1317: /*
        !          1318: ** Run zQuery.  Use dump_callback() as the callback routine so that
        !          1319: ** the contents of the query are output as SQL statements.
        !          1320: **
        !          1321: ** If we get a SQLITE_CORRUPT error, rerun the query after appending
        !          1322: ** "ORDER BY rowid DESC" to the end.
        !          1323: */
        !          1324: static int run_schema_dump_query(
        !          1325:   struct callback_data *p, 
        !          1326:   const char *zQuery
        !          1327: ){
        !          1328:   int rc;
        !          1329:   char *zErr = 0;
        !          1330:   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
        !          1331:   if( rc==SQLITE_CORRUPT ){
        !          1332:     char *zQ2;
        !          1333:     int len = strlen30(zQuery);
        !          1334:     fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
        !          1335:     if( zErr ){
        !          1336:       fprintf(p->out, "/****** %s ******/\n", zErr);
        !          1337:       sqlite3_free(zErr);
        !          1338:       zErr = 0;
        !          1339:     }
        !          1340:     zQ2 = malloc( len+100 );
        !          1341:     if( zQ2==0 ) return rc;
        !          1342:     sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
        !          1343:     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
        !          1344:     if( rc ){
        !          1345:       fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
        !          1346:     }else{
        !          1347:       rc = SQLITE_CORRUPT;
        !          1348:     }
        !          1349:     sqlite3_free(zErr);
        !          1350:     free(zQ2);
        !          1351:   }
        !          1352:   return rc;
        !          1353: }
        !          1354: 
        !          1355: /*
        !          1356: ** Text of a help message
        !          1357: */
        !          1358: static char zHelp[] =
        !          1359:   ".backup ?DB? FILE      Backup DB (default \"main\") to FILE\n"
        !          1360:   ".bail ON|OFF           Stop after hitting an error.  Default OFF\n"
        !          1361:   ".databases             List names and files of attached databases\n"
        !          1362:   ".dump ?TABLE? ...      Dump the database in an SQL text format\n"
        !          1363:   "                         If TABLE specified, only dump tables matching\n"
        !          1364:   "                         LIKE pattern TABLE.\n"
        !          1365:   ".echo ON|OFF           Turn command echo on or off\n"
        !          1366:   ".exit                  Exit this program\n"
        !          1367:   ".explain ?ON|OFF?      Turn output mode suitable for EXPLAIN on or off.\n"
        !          1368:   "                         With no args, it turns EXPLAIN on.\n"
        !          1369:   ".header(s) ON|OFF      Turn display of headers on or off\n"
        !          1370:   ".help                  Show this message\n"
        !          1371:   ".import FILE TABLE     Import data from FILE into TABLE\n"
        !          1372:   ".indices ?TABLE?       Show names of all indices\n"
        !          1373:   "                         If TABLE specified, only show indices for tables\n"
        !          1374:   "                         matching LIKE pattern TABLE.\n"
        !          1375: #ifdef SQLITE_ENABLE_IOTRACE
        !          1376:   ".iotrace FILE          Enable I/O diagnostic logging to FILE\n"
        !          1377: #endif
        !          1378: #ifndef SQLITE_OMIT_LOAD_EXTENSION
        !          1379:   ".load FILE ?ENTRY?     Load an extension library\n"
        !          1380: #endif
        !          1381:   ".log FILE|off          Turn logging on or off.  FILE can be stderr/stdout\n"
        !          1382:   ".mode MODE ?TABLE?     Set output mode where MODE is one of:\n"
        !          1383:   "                         csv      Comma-separated values\n"
        !          1384:   "                         column   Left-aligned columns.  (See .width)\n"
        !          1385:   "                         html     HTML <table> code\n"
        !          1386:   "                         insert   SQL insert statements for TABLE\n"
        !          1387:   "                         line     One value per line\n"
        !          1388:   "                         list     Values delimited by .separator string\n"
        !          1389:   "                         tabs     Tab-separated values\n"
        !          1390:   "                         tcl      TCL list elements\n"
        !          1391:   ".nullvalue STRING      Print STRING in place of NULL values\n"
        !          1392:   ".output FILENAME       Send output to FILENAME\n"
        !          1393:   ".output stdout         Send output to the screen\n"
        !          1394:   ".prompt MAIN CONTINUE  Replace the standard prompts\n"
        !          1395:   ".quit                  Exit this program\n"
        !          1396:   ".read FILENAME         Execute SQL in FILENAME\n"
        !          1397:   ".restore ?DB? FILE     Restore content of DB (default \"main\") from FILE\n"
        !          1398:   ".schema ?TABLE?        Show the CREATE statements\n"
        !          1399:   "                         If TABLE specified, only show tables matching\n"
        !          1400:   "                         LIKE pattern TABLE.\n"
        !          1401:   ".separator STRING      Change separator used by output mode and .import\n"
        !          1402:   ".show                  Show the current values for various settings\n"
        !          1403:   ".stats ON|OFF          Turn stats on or off\n"
        !          1404:   ".tables ?TABLE?        List names of tables\n"
        !          1405:   "                         If TABLE specified, only list tables matching\n"
        !          1406:   "                         LIKE pattern TABLE.\n"
        !          1407:   ".timeout MS            Try opening locked tables for MS milliseconds\n"
        !          1408:   ".vfsname ?AUX?         Print the name of the VFS stack\n"
        !          1409:   ".width NUM1 NUM2 ...   Set column widths for \"column\" mode\n"
        !          1410: ;
        !          1411: 
        !          1412: static char zTimerHelp[] =
        !          1413:   ".timer ON|OFF          Turn the CPU timer measurement on or off\n"
        !          1414: ;
        !          1415: 
        !          1416: /* Forward reference */
        !          1417: static int process_input(struct callback_data *p, FILE *in);
        !          1418: 
        !          1419: /*
        !          1420: ** Make sure the database is open.  If it is not, then open it.  If
        !          1421: ** the database fails to open, print an error message and exit.
        !          1422: */
        !          1423: static void open_db(struct callback_data *p){
        !          1424:   if( p->db==0 ){
        !          1425:     sqlite3_open(p->zDbFilename, &p->db);
        !          1426:     db = p->db;
        !          1427:     if( db && sqlite3_errcode(db)==SQLITE_OK ){
        !          1428:       sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
        !          1429:           shellstaticFunc, 0, 0);
        !          1430:     }
        !          1431:     if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
        !          1432:       fprintf(stderr,"Error: unable to open database \"%s\": %s\n", 
        !          1433:           p->zDbFilename, sqlite3_errmsg(db));
        !          1434:       exit(1);
        !          1435:     }
        !          1436: #ifndef SQLITE_OMIT_LOAD_EXTENSION
        !          1437:     sqlite3_enable_load_extension(p->db, 1);
        !          1438: #endif
        !          1439:   }
        !          1440: }
        !          1441: 
        !          1442: /*
        !          1443: ** Do C-language style dequoting.
        !          1444: **
        !          1445: **    \t    -> tab
        !          1446: **    \n    -> newline
        !          1447: **    \r    -> carriage return
        !          1448: **    \NNN  -> ascii character NNN in octal
        !          1449: **    \\    -> backslash
        !          1450: */
        !          1451: static void resolve_backslashes(char *z){
        !          1452:   int i, j;
        !          1453:   char c;
        !          1454:   for(i=j=0; (c = z[i])!=0; i++, j++){
        !          1455:     if( c=='\\' ){
        !          1456:       c = z[++i];
        !          1457:       if( c=='n' ){
        !          1458:         c = '\n';
        !          1459:       }else if( c=='t' ){
        !          1460:         c = '\t';
        !          1461:       }else if( c=='r' ){
        !          1462:         c = '\r';
        !          1463:       }else if( c>='0' && c<='7' ){
        !          1464:         c -= '0';
        !          1465:         if( z[i+1]>='0' && z[i+1]<='7' ){
        !          1466:           i++;
        !          1467:           c = (c<<3) + z[i] - '0';
        !          1468:           if( z[i+1]>='0' && z[i+1]<='7' ){
        !          1469:             i++;
        !          1470:             c = (c<<3) + z[i] - '0';
        !          1471:           }
        !          1472:         }
        !          1473:       }
        !          1474:     }
        !          1475:     z[j] = c;
        !          1476:   }
        !          1477:   z[j] = 0;
        !          1478: }
        !          1479: 
        !          1480: /*
        !          1481: ** Interpret zArg as a boolean value.  Return either 0 or 1.
        !          1482: */
        !          1483: static int booleanValue(char *zArg){
        !          1484:   int val = atoi(zArg);
        !          1485:   int j;
        !          1486:   for(j=0; zArg[j]; j++){
        !          1487:     zArg[j] = ToLower(zArg[j]);
        !          1488:   }
        !          1489:   if( strcmp(zArg,"on")==0 ){
        !          1490:     val = 1;
        !          1491:   }else if( strcmp(zArg,"yes")==0 ){
        !          1492:     val = 1;
        !          1493:   }
        !          1494:   return val;
        !          1495: }
        !          1496: 
        !          1497: /*
        !          1498: ** If an input line begins with "." then invoke this routine to
        !          1499: ** process that line.
        !          1500: **
        !          1501: ** Return 1 on error, 2 to exit, and 0 otherwise.
        !          1502: */
        !          1503: static int do_meta_command(char *zLine, struct callback_data *p){
        !          1504:   int i = 1;
        !          1505:   int nArg = 0;
        !          1506:   int n, c;
        !          1507:   int rc = 0;
        !          1508:   char *azArg[50];
        !          1509: 
        !          1510:   /* Parse the input line into tokens.
        !          1511:   */
        !          1512:   while( zLine[i] && nArg<ArraySize(azArg) ){
        !          1513:     while( IsSpace(zLine[i]) ){ i++; }
        !          1514:     if( zLine[i]==0 ) break;
        !          1515:     if( zLine[i]=='\'' || zLine[i]=='"' ){
        !          1516:       int delim = zLine[i++];
        !          1517:       azArg[nArg++] = &zLine[i];
        !          1518:       while( zLine[i] && zLine[i]!=delim ){ i++; }
        !          1519:       if( zLine[i]==delim ){
        !          1520:         zLine[i++] = 0;
        !          1521:       }
        !          1522:       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
        !          1523:     }else{
        !          1524:       azArg[nArg++] = &zLine[i];
        !          1525:       while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
        !          1526:       if( zLine[i] ) zLine[i++] = 0;
        !          1527:       resolve_backslashes(azArg[nArg-1]);
        !          1528:     }
        !          1529:   }
        !          1530: 
        !          1531:   /* Process the input line.
        !          1532:   */
        !          1533:   if( nArg==0 ) return 0; /* no tokens, no error */
        !          1534:   n = strlen30(azArg[0]);
        !          1535:   c = azArg[0][0];
        !          1536:   if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){
        !          1537:     const char *zDestFile;
        !          1538:     const char *zDb;
        !          1539:     sqlite3 *pDest;
        !          1540:     sqlite3_backup *pBackup;
        !          1541:     if( nArg==2 ){
        !          1542:       zDestFile = azArg[1];
        !          1543:       zDb = "main";
        !          1544:     }else{
        !          1545:       zDestFile = azArg[2];
        !          1546:       zDb = azArg[1];
        !          1547:     }
        !          1548:     rc = sqlite3_open(zDestFile, &pDest);
        !          1549:     if( rc!=SQLITE_OK ){
        !          1550:       fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
        !          1551:       sqlite3_close(pDest);
        !          1552:       return 1;
        !          1553:     }
        !          1554:     open_db(p);
        !          1555:     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
        !          1556:     if( pBackup==0 ){
        !          1557:       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
        !          1558:       sqlite3_close(pDest);
        !          1559:       return 1;
        !          1560:     }
        !          1561:     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
        !          1562:     sqlite3_backup_finish(pBackup);
        !          1563:     if( rc==SQLITE_DONE ){
        !          1564:       rc = 0;
        !          1565:     }else{
        !          1566:       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
        !          1567:       rc = 1;
        !          1568:     }
        !          1569:     sqlite3_close(pDest);
        !          1570:   }else
        !          1571: 
        !          1572:   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
        !          1573:     bail_on_error = booleanValue(azArg[1]);
        !          1574:   }else
        !          1575: 
        !          1576:   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
        !          1577:     struct callback_data data;
        !          1578:     char *zErrMsg = 0;
        !          1579:     open_db(p);
        !          1580:     memcpy(&data, p, sizeof(data));
        !          1581:     data.showHeader = 1;
        !          1582:     data.mode = MODE_Column;
        !          1583:     data.colWidth[0] = 3;
        !          1584:     data.colWidth[1] = 15;
        !          1585:     data.colWidth[2] = 58;
        !          1586:     data.cnt = 0;
        !          1587:     sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
        !          1588:     if( zErrMsg ){
        !          1589:       fprintf(stderr,"Error: %s\n", zErrMsg);
        !          1590:       sqlite3_free(zErrMsg);
        !          1591:       rc = 1;
        !          1592:     }
        !          1593:   }else
        !          1594: 
        !          1595:   if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
        !          1596:     open_db(p);
        !          1597:     /* When playing back a "dump", the content might appear in an order
        !          1598:     ** which causes immediate foreign key constraints to be violated.
        !          1599:     ** So disable foreign-key constraint enforcement to prevent problems. */
        !          1600:     fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
        !          1601:     fprintf(p->out, "BEGIN TRANSACTION;\n");
        !          1602:     p->writableSchema = 0;
        !          1603:     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
        !          1604:     p->nErr = 0;
        !          1605:     if( nArg==1 ){
        !          1606:       run_schema_dump_query(p, 
        !          1607:         "SELECT name, type, sql FROM sqlite_master "
        !          1608:         "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
        !          1609:       );
        !          1610:       run_schema_dump_query(p, 
        !          1611:         "SELECT name, type, sql FROM sqlite_master "
        !          1612:         "WHERE name=='sqlite_sequence'"
        !          1613:       );
        !          1614:       run_table_dump_query(p,
        !          1615:         "SELECT sql FROM sqlite_master "
        !          1616:         "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
        !          1617:       );
        !          1618:     }else{
        !          1619:       int i;
        !          1620:       for(i=1; i<nArg; i++){
        !          1621:         zShellStatic = azArg[i];
        !          1622:         run_schema_dump_query(p,
        !          1623:           "SELECT name, type, sql FROM sqlite_master "
        !          1624:           "WHERE tbl_name LIKE shellstatic() AND type=='table'"
        !          1625:           "  AND sql NOT NULL");
        !          1626:         run_table_dump_query(p,
        !          1627:           "SELECT sql FROM sqlite_master "
        !          1628:           "WHERE sql NOT NULL"
        !          1629:           "  AND type IN ('index','trigger','view')"
        !          1630:           "  AND tbl_name LIKE shellstatic()", 0
        !          1631:         );
        !          1632:         zShellStatic = 0;
        !          1633:       }
        !          1634:     }
        !          1635:     if( p->writableSchema ){
        !          1636:       fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
        !          1637:       p->writableSchema = 0;
        !          1638:     }
        !          1639:     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
        !          1640:     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
        !          1641:     fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
        !          1642:   }else
        !          1643: 
        !          1644:   if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
        !          1645:     p->echoOn = booleanValue(azArg[1]);
        !          1646:   }else
        !          1647: 
        !          1648:   if( c=='e' && strncmp(azArg[0], "exit", n)==0  && nArg==1 ){
        !          1649:     rc = 2;
        !          1650:   }else
        !          1651: 
        !          1652:   if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
        !          1653:     int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
        !          1654:     if(val == 1) {
        !          1655:       if(!p->explainPrev.valid) {
        !          1656:         p->explainPrev.valid = 1;
        !          1657:         p->explainPrev.mode = p->mode;
        !          1658:         p->explainPrev.showHeader = p->showHeader;
        !          1659:         memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
        !          1660:       }
        !          1661:       /* We could put this code under the !p->explainValid
        !          1662:       ** condition so that it does not execute if we are already in
        !          1663:       ** explain mode. However, always executing it allows us an easy
        !          1664:       ** was to reset to explain mode in case the user previously
        !          1665:       ** did an .explain followed by a .width, .mode or .header
        !          1666:       ** command.
        !          1667:       */
        !          1668:       p->mode = MODE_Explain;
        !          1669:       p->showHeader = 1;
        !          1670:       memset(p->colWidth,0,ArraySize(p->colWidth));
        !          1671:       p->colWidth[0] = 4;                  /* addr */
        !          1672:       p->colWidth[1] = 13;                 /* opcode */
        !          1673:       p->colWidth[2] = 4;                  /* P1 */
        !          1674:       p->colWidth[3] = 4;                  /* P2 */
        !          1675:       p->colWidth[4] = 4;                  /* P3 */
        !          1676:       p->colWidth[5] = 13;                 /* P4 */
        !          1677:       p->colWidth[6] = 2;                  /* P5 */
        !          1678:       p->colWidth[7] = 13;                  /* Comment */
        !          1679:     }else if (p->explainPrev.valid) {
        !          1680:       p->explainPrev.valid = 0;
        !          1681:       p->mode = p->explainPrev.mode;
        !          1682:       p->showHeader = p->explainPrev.showHeader;
        !          1683:       memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
        !          1684:     }
        !          1685:   }else
        !          1686: 
        !          1687:   if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
        !          1688:                  strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
        !          1689:     p->showHeader = booleanValue(azArg[1]);
        !          1690:   }else
        !          1691: 
        !          1692:   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
        !          1693:     fprintf(stderr,"%s",zHelp);
        !          1694:     if( HAS_TIMER ){
        !          1695:       fprintf(stderr,"%s",zTimerHelp);
        !          1696:     }
        !          1697:   }else
        !          1698: 
        !          1699:   if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
        !          1700:     char *zTable = azArg[2];    /* Insert data into this table */
        !          1701:     char *zFile = azArg[1];     /* The file from which to extract data */
        !          1702:     sqlite3_stmt *pStmt = NULL; /* A statement */
        !          1703:     int nCol;                   /* Number of columns in the table */
        !          1704:     int nByte;                  /* Number of bytes in an SQL string */
        !          1705:     int i, j;                   /* Loop counters */
        !          1706:     int nSep;                   /* Number of bytes in p->separator[] */
        !          1707:     char *zSql;                 /* An SQL statement */
        !          1708:     char *zLine;                /* A single line of input from the file */
        !          1709:     char **azCol;               /* zLine[] broken up into columns */
        !          1710:     char *zCommit;              /* How to commit changes */   
        !          1711:     FILE *in;                   /* The input file */
        !          1712:     int lineno = 0;             /* Line number of input file */
        !          1713: 
        !          1714:     open_db(p);
        !          1715:     nSep = strlen30(p->separator);
        !          1716:     if( nSep==0 ){
        !          1717:       fprintf(stderr, "Error: non-null separator required for import\n");
        !          1718:       return 1;
        !          1719:     }
        !          1720:     zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
        !          1721:     if( zSql==0 ){
        !          1722:       fprintf(stderr, "Error: out of memory\n");
        !          1723:       return 1;
        !          1724:     }
        !          1725:     nByte = strlen30(zSql);
        !          1726:     rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
        !          1727:     sqlite3_free(zSql);
        !          1728:     if( rc ){
        !          1729:       if (pStmt) sqlite3_finalize(pStmt);
        !          1730:       fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
        !          1731:       return 1;
        !          1732:     }
        !          1733:     nCol = sqlite3_column_count(pStmt);
        !          1734:     sqlite3_finalize(pStmt);
        !          1735:     pStmt = 0;
        !          1736:     if( nCol==0 ) return 0; /* no columns, no error */
        !          1737:     zSql = malloc( nByte + 20 + nCol*2 );
        !          1738:     if( zSql==0 ){
        !          1739:       fprintf(stderr, "Error: out of memory\n");
        !          1740:       return 1;
        !          1741:     }
        !          1742:     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zTable);
        !          1743:     j = strlen30(zSql);
        !          1744:     for(i=1; i<nCol; i++){
        !          1745:       zSql[j++] = ',';
        !          1746:       zSql[j++] = '?';
        !          1747:     }
        !          1748:     zSql[j++] = ')';
        !          1749:     zSql[j] = 0;
        !          1750:     rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
        !          1751:     free(zSql);
        !          1752:     if( rc ){
        !          1753:       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
        !          1754:       if (pStmt) sqlite3_finalize(pStmt);
        !          1755:       return 1;
        !          1756:     }
        !          1757:     in = fopen(zFile, "rb");
        !          1758:     if( in==0 ){
        !          1759:       fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
        !          1760:       sqlite3_finalize(pStmt);
        !          1761:       return 1;
        !          1762:     }
        !          1763:     azCol = malloc( sizeof(azCol[0])*(nCol+1) );
        !          1764:     if( azCol==0 ){
        !          1765:       fprintf(stderr, "Error: out of memory\n");
        !          1766:       fclose(in);
        !          1767:       sqlite3_finalize(pStmt);
        !          1768:       return 1;
        !          1769:     }
        !          1770:     sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
        !          1771:     zCommit = "COMMIT";
        !          1772:     while( (zLine = local_getline(0, in))!=0 ){
        !          1773:       char *z;
        !          1774:       lineno++;
        !          1775:       azCol[0] = zLine;
        !          1776:       for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
        !          1777:         if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
        !          1778:           *z = 0;
        !          1779:           i++;
        !          1780:           if( i<nCol ){
        !          1781:             azCol[i] = &z[nSep];
        !          1782:             z += nSep-1;
        !          1783:           }
        !          1784:         }
        !          1785:       } /* end for */
        !          1786:       *z = 0;
        !          1787:       if( i+1!=nCol ){
        !          1788:         fprintf(stderr,
        !          1789:                 "Error: %s line %d: expected %d columns of data but found %d\n",
        !          1790:                 zFile, lineno, nCol, i+1);
        !          1791:         zCommit = "ROLLBACK";
        !          1792:         free(zLine);
        !          1793:         rc = 1;
        !          1794:         break; /* from while */
        !          1795:       }
        !          1796:       for(i=0; i<nCol; i++){
        !          1797:         sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
        !          1798:       }
        !          1799:       sqlite3_step(pStmt);
        !          1800:       rc = sqlite3_reset(pStmt);
        !          1801:       free(zLine);
        !          1802:       if( rc!=SQLITE_OK ){
        !          1803:         fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
        !          1804:         zCommit = "ROLLBACK";
        !          1805:         rc = 1;
        !          1806:         break; /* from while */
        !          1807:       }
        !          1808:     } /* end while */
        !          1809:     free(azCol);
        !          1810:     fclose(in);
        !          1811:     sqlite3_finalize(pStmt);
        !          1812:     sqlite3_exec(p->db, zCommit, 0, 0, 0);
        !          1813:   }else
        !          1814: 
        !          1815:   if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
        !          1816:     struct callback_data data;
        !          1817:     char *zErrMsg = 0;
        !          1818:     open_db(p);
        !          1819:     memcpy(&data, p, sizeof(data));
        !          1820:     data.showHeader = 0;
        !          1821:     data.mode = MODE_List;
        !          1822:     if( nArg==1 ){
        !          1823:       rc = sqlite3_exec(p->db,
        !          1824:         "SELECT name FROM sqlite_master "
        !          1825:         "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
        !          1826:         "UNION ALL "
        !          1827:         "SELECT name FROM sqlite_temp_master "
        !          1828:         "WHERE type='index' "
        !          1829:         "ORDER BY 1",
        !          1830:         callback, &data, &zErrMsg
        !          1831:       );
        !          1832:     }else{
        !          1833:       zShellStatic = azArg[1];
        !          1834:       rc = sqlite3_exec(p->db,
        !          1835:         "SELECT name FROM sqlite_master "
        !          1836:         "WHERE type='index' AND tbl_name LIKE shellstatic() "
        !          1837:         "UNION ALL "
        !          1838:         "SELECT name FROM sqlite_temp_master "
        !          1839:         "WHERE type='index' AND tbl_name LIKE shellstatic() "
        !          1840:         "ORDER BY 1",
        !          1841:         callback, &data, &zErrMsg
        !          1842:       );
        !          1843:       zShellStatic = 0;
        !          1844:     }
        !          1845:     if( zErrMsg ){
        !          1846:       fprintf(stderr,"Error: %s\n", zErrMsg);
        !          1847:       sqlite3_free(zErrMsg);
        !          1848:       rc = 1;
        !          1849:     }else if( rc != SQLITE_OK ){
        !          1850:       fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
        !          1851:       rc = 1;
        !          1852:     }
        !          1853:   }else
        !          1854: 
        !          1855: #ifdef SQLITE_ENABLE_IOTRACE
        !          1856:   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
        !          1857:     extern void (*sqlite3IoTrace)(const char*, ...);
        !          1858:     if( iotrace && iotrace!=stdout ) fclose(iotrace);
        !          1859:     iotrace = 0;
        !          1860:     if( nArg<2 ){
        !          1861:       sqlite3IoTrace = 0;
        !          1862:     }else if( strcmp(azArg[1], "-")==0 ){
        !          1863:       sqlite3IoTrace = iotracePrintf;
        !          1864:       iotrace = stdout;
        !          1865:     }else{
        !          1866:       iotrace = fopen(azArg[1], "w");
        !          1867:       if( iotrace==0 ){
        !          1868:         fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
        !          1869:         sqlite3IoTrace = 0;
        !          1870:         rc = 1;
        !          1871:       }else{
        !          1872:         sqlite3IoTrace = iotracePrintf;
        !          1873:       }
        !          1874:     }
        !          1875:   }else
        !          1876: #endif
        !          1877: 
        !          1878: #ifndef SQLITE_OMIT_LOAD_EXTENSION
        !          1879:   if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
        !          1880:     const char *zFile, *zProc;
        !          1881:     char *zErrMsg = 0;
        !          1882:     zFile = azArg[1];
        !          1883:     zProc = nArg>=3 ? azArg[2] : 0;
        !          1884:     open_db(p);
        !          1885:     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
        !          1886:     if( rc!=SQLITE_OK ){
        !          1887:       fprintf(stderr, "Error: %s\n", zErrMsg);
        !          1888:       sqlite3_free(zErrMsg);
        !          1889:       rc = 1;
        !          1890:     }
        !          1891:   }else
        !          1892: #endif
        !          1893: 
        !          1894:   if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
        !          1895:     const char *zFile = azArg[1];
        !          1896:     if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){
        !          1897:       fclose(p->pLog);
        !          1898:       p->pLog = 0;
        !          1899:     }
        !          1900:     if( strcmp(zFile,"stdout")==0 ){
        !          1901:       p->pLog = stdout;
        !          1902:     }else if( strcmp(zFile, "stderr")==0 ){
        !          1903:       p->pLog = stderr;
        !          1904:     }else if( strcmp(zFile, "off")==0 ){
        !          1905:       p->pLog = 0;
        !          1906:     }else{
        !          1907:       p->pLog = fopen(zFile, "w");
        !          1908:       if( p->pLog==0 ){
        !          1909:         fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
        !          1910:       }
        !          1911:     }
        !          1912:   }else
        !          1913: 
        !          1914:   if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
        !          1915:     int n2 = strlen30(azArg[1]);
        !          1916:     if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
        !          1917:         ||
        !          1918:         (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
        !          1919:       p->mode = MODE_Line;
        !          1920:     }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
        !          1921:               ||
        !          1922:               (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
        !          1923:       p->mode = MODE_Column;
        !          1924:     }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
        !          1925:       p->mode = MODE_List;
        !          1926:     }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
        !          1927:       p->mode = MODE_Html;
        !          1928:     }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
        !          1929:       p->mode = MODE_Tcl;
        !          1930:     }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
        !          1931:       p->mode = MODE_Csv;
        !          1932:       sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
        !          1933:     }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
        !          1934:       p->mode = MODE_List;
        !          1935:       sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
        !          1936:     }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
        !          1937:       p->mode = MODE_Insert;
        !          1938:       set_table_name(p, "table");
        !          1939:     }else {
        !          1940:       fprintf(stderr,"Error: mode should be one of: "
        !          1941:          "column csv html insert line list tabs tcl\n");
        !          1942:       rc = 1;
        !          1943:     }
        !          1944:   }else
        !          1945: 
        !          1946:   if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
        !          1947:     int n2 = strlen30(azArg[1]);
        !          1948:     if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
        !          1949:       p->mode = MODE_Insert;
        !          1950:       set_table_name(p, azArg[2]);
        !          1951:     }else {
        !          1952:       fprintf(stderr, "Error: invalid arguments: "
        !          1953:         " \"%s\". Enter \".help\" for help\n", azArg[2]);
        !          1954:       rc = 1;
        !          1955:     }
        !          1956:   }else
        !          1957: 
        !          1958:   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
        !          1959:     sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
        !          1960:                      "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
        !          1961:   }else
        !          1962: 
        !          1963:   if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
        !          1964:     if( p->out!=stdout ){
        !          1965:       fclose(p->out);
        !          1966:     }
        !          1967:     if( strcmp(azArg[1],"stdout")==0 ){
        !          1968:       p->out = stdout;
        !          1969:       sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
        !          1970:     }else{
        !          1971:       p->out = fopen(azArg[1], "wb");
        !          1972:       if( p->out==0 ){
        !          1973:         fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
        !          1974:         p->out = stdout;
        !          1975:         rc = 1;
        !          1976:       } else {
        !          1977:          sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
        !          1978:       }
        !          1979:     }
        !          1980:   }else
        !          1981: 
        !          1982:   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
        !          1983:     if( nArg >= 2) {
        !          1984:       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
        !          1985:     }
        !          1986:     if( nArg >= 3) {
        !          1987:       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
        !          1988:     }
        !          1989:   }else
        !          1990: 
        !          1991:   if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
        !          1992:     rc = 2;
        !          1993:   }else
        !          1994: 
        !          1995:   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
        !          1996:     FILE *alt = fopen(azArg[1], "rb");
        !          1997:     if( alt==0 ){
        !          1998:       fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
        !          1999:       rc = 1;
        !          2000:     }else{
        !          2001:       rc = process_input(p, alt);
        !          2002:       fclose(alt);
        !          2003:     }
        !          2004:   }else
        !          2005: 
        !          2006:   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
        !          2007:     const char *zSrcFile;
        !          2008:     const char *zDb;
        !          2009:     sqlite3 *pSrc;
        !          2010:     sqlite3_backup *pBackup;
        !          2011:     int nTimeout = 0;
        !          2012: 
        !          2013:     if( nArg==2 ){
        !          2014:       zSrcFile = azArg[1];
        !          2015:       zDb = "main";
        !          2016:     }else{
        !          2017:       zSrcFile = azArg[2];
        !          2018:       zDb = azArg[1];
        !          2019:     }
        !          2020:     rc = sqlite3_open(zSrcFile, &pSrc);
        !          2021:     if( rc!=SQLITE_OK ){
        !          2022:       fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
        !          2023:       sqlite3_close(pSrc);
        !          2024:       return 1;
        !          2025:     }
        !          2026:     open_db(p);
        !          2027:     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
        !          2028:     if( pBackup==0 ){
        !          2029:       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
        !          2030:       sqlite3_close(pSrc);
        !          2031:       return 1;
        !          2032:     }
        !          2033:     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
        !          2034:           || rc==SQLITE_BUSY  ){
        !          2035:       if( rc==SQLITE_BUSY ){
        !          2036:         if( nTimeout++ >= 3 ) break;
        !          2037:         sqlite3_sleep(100);
        !          2038:       }
        !          2039:     }
        !          2040:     sqlite3_backup_finish(pBackup);
        !          2041:     if( rc==SQLITE_DONE ){
        !          2042:       rc = 0;
        !          2043:     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
        !          2044:       fprintf(stderr, "Error: source database is busy\n");
        !          2045:       rc = 1;
        !          2046:     }else{
        !          2047:       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
        !          2048:       rc = 1;
        !          2049:     }
        !          2050:     sqlite3_close(pSrc);
        !          2051:   }else
        !          2052: 
        !          2053:   if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
        !          2054:     struct callback_data data;
        !          2055:     char *zErrMsg = 0;
        !          2056:     open_db(p);
        !          2057:     memcpy(&data, p, sizeof(data));
        !          2058:     data.showHeader = 0;
        !          2059:     data.mode = MODE_Semi;
        !          2060:     if( nArg>1 ){
        !          2061:       int i;
        !          2062:       for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
        !          2063:       if( strcmp(azArg[1],"sqlite_master")==0 ){
        !          2064:         char *new_argv[2], *new_colv[2];
        !          2065:         new_argv[0] = "CREATE TABLE sqlite_master (\n"
        !          2066:                       "  type text,\n"
        !          2067:                       "  name text,\n"
        !          2068:                       "  tbl_name text,\n"
        !          2069:                       "  rootpage integer,\n"
        !          2070:                       "  sql text\n"
        !          2071:                       ")";
        !          2072:         new_argv[1] = 0;
        !          2073:         new_colv[0] = "sql";
        !          2074:         new_colv[1] = 0;
        !          2075:         callback(&data, 1, new_argv, new_colv);
        !          2076:         rc = SQLITE_OK;
        !          2077:       }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
        !          2078:         char *new_argv[2], *new_colv[2];
        !          2079:         new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
        !          2080:                       "  type text,\n"
        !          2081:                       "  name text,\n"
        !          2082:                       "  tbl_name text,\n"
        !          2083:                       "  rootpage integer,\n"
        !          2084:                       "  sql text\n"
        !          2085:                       ")";
        !          2086:         new_argv[1] = 0;
        !          2087:         new_colv[0] = "sql";
        !          2088:         new_colv[1] = 0;
        !          2089:         callback(&data, 1, new_argv, new_colv);
        !          2090:         rc = SQLITE_OK;
        !          2091:       }else{
        !          2092:         zShellStatic = azArg[1];
        !          2093:         rc = sqlite3_exec(p->db,
        !          2094:           "SELECT sql FROM "
        !          2095:           "  (SELECT sql sql, type type, tbl_name tbl_name, name name"
        !          2096:           "     FROM sqlite_master UNION ALL"
        !          2097:           "   SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
        !          2098:           "WHERE lower(tbl_name) LIKE shellstatic()"
        !          2099:           "  AND type!='meta' AND sql NOTNULL "
        !          2100:           "ORDER BY substr(type,2,1), name",
        !          2101:           callback, &data, &zErrMsg);
        !          2102:         zShellStatic = 0;
        !          2103:       }
        !          2104:     }else{
        !          2105:       rc = sqlite3_exec(p->db,
        !          2106:          "SELECT sql FROM "
        !          2107:          "  (SELECT sql sql, type type, tbl_name tbl_name, name name"
        !          2108:          "     FROM sqlite_master UNION ALL"
        !          2109:          "   SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
        !          2110:          "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
        !          2111:          "ORDER BY substr(type,2,1), name",
        !          2112:          callback, &data, &zErrMsg
        !          2113:       );
        !          2114:     }
        !          2115:     if( zErrMsg ){
        !          2116:       fprintf(stderr,"Error: %s\n", zErrMsg);
        !          2117:       sqlite3_free(zErrMsg);
        !          2118:       rc = 1;
        !          2119:     }else if( rc != SQLITE_OK ){
        !          2120:       fprintf(stderr,"Error: querying schema information\n");
        !          2121:       rc = 1;
        !          2122:     }else{
        !          2123:       rc = 0;
        !          2124:     }
        !          2125:   }else
        !          2126: 
        !          2127:   if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
        !          2128:     sqlite3_snprintf(sizeof(p->separator), p->separator,
        !          2129:                      "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
        !          2130:   }else
        !          2131: 
        !          2132:   if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
        !          2133:     int i;
        !          2134:     fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
        !          2135:     fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
        !          2136:     fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
        !          2137:     fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
        !          2138:     fprintf(p->out,"%9.9s: ", "nullvalue");
        !          2139:       output_c_string(p->out, p->nullvalue);
        !          2140:       fprintf(p->out, "\n");
        !          2141:     fprintf(p->out,"%9.9s: %s\n","output",
        !          2142:             strlen30(p->outfile) ? p->outfile : "stdout");
        !          2143:     fprintf(p->out,"%9.9s: ", "separator");
        !          2144:       output_c_string(p->out, p->separator);
        !          2145:       fprintf(p->out, "\n");
        !          2146:     fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
        !          2147:     fprintf(p->out,"%9.9s: ","width");
        !          2148:     for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
        !          2149:       fprintf(p->out,"%d ",p->colWidth[i]);
        !          2150:     }
        !          2151:     fprintf(p->out,"\n");
        !          2152:   }else
        !          2153: 
        !          2154:   if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
        !          2155:     p->statsOn = booleanValue(azArg[1]);
        !          2156:   }else
        !          2157: 
        !          2158:   if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
        !          2159:     char **azResult;
        !          2160:     int nRow;
        !          2161:     char *zErrMsg;
        !          2162:     open_db(p);
        !          2163:     if( nArg==1 ){
        !          2164:       rc = sqlite3_get_table(p->db,
        !          2165:         "SELECT name FROM sqlite_master "
        !          2166:         "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' "
        !          2167:         "UNION ALL "
        !          2168:         "SELECT name FROM sqlite_temp_master "
        !          2169:         "WHERE type IN ('table','view') "
        !          2170:         "ORDER BY 1",
        !          2171:         &azResult, &nRow, 0, &zErrMsg
        !          2172:       );
        !          2173:     }else{
        !          2174:       zShellStatic = azArg[1];
        !          2175:       rc = sqlite3_get_table(p->db,
        !          2176:         "SELECT name FROM sqlite_master "
        !          2177:         "WHERE type IN ('table','view') AND name LIKE shellstatic() "
        !          2178:         "UNION ALL "
        !          2179:         "SELECT name FROM sqlite_temp_master "
        !          2180:         "WHERE type IN ('table','view') AND name LIKE shellstatic() "
        !          2181:         "ORDER BY 1",
        !          2182:         &azResult, &nRow, 0, &zErrMsg
        !          2183:       );
        !          2184:       zShellStatic = 0;
        !          2185:     }
        !          2186:     if( zErrMsg ){
        !          2187:       fprintf(stderr,"Error: %s\n", zErrMsg);
        !          2188:       sqlite3_free(zErrMsg);
        !          2189:       rc = 1;
        !          2190:     }else if( rc != SQLITE_OK ){
        !          2191:       fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
        !          2192:       rc = 1;
        !          2193:     }else{
        !          2194:       int len, maxlen = 0;
        !          2195:       int i, j;
        !          2196:       int nPrintCol, nPrintRow;
        !          2197:       for(i=1; i<=nRow; i++){
        !          2198:         if( azResult[i]==0 ) continue;
        !          2199:         len = strlen30(azResult[i]);
        !          2200:         if( len>maxlen ) maxlen = len;
        !          2201:       }
        !          2202:       nPrintCol = 80/(maxlen+2);
        !          2203:       if( nPrintCol<1 ) nPrintCol = 1;
        !          2204:       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
        !          2205:       for(i=0; i<nPrintRow; i++){
        !          2206:         for(j=i+1; j<=nRow; j+=nPrintRow){
        !          2207:           char *zSp = j<=nPrintRow ? "" : "  ";
        !          2208:           printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
        !          2209:         }
        !          2210:         printf("\n");
        !          2211:       }
        !          2212:     }
        !          2213:     sqlite3_free_table(azResult);
        !          2214:   }else
        !          2215: 
        !          2216:   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
        !          2217:     static const struct {
        !          2218:        const char *zCtrlName;   /* Name of a test-control option */
        !          2219:        int ctrlCode;            /* Integer code for that option */
        !          2220:     } aCtrl[] = {
        !          2221:       { "prng_save",             SQLITE_TESTCTRL_PRNG_SAVE              },
        !          2222:       { "prng_restore",          SQLITE_TESTCTRL_PRNG_RESTORE           },
        !          2223:       { "prng_reset",            SQLITE_TESTCTRL_PRNG_RESET             },
        !          2224:       { "bitvec_test",           SQLITE_TESTCTRL_BITVEC_TEST            },
        !          2225:       { "fault_install",         SQLITE_TESTCTRL_FAULT_INSTALL          },
        !          2226:       { "benign_malloc_hooks",   SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS    },
        !          2227:       { "pending_byte",          SQLITE_TESTCTRL_PENDING_BYTE           },
        !          2228:       { "assert",                SQLITE_TESTCTRL_ASSERT                 },
        !          2229:       { "always",                SQLITE_TESTCTRL_ALWAYS                 },
        !          2230:       { "reserve",               SQLITE_TESTCTRL_RESERVE                },
        !          2231:       { "optimizations",         SQLITE_TESTCTRL_OPTIMIZATIONS          },
        !          2232:       { "iskeyword",             SQLITE_TESTCTRL_ISKEYWORD              },
        !          2233:       { "scratchmalloc",         SQLITE_TESTCTRL_SCRATCHMALLOC          },
        !          2234:     };
        !          2235:     int testctrl = -1;
        !          2236:     int rc = 0;
        !          2237:     int i, n;
        !          2238:     open_db(p);
        !          2239: 
        !          2240:     /* convert testctrl text option to value. allow any unique prefix
        !          2241:     ** of the option name, or a numerical value. */
        !          2242:     n = strlen30(azArg[1]);
        !          2243:     for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
        !          2244:       if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
        !          2245:         if( testctrl<0 ){
        !          2246:           testctrl = aCtrl[i].ctrlCode;
        !          2247:         }else{
        !          2248:           fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
        !          2249:           testctrl = -1;
        !          2250:           break;
        !          2251:         }
        !          2252:       }
        !          2253:     }
        !          2254:     if( testctrl<0 ) testctrl = atoi(azArg[1]);
        !          2255:     if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
        !          2256:       fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
        !          2257:     }else{
        !          2258:       switch(testctrl){
        !          2259: 
        !          2260:         /* sqlite3_test_control(int, db, int) */
        !          2261:         case SQLITE_TESTCTRL_OPTIMIZATIONS:
        !          2262:         case SQLITE_TESTCTRL_RESERVE:             
        !          2263:           if( nArg==3 ){
        !          2264:             int opt = (int)strtol(azArg[2], 0, 0);        
        !          2265:             rc = sqlite3_test_control(testctrl, p->db, opt);
        !          2266:             printf("%d (0x%08x)\n", rc, rc);
        !          2267:           } else {
        !          2268:             fprintf(stderr,"Error: testctrl %s takes a single int option\n",
        !          2269:                     azArg[1]);
        !          2270:           }
        !          2271:           break;
        !          2272: 
        !          2273:         /* sqlite3_test_control(int) */
        !          2274:         case SQLITE_TESTCTRL_PRNG_SAVE:           
        !          2275:         case SQLITE_TESTCTRL_PRNG_RESTORE:        
        !          2276:         case SQLITE_TESTCTRL_PRNG_RESET:
        !          2277:           if( nArg==2 ){
        !          2278:             rc = sqlite3_test_control(testctrl);
        !          2279:             printf("%d (0x%08x)\n", rc, rc);
        !          2280:           } else {
        !          2281:             fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
        !          2282:           }
        !          2283:           break;
        !          2284: 
        !          2285:         /* sqlite3_test_control(int, uint) */
        !          2286:         case SQLITE_TESTCTRL_PENDING_BYTE:        
        !          2287:           if( nArg==3 ){
        !          2288:             unsigned int opt = (unsigned int)atoi(azArg[2]);        
        !          2289:             rc = sqlite3_test_control(testctrl, opt);
        !          2290:             printf("%d (0x%08x)\n", rc, rc);
        !          2291:           } else {
        !          2292:             fprintf(stderr,"Error: testctrl %s takes a single unsigned"
        !          2293:                            " int option\n", azArg[1]);
        !          2294:           }
        !          2295:           break;
        !          2296:           
        !          2297:         /* sqlite3_test_control(int, int) */
        !          2298:         case SQLITE_TESTCTRL_ASSERT:              
        !          2299:         case SQLITE_TESTCTRL_ALWAYS:              
        !          2300:           if( nArg==3 ){
        !          2301:             int opt = atoi(azArg[2]);        
        !          2302:             rc = sqlite3_test_control(testctrl, opt);
        !          2303:             printf("%d (0x%08x)\n", rc, rc);
        !          2304:           } else {
        !          2305:             fprintf(stderr,"Error: testctrl %s takes a single int option\n",
        !          2306:                             azArg[1]);
        !          2307:           }
        !          2308:           break;
        !          2309: 
        !          2310:         /* sqlite3_test_control(int, char *) */
        !          2311: #ifdef SQLITE_N_KEYWORD
        !          2312:         case SQLITE_TESTCTRL_ISKEYWORD:           
        !          2313:           if( nArg==3 ){
        !          2314:             const char *opt = azArg[2];        
        !          2315:             rc = sqlite3_test_control(testctrl, opt);
        !          2316:             printf("%d (0x%08x)\n", rc, rc);
        !          2317:           } else {
        !          2318:             fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
        !          2319:                             azArg[1]);
        !          2320:           }
        !          2321:           break;
        !          2322: #endif
        !          2323: 
        !          2324:         case SQLITE_TESTCTRL_BITVEC_TEST:         
        !          2325:         case SQLITE_TESTCTRL_FAULT_INSTALL:       
        !          2326:         case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: 
        !          2327:         case SQLITE_TESTCTRL_SCRATCHMALLOC:       
        !          2328:         default:
        !          2329:           fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
        !          2330:                   azArg[1]);
        !          2331:           break;
        !          2332:       }
        !          2333:     }
        !          2334:   }else
        !          2335: 
        !          2336:   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
        !          2337:     open_db(p);
        !          2338:     sqlite3_busy_timeout(p->db, atoi(azArg[1]));
        !          2339:   }else
        !          2340:     
        !          2341:   if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
        !          2342:    && nArg==2
        !          2343:   ){
        !          2344:     enableTimer = booleanValue(azArg[1]);
        !          2345:   }else
        !          2346:   
        !          2347:   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
        !          2348:     printf("SQLite %s %s\n" /*extra-version-info*/,
        !          2349:         sqlite3_libversion(), sqlite3_sourceid());
        !          2350:   }else
        !          2351: 
        !          2352:   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
        !          2353:     const char *zDbName = nArg==2 ? azArg[1] : "main";
        !          2354:     char *zVfsName = 0;
        !          2355:     if( p->db ){
        !          2356:       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
        !          2357:       if( zVfsName ){
        !          2358:         printf("%s\n", zVfsName);
        !          2359:         sqlite3_free(zVfsName);
        !          2360:       }
        !          2361:     }
        !          2362:   }else
        !          2363: 
        !          2364:   if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
        !          2365:     int j;
        !          2366:     assert( nArg<=ArraySize(azArg) );
        !          2367:     for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
        !          2368:       p->colWidth[j-1] = atoi(azArg[j]);
        !          2369:     }
        !          2370:   }else
        !          2371: 
        !          2372:   {
        !          2373:     fprintf(stderr, "Error: unknown command or invalid arguments: "
        !          2374:       " \"%s\". Enter \".help\" for help\n", azArg[0]);
        !          2375:     rc = 1;
        !          2376:   }
        !          2377: 
        !          2378:   return rc;
        !          2379: }
        !          2380: 
        !          2381: /*
        !          2382: ** Return TRUE if a semicolon occurs anywhere in the first N characters
        !          2383: ** of string z[].
        !          2384: */
        !          2385: static int _contains_semicolon(const char *z, int N){
        !          2386:   int i;
        !          2387:   for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
        !          2388:   return 0;
        !          2389: }
        !          2390: 
        !          2391: /*
        !          2392: ** Test to see if a line consists entirely of whitespace.
        !          2393: */
        !          2394: static int _all_whitespace(const char *z){
        !          2395:   for(; *z; z++){
        !          2396:     if( IsSpace(z[0]) ) continue;
        !          2397:     if( *z=='/' && z[1]=='*' ){
        !          2398:       z += 2;
        !          2399:       while( *z && (*z!='*' || z[1]!='/') ){ z++; }
        !          2400:       if( *z==0 ) return 0;
        !          2401:       z++;
        !          2402:       continue;
        !          2403:     }
        !          2404:     if( *z=='-' && z[1]=='-' ){
        !          2405:       z += 2;
        !          2406:       while( *z && *z!='\n' ){ z++; }
        !          2407:       if( *z==0 ) return 1;
        !          2408:       continue;
        !          2409:     }
        !          2410:     return 0;
        !          2411:   }
        !          2412:   return 1;
        !          2413: }
        !          2414: 
        !          2415: /*
        !          2416: ** Return TRUE if the line typed in is an SQL command terminator other
        !          2417: ** than a semi-colon.  The SQL Server style "go" command is understood
        !          2418: ** as is the Oracle "/".
        !          2419: */
        !          2420: static int _is_command_terminator(const char *zLine){
        !          2421:   while( IsSpace(zLine[0]) ){ zLine++; };
        !          2422:   if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
        !          2423:     return 1;  /* Oracle */
        !          2424:   }
        !          2425:   if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
        !          2426:          && _all_whitespace(&zLine[2]) ){
        !          2427:     return 1;  /* SQL Server */
        !          2428:   }
        !          2429:   return 0;
        !          2430: }
        !          2431: 
        !          2432: /*
        !          2433: ** Return true if zSql is a complete SQL statement.  Return false if it
        !          2434: ** ends in the middle of a string literal or C-style comment.
        !          2435: */
        !          2436: static int _is_complete(char *zSql, int nSql){
        !          2437:   int rc;
        !          2438:   if( zSql==0 ) return 1;
        !          2439:   zSql[nSql] = ';';
        !          2440:   zSql[nSql+1] = 0;
        !          2441:   rc = sqlite3_complete(zSql);
        !          2442:   zSql[nSql] = 0;
        !          2443:   return rc;
        !          2444: }
        !          2445: 
        !          2446: /*
        !          2447: ** Read input from *in and process it.  If *in==0 then input
        !          2448: ** is interactive - the user is typing it it.  Otherwise, input
        !          2449: ** is coming from a file or device.  A prompt is issued and history
        !          2450: ** is saved only if input is interactive.  An interrupt signal will
        !          2451: ** cause this routine to exit immediately, unless input is interactive.
        !          2452: **
        !          2453: ** Return the number of errors.
        !          2454: */
        !          2455: static int process_input(struct callback_data *p, FILE *in){
        !          2456:   char *zLine = 0;
        !          2457:   char *zSql = 0;
        !          2458:   int nSql = 0;
        !          2459:   int nSqlPrior = 0;
        !          2460:   char *zErrMsg;
        !          2461:   int rc;
        !          2462:   int errCnt = 0;
        !          2463:   int lineno = 0;
        !          2464:   int startline = 0;
        !          2465: 
        !          2466:   while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
        !          2467:     fflush(p->out);
        !          2468:     free(zLine);
        !          2469:     zLine = one_input_line(zSql, in);
        !          2470:     if( zLine==0 ){
        !          2471:       break;  /* We have reached EOF */
        !          2472:     }
        !          2473:     if( seenInterrupt ){
        !          2474:       if( in!=0 ) break;
        !          2475:       seenInterrupt = 0;
        !          2476:     }
        !          2477:     lineno++;
        !          2478:     if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
        !          2479:     if( zLine && zLine[0]=='.' && nSql==0 ){
        !          2480:       if( p->echoOn ) printf("%s\n", zLine);
        !          2481:       rc = do_meta_command(zLine, p);
        !          2482:       if( rc==2 ){ /* exit requested */
        !          2483:         break;
        !          2484:       }else if( rc ){
        !          2485:         errCnt++;
        !          2486:       }
        !          2487:       continue;
        !          2488:     }
        !          2489:     if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){
        !          2490:       memcpy(zLine,";",2);
        !          2491:     }
        !          2492:     nSqlPrior = nSql;
        !          2493:     if( zSql==0 ){
        !          2494:       int i;
        !          2495:       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
        !          2496:       if( zLine[i]!=0 ){
        !          2497:         nSql = strlen30(zLine);
        !          2498:         zSql = malloc( nSql+3 );
        !          2499:         if( zSql==0 ){
        !          2500:           fprintf(stderr, "Error: out of memory\n");
        !          2501:           exit(1);
        !          2502:         }
        !          2503:         memcpy(zSql, zLine, nSql+1);
        !          2504:         startline = lineno;
        !          2505:       }
        !          2506:     }else{
        !          2507:       int len = strlen30(zLine);
        !          2508:       zSql = realloc( zSql, nSql + len + 4 );
        !          2509:       if( zSql==0 ){
        !          2510:         fprintf(stderr,"Error: out of memory\n");
        !          2511:         exit(1);
        !          2512:       }
        !          2513:       zSql[nSql++] = '\n';
        !          2514:       memcpy(&zSql[nSql], zLine, len+1);
        !          2515:       nSql += len;
        !          2516:     }
        !          2517:     if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
        !          2518:                 && sqlite3_complete(zSql) ){
        !          2519:       p->cnt = 0;
        !          2520:       open_db(p);
        !          2521:       BEGIN_TIMER;
        !          2522:       rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
        !          2523:       END_TIMER;
        !          2524:       if( rc || zErrMsg ){
        !          2525:         char zPrefix[100];
        !          2526:         if( in!=0 || !stdin_is_interactive ){
        !          2527:           sqlite3_snprintf(sizeof(zPrefix), zPrefix, 
        !          2528:                            "Error: near line %d:", startline);
        !          2529:         }else{
        !          2530:           sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
        !          2531:         }
        !          2532:         if( zErrMsg!=0 ){
        !          2533:           fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
        !          2534:           sqlite3_free(zErrMsg);
        !          2535:           zErrMsg = 0;
        !          2536:         }else{
        !          2537:           fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
        !          2538:         }
        !          2539:         errCnt++;
        !          2540:       }
        !          2541:       free(zSql);
        !          2542:       zSql = 0;
        !          2543:       nSql = 0;
        !          2544:     }
        !          2545:   }
        !          2546:   if( zSql ){
        !          2547:     if( !_all_whitespace(zSql) ){
        !          2548:       fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
        !          2549:     }
        !          2550:     free(zSql);
        !          2551:   }
        !          2552:   free(zLine);
        !          2553:   return errCnt;
        !          2554: }
        !          2555: 
        !          2556: /*
        !          2557: ** Return a pathname which is the user's home directory.  A
        !          2558: ** 0 return indicates an error of some kind.  Space to hold the
        !          2559: ** resulting string is obtained from malloc().  The calling
        !          2560: ** function should free the result.
        !          2561: */
        !          2562: static char *find_home_dir(void){
        !          2563:   char *home_dir = NULL;
        !          2564: 
        !          2565: #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
        !          2566:   struct passwd *pwent;
        !          2567:   uid_t uid = getuid();
        !          2568:   if( (pwent=getpwuid(uid)) != NULL) {
        !          2569:     home_dir = pwent->pw_dir;
        !          2570:   }
        !          2571: #endif
        !          2572: 
        !          2573: #if defined(_WIN32_WCE)
        !          2574:   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
        !          2575:    */
        !          2576:   home_dir = strdup("/");
        !          2577: #else
        !          2578: 
        !          2579: #if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
        !          2580:   if (!home_dir) {
        !          2581:     home_dir = getenv("USERPROFILE");
        !          2582:   }
        !          2583: #endif
        !          2584: 
        !          2585:   if (!home_dir) {
        !          2586:     home_dir = getenv("HOME");
        !          2587:   }
        !          2588: 
        !          2589: #if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
        !          2590:   if (!home_dir) {
        !          2591:     char *zDrive, *zPath;
        !          2592:     int n;
        !          2593:     zDrive = getenv("HOMEDRIVE");
        !          2594:     zPath = getenv("HOMEPATH");
        !          2595:     if( zDrive && zPath ){
        !          2596:       n = strlen30(zDrive) + strlen30(zPath) + 1;
        !          2597:       home_dir = malloc( n );
        !          2598:       if( home_dir==0 ) return 0;
        !          2599:       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
        !          2600:       return home_dir;
        !          2601:     }
        !          2602:     home_dir = "c:\\";
        !          2603:   }
        !          2604: #endif
        !          2605: 
        !          2606: #endif /* !_WIN32_WCE */
        !          2607: 
        !          2608:   if( home_dir ){
        !          2609:     int n = strlen30(home_dir) + 1;
        !          2610:     char *z = malloc( n );
        !          2611:     if( z ) memcpy(z, home_dir, n);
        !          2612:     home_dir = z;
        !          2613:   }
        !          2614: 
        !          2615:   return home_dir;
        !          2616: }
        !          2617: 
        !          2618: /*
        !          2619: ** Read input from the file given by sqliterc_override.  Or if that
        !          2620: ** parameter is NULL, take input from ~/.sqliterc
        !          2621: **
        !          2622: ** Returns the number of errors.
        !          2623: */
        !          2624: static int process_sqliterc(
        !          2625:   struct callback_data *p,        /* Configuration data */
        !          2626:   const char *sqliterc_override   /* Name of config file. NULL to use default */
        !          2627: ){
        !          2628:   char *home_dir = NULL;
        !          2629:   const char *sqliterc = sqliterc_override;
        !          2630:   char *zBuf = 0;
        !          2631:   FILE *in = NULL;
        !          2632:   int nBuf;
        !          2633:   int rc = 0;
        !          2634: 
        !          2635:   if (sqliterc == NULL) {
        !          2636:     home_dir = find_home_dir();
        !          2637:     if( home_dir==0 ){
        !          2638: #if !defined(__RTP__) && !defined(_WRS_KERNEL)
        !          2639:       fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
        !          2640: #endif
        !          2641:       return 1;
        !          2642:     }
        !          2643:     nBuf = strlen30(home_dir) + 16;
        !          2644:     zBuf = malloc( nBuf );
        !          2645:     if( zBuf==0 ){
        !          2646:       fprintf(stderr,"%s: Error: out of memory\n",Argv0);
        !          2647:       return 1;
        !          2648:     }
        !          2649:     sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
        !          2650:     free(home_dir);
        !          2651:     sqliterc = (const char*)zBuf;
        !          2652:   }
        !          2653:   in = fopen(sqliterc,"rb");
        !          2654:   if( in ){
        !          2655:     if( stdin_is_interactive ){
        !          2656:       fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
        !          2657:     }
        !          2658:     rc = process_input(p,in);
        !          2659:     fclose(in);
        !          2660:   }
        !          2661:   free(zBuf);
        !          2662:   return rc;
        !          2663: }
        !          2664: 
        !          2665: /*
        !          2666: ** Show available command line options
        !          2667: */
        !          2668: static const char zOptions[] = 
        !          2669:   "   -help                show this message\n"
        !          2670:   "   -init filename       read/process named file\n"
        !          2671:   "   -echo                print commands before execution\n"
        !          2672:   "   -[no]header          turn headers on or off\n"
        !          2673:   "   -bail                stop after hitting an error\n"
        !          2674:   "   -interactive         force interactive I/O\n"
        !          2675:   "   -batch               force batch I/O\n"
        !          2676:   "   -column              set output mode to 'column'\n"
        !          2677:   "   -csv                 set output mode to 'csv'\n"
        !          2678:   "   -html                set output mode to HTML\n"
        !          2679:   "   -line                set output mode to 'line'\n"
        !          2680:   "   -list                set output mode to 'list'\n"
        !          2681:   "   -separator 'x'       set output field separator (|)\n"
        !          2682:   "   -stats               print memory stats before each finalize\n"
        !          2683:   "   -nullvalue 'text'    set text string for NULL values\n"
        !          2684:   "   -version             show SQLite version\n"
        !          2685:   "   -vfs NAME            use NAME as the default VFS\n"
        !          2686: #ifdef SQLITE_ENABLE_VFSTRACE
        !          2687:   "   -vfstrace            enable tracing of all VFS calls\n"
        !          2688: #endif
        !          2689: #ifdef SQLITE_ENABLE_MULTIPLEX
        !          2690:   "   -multiplex           enable the multiplexor VFS\n"
        !          2691: #endif
        !          2692: ;
        !          2693: static void usage(int showDetail){
        !          2694:   fprintf(stderr,
        !          2695:       "Usage: %s [OPTIONS] FILENAME [SQL]\n"  
        !          2696:       "FILENAME is the name of an SQLite database. A new database is created\n"
        !          2697:       "if the file does not previously exist.\n", Argv0);
        !          2698:   if( showDetail ){
        !          2699:     fprintf(stderr, "OPTIONS include:\n%s", zOptions);
        !          2700:   }else{
        !          2701:     fprintf(stderr, "Use the -help option for additional information\n");
        !          2702:   }
        !          2703:   exit(1);
        !          2704: }
        !          2705: 
        !          2706: /*
        !          2707: ** Initialize the state information in data
        !          2708: */
        !          2709: static void main_init(struct callback_data *data) {
        !          2710:   memset(data, 0, sizeof(*data));
        !          2711:   data->mode = MODE_List;
        !          2712:   memcpy(data->separator,"|", 2);
        !          2713:   data->showHeader = 0;
        !          2714:   sqlite3_config(SQLITE_CONFIG_URI, 1);
        !          2715:   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
        !          2716:   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
        !          2717:   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
        !          2718:   sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
        !          2719: }
        !          2720: 
        !          2721: int main(int argc, char **argv){
        !          2722:   char *zErrMsg = 0;
        !          2723:   struct callback_data data;
        !          2724:   const char *zInitFile = 0;
        !          2725:   char *zFirstCmd = 0;
        !          2726:   int i;
        !          2727:   int rc = 0;
        !          2728: 
        !          2729:   if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
        !          2730:     fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
        !          2731:             sqlite3_sourceid(), SQLITE_SOURCE_ID);
        !          2732:     exit(1);
        !          2733:   }
        !          2734:   Argv0 = argv[0];
        !          2735:   main_init(&data);
        !          2736:   stdin_is_interactive = isatty(0);
        !          2737: 
        !          2738:   /* Make sure we have a valid signal handler early, before anything
        !          2739:   ** else is done.
        !          2740:   */
        !          2741: #ifdef SIGINT
        !          2742:   signal(SIGINT, interrupt_handler);
        !          2743: #endif
        !          2744: 
        !          2745:   /* Do an initial pass through the command-line argument to locate
        !          2746:   ** the name of the database file, the name of the initialization file,
        !          2747:   ** the size of the alternative malloc heap,
        !          2748:   ** and the first command to execute.
        !          2749:   */
        !          2750:   for(i=1; i<argc-1; i++){
        !          2751:     char *z;
        !          2752:     if( argv[i][0]!='-' ) break;
        !          2753:     z = argv[i];
        !          2754:     if( z[0]=='-' && z[1]=='-' ) z++;
        !          2755:     if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
        !          2756:       i++;
        !          2757:     }else if( strcmp(argv[i],"-init")==0 ){
        !          2758:       i++;
        !          2759:       zInitFile = argv[i];
        !          2760:     /* Need to check for batch mode here to so we can avoid printing
        !          2761:     ** informational messages (like from process_sqliterc) before 
        !          2762:     ** we do the actual processing of arguments later in a second pass.
        !          2763:     */
        !          2764:     }else if( strcmp(argv[i],"-batch")==0 ){
        !          2765:       stdin_is_interactive = 0;
        !          2766:     }else if( strcmp(argv[i],"-heap")==0 ){
        !          2767: #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
        !          2768:       int j, c;
        !          2769:       const char *zSize;
        !          2770:       sqlite3_int64 szHeap;
        !          2771: 
        !          2772:       zSize = argv[++i];
        !          2773:       szHeap = atoi(zSize);
        !          2774:       for(j=0; (c = zSize[j])!=0; j++){
        !          2775:         if( c=='M' ){ szHeap *= 1000000; break; }
        !          2776:         if( c=='K' ){ szHeap *= 1000; break; }
        !          2777:         if( c=='G' ){ szHeap *= 1000000000; break; }
        !          2778:       }
        !          2779:       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
        !          2780:       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
        !          2781: #endif
        !          2782: #ifdef SQLITE_ENABLE_VFSTRACE
        !          2783:     }else if( strcmp(argv[i],"-vfstrace")==0 ){
        !          2784:       extern int vfstrace_register(
        !          2785:          const char *zTraceName,
        !          2786:          const char *zOldVfsName,
        !          2787:          int (*xOut)(const char*,void*),
        !          2788:          void *pOutArg,
        !          2789:          int makeDefault
        !          2790:       );
        !          2791:       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
        !          2792: #endif
        !          2793: #ifdef SQLITE_ENABLE_MULTIPLEX
        !          2794:     }else if( strcmp(argv[i],"-multiplex")==0 ){
        !          2795:       extern int sqlite3_multiple_initialize(const char*,int);
        !          2796:       sqlite3_multiplex_initialize(0, 1);
        !          2797: #endif
        !          2798:     }else if( strcmp(argv[i],"-vfs")==0 ){
        !          2799:       sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]);
        !          2800:       if( pVfs ){
        !          2801:         sqlite3_vfs_register(pVfs, 1);
        !          2802:       }else{
        !          2803:         fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
        !          2804:         exit(1);
        !          2805:       }
        !          2806:     }
        !          2807:   }
        !          2808:   if( i<argc ){
        !          2809: #if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
        !          2810:     data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
        !          2811: #else
        !          2812:     data.zDbFilename = argv[i++];
        !          2813: #endif
        !          2814:   }else{
        !          2815: #ifndef SQLITE_OMIT_MEMORYDB
        !          2816:     data.zDbFilename = ":memory:";
        !          2817: #else
        !          2818:     data.zDbFilename = 0;
        !          2819: #endif
        !          2820:   }
        !          2821:   if( i<argc ){
        !          2822:     zFirstCmd = argv[i++];
        !          2823:   }
        !          2824:   if( i<argc ){
        !          2825:     fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
        !          2826:     fprintf(stderr,"Use -help for a list of options.\n");
        !          2827:     return 1;
        !          2828:   }
        !          2829:   data.out = stdout;
        !          2830: 
        !          2831: #ifdef SQLITE_OMIT_MEMORYDB
        !          2832:   if( data.zDbFilename==0 ){
        !          2833:     fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
        !          2834:     return 1;
        !          2835:   }
        !          2836: #endif
        !          2837: 
        !          2838:   /* Go ahead and open the database file if it already exists.  If the
        !          2839:   ** file does not exist, delay opening it.  This prevents empty database
        !          2840:   ** files from being created if a user mistypes the database name argument
        !          2841:   ** to the sqlite command-line tool.
        !          2842:   */
        !          2843:   if( access(data.zDbFilename, 0)==0 ){
        !          2844:     open_db(&data);
        !          2845:   }
        !          2846: 
        !          2847:   /* Process the initialization file if there is one.  If no -init option
        !          2848:   ** is given on the command line, look for a file named ~/.sqliterc and
        !          2849:   ** try to process it.
        !          2850:   */
        !          2851:   rc = process_sqliterc(&data,zInitFile);
        !          2852:   if( rc>0 ){
        !          2853:     return rc;
        !          2854:   }
        !          2855: 
        !          2856:   /* Make a second pass through the command-line argument and set
        !          2857:   ** options.  This second pass is delayed until after the initialization
        !          2858:   ** file is processed so that the command-line arguments will override
        !          2859:   ** settings in the initialization file.
        !          2860:   */
        !          2861:   for(i=1; i<argc && argv[i][0]=='-'; i++){
        !          2862:     char *z = argv[i];
        !          2863:     if( z[1]=='-' ){ z++; }
        !          2864:     if( strcmp(z,"-init")==0 ){
        !          2865:       i++;
        !          2866:     }else if( strcmp(z,"-html")==0 ){
        !          2867:       data.mode = MODE_Html;
        !          2868:     }else if( strcmp(z,"-list")==0 ){
        !          2869:       data.mode = MODE_List;
        !          2870:     }else if( strcmp(z,"-line")==0 ){
        !          2871:       data.mode = MODE_Line;
        !          2872:     }else if( strcmp(z,"-column")==0 ){
        !          2873:       data.mode = MODE_Column;
        !          2874:     }else if( strcmp(z,"-csv")==0 ){
        !          2875:       data.mode = MODE_Csv;
        !          2876:       memcpy(data.separator,",",2);
        !          2877:     }else if( strcmp(z,"-separator")==0 ){
        !          2878:       i++;
        !          2879:       if(i>=argc){
        !          2880:         fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
        !          2881:         fprintf(stderr,"Use -help for a list of options.\n");
        !          2882:         return 1;
        !          2883:       }
        !          2884:       sqlite3_snprintf(sizeof(data.separator), data.separator,
        !          2885:                        "%.*s",(int)sizeof(data.separator)-1,argv[i]);
        !          2886:     }else if( strcmp(z,"-nullvalue")==0 ){
        !          2887:       i++;
        !          2888:       if(i>=argc){
        !          2889:         fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
        !          2890:         fprintf(stderr,"Use -help for a list of options.\n");
        !          2891:         return 1;
        !          2892:       }
        !          2893:       sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
        !          2894:                        "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
        !          2895:     }else if( strcmp(z,"-header")==0 ){
        !          2896:       data.showHeader = 1;
        !          2897:     }else if( strcmp(z,"-noheader")==0 ){
        !          2898:       data.showHeader = 0;
        !          2899:     }else if( strcmp(z,"-echo")==0 ){
        !          2900:       data.echoOn = 1;
        !          2901:     }else if( strcmp(z,"-stats")==0 ){
        !          2902:       data.statsOn = 1;
        !          2903:     }else if( strcmp(z,"-bail")==0 ){
        !          2904:       bail_on_error = 1;
        !          2905:     }else if( strcmp(z,"-version")==0 ){
        !          2906:       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
        !          2907:       return 0;
        !          2908:     }else if( strcmp(z,"-interactive")==0 ){
        !          2909:       stdin_is_interactive = 1;
        !          2910:     }else if( strcmp(z,"-batch")==0 ){
        !          2911:       stdin_is_interactive = 0;
        !          2912:     }else if( strcmp(z,"-heap")==0 ){
        !          2913:       i++;
        !          2914:     }else if( strcmp(z,"-vfs")==0 ){
        !          2915:       i++;
        !          2916: #ifdef SQLITE_ENABLE_VFSTRACE
        !          2917:     }else if( strcmp(z,"-vfstrace")==0 ){
        !          2918:       i++;
        !          2919: #endif
        !          2920: #ifdef SQLITE_ENABLE_MULTIPLEX
        !          2921:     }else if( strcmp(z,"-multiplex")==0 ){
        !          2922:       i++;
        !          2923: #endif
        !          2924:     }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
        !          2925:       usage(1);
        !          2926:     }else{
        !          2927:       fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
        !          2928:       fprintf(stderr,"Use -help for a list of options.\n");
        !          2929:       return 1;
        !          2930:     }
        !          2931:   }
        !          2932: 
        !          2933:   if( zFirstCmd ){
        !          2934:     /* Run just the command that follows the database name
        !          2935:     */
        !          2936:     if( zFirstCmd[0]=='.' ){
        !          2937:       rc = do_meta_command(zFirstCmd, &data);
        !          2938:     }else{
        !          2939:       open_db(&data);
        !          2940:       rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
        !          2941:       if( zErrMsg!=0 ){
        !          2942:         fprintf(stderr,"Error: %s\n", zErrMsg);
        !          2943:         return rc!=0 ? rc : 1;
        !          2944:       }else if( rc!=0 ){
        !          2945:         fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
        !          2946:         return rc;
        !          2947:       }
        !          2948:     }
        !          2949:   }else{
        !          2950:     /* Run commands received from standard input
        !          2951:     */
        !          2952:     if( stdin_is_interactive ){
        !          2953:       char *zHome;
        !          2954:       char *zHistory = 0;
        !          2955:       int nHistory;
        !          2956:       printf(
        !          2957:         "SQLite version %s %.19s\n" /*extra-version-info*/
        !          2958:         "Enter \".help\" for instructions\n"
        !          2959:         "Enter SQL statements terminated with a \";\"\n",
        !          2960:         sqlite3_libversion(), sqlite3_sourceid()
        !          2961:       );
        !          2962:       zHome = find_home_dir();
        !          2963:       if( zHome ){
        !          2964:         nHistory = strlen30(zHome) + 20;
        !          2965:         if( (zHistory = malloc(nHistory))!=0 ){
        !          2966:           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
        !          2967:         }
        !          2968:       }
        !          2969: #if defined(HAVE_READLINE) && HAVE_READLINE==1
        !          2970:       if( zHistory ) read_history(zHistory);
        !          2971: #endif
        !          2972:       rc = process_input(&data, 0);
        !          2973:       if( zHistory ){
        !          2974:         stifle_history(100);
        !          2975:         write_history(zHistory);
        !          2976:         free(zHistory);
        !          2977:       }
        !          2978:       free(zHome);
        !          2979:     }else{
        !          2980:       rc = process_input(&data, stdin);
        !          2981:     }
        !          2982:   }
        !          2983:   set_table_name(&data, 0);
        !          2984:   if( data.db ){
        !          2985:     sqlite3_close(data.db);
        !          2986:   }
        !          2987:   return rc;
        !          2988: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>