1 /* 2 ** 2001 September 15 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** This file contains code to implement the "sqlite" command line 13 ** utility for accessing SQLite databases. 14 */ 15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) 16 /* This needs to come before any includes for MSVC compiler */ 17 #define _CRT_SECURE_NO_WARNINGS 18 #endif 19 20 /* 21 ** If requested, include the SQLite compiler options file for MSVC. 22 */ 23 #if defined(INCLUDE_MSVC_H) 24 #include "msvc.h" 25 #endif 26 27 /* 28 ** No support for loadable extensions in VxWorks. 29 */ 30 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 31 # define SQLITE_OMIT_LOAD_EXTENSION 1 32 #endif 33 34 /* 35 ** Enable large-file support for fopen() and friends on unix. 36 */ 37 #ifndef SQLITE_DISABLE_LFS 38 # define _LARGE_FILE 1 39 # ifndef _FILE_OFFSET_BITS 40 # define _FILE_OFFSET_BITS 64 41 # endif 42 # define _LARGEFILE_SOURCE 1 43 #endif 44 45 #include <stdlib.h> 46 #include <string.h> 47 #include <stdio.h> 48 #include <assert.h> 49 #include "sqlite3.h" 50 #if SQLITE_USER_AUTHENTICATION 51 # include "sqlite3userauth.h" 52 #endif 53 #include <ctype.h> 54 #include <stdarg.h> 55 56 #if !defined(_WIN32) && !defined(WIN32) 57 # include <signal.h> 58 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 59 # include <pwd.h> 60 # endif 61 # include <unistd.h> 62 # include <sys/types.h> 63 #endif 64 65 #if HAVE_READLINE 66 # include <readline/readline.h> 67 # include <readline/history.h> 68 #endif 69 70 #if HAVE_EDITLINE 71 # include <editline/readline.h> 72 #endif 73 74 #if HAVE_EDITLINE || HAVE_READLINE 75 76 # define shell_add_history(X) add_history(X) 77 # define shell_read_history(X) read_history(X) 78 # define shell_write_history(X) write_history(X) 79 # define shell_stifle_history(X) stifle_history(X) 80 # define shell_readline(X) readline(X) 81 82 #elif HAVE_LINENOISE 83 84 # include "linenoise.h" 85 # define shell_add_history(X) linenoiseHistoryAdd(X) 86 # define shell_read_history(X) linenoiseHistoryLoad(X) 87 # define shell_write_history(X) linenoiseHistorySave(X) 88 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 89 # define shell_readline(X) linenoise(X) 90 91 #else 92 93 # define shell_read_history(X) 94 # define shell_write_history(X) 95 # define shell_stifle_history(X) 96 97 # define SHELL_USE_LOCAL_GETLINE 1 98 #endif 99 100 101 #if defined(_WIN32) || defined(WIN32) 102 # include <io.h> 103 # include <fcntl.h> 104 # define isatty(h) _isatty(h) 105 # ifndef access 106 # define access(f,m) _access((f),(m)) 107 # endif 108 # undef popen 109 # define popen _popen 110 # undef pclose 111 # define pclose _pclose 112 #else 113 /* Make sure isatty() has a prototype. */ 114 extern int isatty(int); 115 116 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 117 /* popen and pclose are not C89 functions and so are 118 ** sometimes omitted from the <stdio.h> header */ 119 extern FILE *popen(const char*,const char*); 120 extern int pclose(FILE*); 121 # else 122 # define SQLITE_OMIT_POPEN 1 123 # endif 124 #endif 125 126 #if defined(_WIN32_WCE) 127 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 128 * thus we always assume that we have a console. That can be 129 * overridden with the -batch command line option. 130 */ 131 #define isatty(x) 1 132 #endif 133 134 /* ctype macros that work with signed characters */ 135 #define IsSpace(X) isspace((unsigned char)X) 136 #define IsDigit(X) isdigit((unsigned char)X) 137 #define ToLower(X) (char)tolower((unsigned char)X) 138 139 #if defined(_WIN32) || defined(WIN32) 140 #include <windows.h> 141 142 /* string conversion routines only needed on Win32 */ 143 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 144 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 145 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 146 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 147 #endif 148 149 /* On Windows, we normally run with output mode of TEXT so that \n characters 150 ** are automatically translated into \r\n. However, this behavior needs 151 ** to be disabled in some cases (ex: when generating CSV output and when 152 ** rendering quoted strings that contain \n characters). The following 153 ** routines take care of that. 154 */ 155 #if defined(_WIN32) || defined(WIN32) 156 static void setBinaryMode(FILE *file, int isOutput){ 157 if( isOutput ) fflush(file); 158 _setmode(_fileno(file), _O_BINARY); 159 } 160 static void setTextMode(FILE *file, int isOutput){ 161 if( isOutput ) fflush(file); 162 _setmode(_fileno(file), _O_TEXT); 163 } 164 #else 165 # define setBinaryMode(X,Y) 166 # define setTextMode(X,Y) 167 #endif 168 169 170 /* True if the timer is enabled */ 171 static int enableTimer = 0; 172 173 /* Return the current wall-clock time */ 174 static sqlite3_int64 timeOfDay(void){ 175 static sqlite3_vfs *clockVfs = 0; 176 sqlite3_int64 t; 177 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 178 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 179 clockVfs->xCurrentTimeInt64(clockVfs, &t); 180 }else{ 181 double r; 182 clockVfs->xCurrentTime(clockVfs, &r); 183 t = (sqlite3_int64)(r*86400000.0); 184 } 185 return t; 186 } 187 188 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 189 #include <sys/time.h> 190 #include <sys/resource.h> 191 192 /* VxWorks does not support getrusage() as far as we can determine */ 193 #if defined(_WRS_KERNEL) || defined(__RTP__) 194 struct rusage { 195 struct timeval ru_utime; /* user CPU time used */ 196 struct timeval ru_stime; /* system CPU time used */ 197 }; 198 #define getrusage(A,B) memset(B,0,sizeof(*B)) 199 #endif 200 201 /* Saved resource information for the beginning of an operation */ 202 static struct rusage sBegin; /* CPU time at start */ 203 static sqlite3_int64 iBegin; /* Wall-clock time at start */ 204 205 /* 206 ** Begin timing an operation 207 */ 208 static void beginTimer(void){ 209 if( enableTimer ){ 210 getrusage(RUSAGE_SELF, &sBegin); 211 iBegin = timeOfDay(); 212 } 213 } 214 215 /* Return the difference of two time_structs in seconds */ 216 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 217 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 218 (double)(pEnd->tv_sec - pStart->tv_sec); 219 } 220 221 /* 222 ** Print the timing results. 223 */ 224 static void endTimer(void){ 225 if( enableTimer ){ 226 sqlite3_int64 iEnd = timeOfDay(); 227 struct rusage sEnd; 228 getrusage(RUSAGE_SELF, &sEnd); 229 printf("Run Time: real %.3f user %f sys %f\n", 230 (iEnd - iBegin)*0.001, 231 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 232 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 233 } 234 } 235 236 #define BEGIN_TIMER beginTimer() 237 #define END_TIMER endTimer() 238 #define HAS_TIMER 1 239 240 #elif (defined(_WIN32) || defined(WIN32)) 241 242 /* Saved resource information for the beginning of an operation */ 243 static HANDLE hProcess; 244 static FILETIME ftKernelBegin; 245 static FILETIME ftUserBegin; 246 static sqlite3_int64 ftWallBegin; 247 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 248 LPFILETIME, LPFILETIME); 249 static GETPROCTIMES getProcessTimesAddr = NULL; 250 251 /* 252 ** Check to see if we have timer support. Return 1 if necessary 253 ** support found (or found previously). 254 */ 255 static int hasTimer(void){ 256 if( getProcessTimesAddr ){ 257 return 1; 258 } else { 259 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 260 ** versions. See if the version we are running on has it, and if it 261 ** does, save off a pointer to it and the current process handle. 262 */ 263 hProcess = GetCurrentProcess(); 264 if( hProcess ){ 265 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 266 if( NULL != hinstLib ){ 267 getProcessTimesAddr = 268 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 269 if( NULL != getProcessTimesAddr ){ 270 return 1; 271 } 272 FreeLibrary(hinstLib); 273 } 274 } 275 } 276 return 0; 277 } 278 279 /* 280 ** Begin timing an operation 281 */ 282 static void beginTimer(void){ 283 if( enableTimer && getProcessTimesAddr ){ 284 FILETIME ftCreation, ftExit; 285 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 286 &ftKernelBegin,&ftUserBegin); 287 ftWallBegin = timeOfDay(); 288 } 289 } 290 291 /* Return the difference of two FILETIME structs in seconds */ 292 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 293 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 294 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 295 return (double) ((i64End - i64Start) / 10000000.0); 296 } 297 298 /* 299 ** Print the timing results. 300 */ 301 static void endTimer(void){ 302 if( enableTimer && getProcessTimesAddr){ 303 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 304 sqlite3_int64 ftWallEnd = timeOfDay(); 305 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 306 printf("Run Time: real %.3f user %f sys %f\n", 307 (ftWallEnd - ftWallBegin)*0.001, 308 timeDiff(&ftUserBegin, &ftUserEnd), 309 timeDiff(&ftKernelBegin, &ftKernelEnd)); 310 } 311 } 312 313 #define BEGIN_TIMER beginTimer() 314 #define END_TIMER endTimer() 315 #define HAS_TIMER hasTimer() 316 317 #else 318 #define BEGIN_TIMER 319 #define END_TIMER 320 #define HAS_TIMER 0 321 #endif 322 323 /* 324 ** Used to prevent warnings about unused parameters 325 */ 326 #define UNUSED_PARAMETER(x) (void)(x) 327 328 /* 329 ** If the following flag is set, then command execution stops 330 ** at an error if we are not interactive. 331 */ 332 static int bail_on_error = 0; 333 334 /* 335 ** Threat stdin as an interactive input if the following variable 336 ** is true. Otherwise, assume stdin is connected to a file or pipe. 337 */ 338 static int stdin_is_interactive = 1; 339 340 /* 341 ** On Windows systems we have to know if standard output is a console 342 ** in order to translate UTF-8 into MBCS. The following variable is 343 ** true if translation is required. 344 */ 345 static int stdout_is_console = 1; 346 347 /* 348 ** The following is the open SQLite database. We make a pointer 349 ** to this database a static variable so that it can be accessed 350 ** by the SIGINT handler to interrupt database processing. 351 */ 352 static sqlite3 *globalDb = 0; 353 354 /* 355 ** True if an interrupt (Control-C) has been received. 356 */ 357 static volatile int seenInterrupt = 0; 358 359 /* 360 ** This is the name of our program. It is set in main(), used 361 ** in a number of other places, mostly for error messages. 362 */ 363 static char *Argv0; 364 365 /* 366 ** Prompt strings. Initialized in main. Settable with 367 ** .prompt main continue 368 */ 369 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 370 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 371 372 /* 373 ** Render output like fprintf(). Except, if the output is going to the 374 ** console and if this is running on a Windows machine, translate the 375 ** output from UTF-8 into MBCS. 376 */ 377 #if defined(_WIN32) || defined(WIN32) 378 void utf8_printf(FILE *out, const char *zFormat, ...){ 379 va_list ap; 380 va_start(ap, zFormat); 381 if( stdout_is_console && (out==stdout || out==stderr) ){ 382 char *z1 = sqlite3_vmprintf(zFormat, ap); 383 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 384 sqlite3_free(z1); 385 fputs(z2, out); 386 sqlite3_free(z2); 387 }else{ 388 vfprintf(out, zFormat, ap); 389 } 390 va_end(ap); 391 } 392 #elif !defined(utf8_printf) 393 # define utf8_printf fprintf 394 #endif 395 396 /* 397 ** Render output like fprintf(). This should not be used on anything that 398 ** includes string formatting (e.g. "%s"). 399 */ 400 #if !defined(raw_printf) 401 # define raw_printf fprintf 402 #endif 403 404 /* 405 ** Write I/O traces to the following stream. 406 */ 407 #ifdef SQLITE_ENABLE_IOTRACE 408 static FILE *iotrace = 0; 409 #endif 410 411 /* 412 ** This routine works like printf in that its first argument is a 413 ** format string and subsequent arguments are values to be substituted 414 ** in place of % fields. The result of formatting this string 415 ** is written to iotrace. 416 */ 417 #ifdef SQLITE_ENABLE_IOTRACE 418 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 419 va_list ap; 420 char *z; 421 if( iotrace==0 ) return; 422 va_start(ap, zFormat); 423 z = sqlite3_vmprintf(zFormat, ap); 424 va_end(ap); 425 utf8_printf(iotrace, "%s", z); 426 sqlite3_free(z); 427 } 428 #endif 429 430 /* 431 ** Output string zUtf to stream pOut as w characters. If w is negative, 432 ** then right-justify the text. W is the width in UTF-8 characters, not 433 ** in bytes. This is different from the %*.*s specification in printf 434 ** since with %*.*s the width is measured in bytes, not characters. 435 */ 436 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 437 int i; 438 int n; 439 int aw = w<0 ? -w : w; 440 char zBuf[1000]; 441 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3; 442 for(i=n=0; zUtf[i]; i++){ 443 if( (zUtf[i]&0xc0)!=0x80 ){ 444 n++; 445 if( n==aw ){ 446 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 447 break; 448 } 449 } 450 } 451 if( n>=aw ){ 452 utf8_printf(pOut, "%.*s", i, zUtf); 453 }else if( w<0 ){ 454 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 455 }else{ 456 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 457 } 458 } 459 460 461 /* 462 ** Determines if a string is a number of not. 463 */ 464 static int isNumber(const char *z, int *realnum){ 465 if( *z=='-' || *z=='+' ) z++; 466 if( !IsDigit(*z) ){ 467 return 0; 468 } 469 z++; 470 if( realnum ) *realnum = 0; 471 while( IsDigit(*z) ){ z++; } 472 if( *z=='.' ){ 473 z++; 474 if( !IsDigit(*z) ) return 0; 475 while( IsDigit(*z) ){ z++; } 476 if( realnum ) *realnum = 1; 477 } 478 if( *z=='e' || *z=='E' ){ 479 z++; 480 if( *z=='+' || *z=='-' ) z++; 481 if( !IsDigit(*z) ) return 0; 482 while( IsDigit(*z) ){ z++; } 483 if( realnum ) *realnum = 1; 484 } 485 return *z==0; 486 } 487 488 /* 489 ** Compute a string length that is limited to what can be stored in 490 ** lower 30 bits of a 32-bit signed integer. 491 */ 492 static int strlen30(const char *z){ 493 const char *z2 = z; 494 while( *z2 ){ z2++; } 495 return 0x3fffffff & (int)(z2 - z); 496 } 497 498 /* 499 ** This routine reads a line of text from FILE in, stores 500 ** the text in memory obtained from malloc() and returns a pointer 501 ** to the text. NULL is returned at end of file, or if malloc() 502 ** fails. 503 ** 504 ** If zLine is not NULL then it is a malloced buffer returned from 505 ** a previous call to this routine that may be reused. 506 */ 507 static char *local_getline(char *zLine, FILE *in){ 508 int nLine = zLine==0 ? 0 : 100; 509 int n = 0; 510 511 while( 1 ){ 512 if( n+100>nLine ){ 513 nLine = nLine*2 + 100; 514 zLine = realloc(zLine, nLine); 515 if( zLine==0 ) return 0; 516 } 517 if( fgets(&zLine[n], nLine - n, in)==0 ){ 518 if( n==0 ){ 519 free(zLine); 520 return 0; 521 } 522 zLine[n] = 0; 523 break; 524 } 525 while( zLine[n] ) n++; 526 if( n>0 && zLine[n-1]=='\n' ){ 527 n--; 528 if( n>0 && zLine[n-1]=='\r' ) n--; 529 zLine[n] = 0; 530 break; 531 } 532 } 533 #if defined(_WIN32) || defined(WIN32) 534 /* For interactive input on Windows systems, translate the 535 ** multi-byte characterset characters into UTF-8. */ 536 if( stdin_is_interactive && in==stdin ){ 537 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 538 if( zTrans ){ 539 int nTrans = strlen30(zTrans)+1; 540 if( nTrans>nLine ){ 541 zLine = realloc(zLine, nTrans); 542 if( zLine==0 ){ 543 sqlite3_free(zTrans); 544 return 0; 545 } 546 } 547 memcpy(zLine, zTrans, nTrans); 548 sqlite3_free(zTrans); 549 } 550 } 551 #endif /* defined(_WIN32) || defined(WIN32) */ 552 return zLine; 553 } 554 555 /* 556 ** Retrieve a single line of input text. 557 ** 558 ** If in==0 then read from standard input and prompt before each line. 559 ** If isContinuation is true, then a continuation prompt is appropriate. 560 ** If isContinuation is zero, then the main prompt should be used. 561 ** 562 ** If zPrior is not NULL then it is a buffer from a prior call to this 563 ** routine that can be reused. 564 ** 565 ** The result is stored in space obtained from malloc() and must either 566 ** be freed by the caller or else passed back into this routine via the 567 ** zPrior argument for reuse. 568 */ 569 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 570 char *zPrompt; 571 char *zResult; 572 if( in!=0 ){ 573 zResult = local_getline(zPrior, in); 574 }else{ 575 zPrompt = isContinuation ? continuePrompt : mainPrompt; 576 #if SHELL_USE_LOCAL_GETLINE 577 printf("%s", zPrompt); 578 fflush(stdout); 579 zResult = local_getline(zPrior, stdin); 580 #else 581 free(zPrior); 582 zResult = shell_readline(zPrompt); 583 if( zResult && *zResult ) shell_add_history(zResult); 584 #endif 585 } 586 return zResult; 587 } 588 /* 589 ** A variable length string to which one can append text. 590 */ 591 typedef struct ShellText ShellText; 592 struct ShellText { 593 char *z; 594 int n; 595 int nAlloc; 596 }; 597 598 /* 599 ** Initialize and destroy a ShellText object 600 */ 601 static void initText(ShellText *p){ 602 memset(p, 0, sizeof(*p)); 603 } 604 static void freeText(ShellText *p){ 605 free(p->z); 606 initText(p); 607 } 608 609 /* zIn is either a pointer to a NULL-terminated string in memory obtained 610 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is 611 ** added to zIn, and the result returned in memory obtained from malloc(). 612 ** zIn, if it was not NULL, is freed. 613 ** 614 ** If the third argument, quote, is not '\0', then it is used as a 615 ** quote character for zAppend. 616 */ 617 static void appendText(ShellText *p, char const *zAppend, char quote){ 618 int len; 619 int i; 620 int nAppend = strlen30(zAppend); 621 622 len = nAppend+p->n+1; 623 if( quote ){ 624 len += 2; 625 for(i=0; i<nAppend; i++){ 626 if( zAppend[i]==quote ) len++; 627 } 628 } 629 630 if( p->n+len>=p->nAlloc ){ 631 p->nAlloc = p->nAlloc*2 + len + 20; 632 p->z = realloc(p->z, p->nAlloc); 633 if( p->z==0 ){ 634 memset(p, 0, sizeof(*p)); 635 return; 636 } 637 } 638 639 if( quote ){ 640 char *zCsr = p->z+p->n; 641 *zCsr++ = quote; 642 for(i=0; i<nAppend; i++){ 643 *zCsr++ = zAppend[i]; 644 if( zAppend[i]==quote ) *zCsr++ = quote; 645 } 646 *zCsr++ = quote; 647 p->n = (int)(zCsr - p->z); 648 *zCsr = '\0'; 649 }else{ 650 memcpy(p->z+p->n, zAppend, nAppend); 651 p->n += nAppend; 652 p->z[p->n] = '\0'; 653 } 654 } 655 656 /* 657 ** Attempt to determine if identifier zName needs to be quoted, either 658 ** because it contains non-alphanumeric characters, or because it is an 659 ** SQLite keyword. Be conservative in this estimate: When in doubt assume 660 ** that quoting is required. 661 ** 662 ** Return '"' if quoting is required. Return 0 if no quoting is required. 663 */ 664 static char quoteChar(const char *zName){ 665 /* All SQLite keywords, in alphabetical order */ 666 static const char *azKeywords[] = { 667 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS", 668 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY", 669 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT", 670 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE", 671 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE", 672 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH", 673 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN", 674 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF", 675 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER", 676 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY", 677 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL", 678 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA", 679 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP", 680 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT", 681 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP", 682 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE", 683 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE", 684 "WITH", "WITHOUT", 685 }; 686 int i, lwr, upr, mid, c; 687 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 688 for(i=0; zName[i]; i++){ 689 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 690 } 691 lwr = 0; 692 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1; 693 while( lwr<=upr ){ 694 mid = (lwr+upr)/2; 695 c = sqlite3_stricmp(azKeywords[mid], zName); 696 if( c==0 ) return '"'; 697 if( c<0 ){ 698 lwr = mid+1; 699 }else{ 700 upr = mid-1; 701 } 702 } 703 return 0; 704 } 705 706 /****************************************************************************** 707 ** SHA3 hash implementation copied from ../ext/misc/shathree.c 708 */ 709 typedef sqlite3_uint64 u64; 710 /* 711 ** Macros to determine whether the machine is big or little endian, 712 ** and whether or not that determination is run-time or compile-time. 713 ** 714 ** For best performance, an attempt is made to guess at the byte-order 715 ** using C-preprocessor macros. If that is unsuccessful, or if 716 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined 717 ** at run-time. 718 */ 719 #ifndef SHA3_BYTEORDER 720 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ 721 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ 722 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ 723 defined(__arm__) 724 # define SHA3_BYTEORDER 1234 725 # elif defined(sparc) || defined(__ppc__) 726 # define SHA3_BYTEORDER 4321 727 # else 728 # define SHA3_BYTEORDER 0 729 # endif 730 #endif 731 732 733 /* 734 ** State structure for a SHA3 hash in progress 735 */ 736 typedef struct SHA3Context SHA3Context; 737 struct SHA3Context { 738 union { 739 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ 740 unsigned char x[1600]; /* ... or 1600 bytes */ 741 } u; 742 unsigned nRate; /* Bytes of input accepted per Keccak iteration */ 743 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ 744 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ 745 }; 746 747 /* Allow the following routine to use the B0 variable, which is also 748 ** a macro in the termios.h header file */ 749 #undef B0 750 751 /* 752 ** A single step of the Keccak mixing function for a 1600-bit state 753 */ 754 static void KeccakF1600Step(SHA3Context *p){ 755 int i; 756 u64 B0, B1, B2, B3, B4; 757 u64 C0, C1, C2, C3, C4; 758 u64 D0, D1, D2, D3, D4; 759 static const u64 RC[] = { 760 0x0000000000000001ULL, 0x0000000000008082ULL, 761 0x800000000000808aULL, 0x8000000080008000ULL, 762 0x000000000000808bULL, 0x0000000080000001ULL, 763 0x8000000080008081ULL, 0x8000000000008009ULL, 764 0x000000000000008aULL, 0x0000000000000088ULL, 765 0x0000000080008009ULL, 0x000000008000000aULL, 766 0x000000008000808bULL, 0x800000000000008bULL, 767 0x8000000000008089ULL, 0x8000000000008003ULL, 768 0x8000000000008002ULL, 0x8000000000000080ULL, 769 0x000000000000800aULL, 0x800000008000000aULL, 770 0x8000000080008081ULL, 0x8000000000008080ULL, 771 0x0000000080000001ULL, 0x8000000080008008ULL 772 }; 773 # define A00 (p->u.s[0]) 774 # define A01 (p->u.s[1]) 775 # define A02 (p->u.s[2]) 776 # define A03 (p->u.s[3]) 777 # define A04 (p->u.s[4]) 778 # define A10 (p->u.s[5]) 779 # define A11 (p->u.s[6]) 780 # define A12 (p->u.s[7]) 781 # define A13 (p->u.s[8]) 782 # define A14 (p->u.s[9]) 783 # define A20 (p->u.s[10]) 784 # define A21 (p->u.s[11]) 785 # define A22 (p->u.s[12]) 786 # define A23 (p->u.s[13]) 787 # define A24 (p->u.s[14]) 788 # define A30 (p->u.s[15]) 789 # define A31 (p->u.s[16]) 790 # define A32 (p->u.s[17]) 791 # define A33 (p->u.s[18]) 792 # define A34 (p->u.s[19]) 793 # define A40 (p->u.s[20]) 794 # define A41 (p->u.s[21]) 795 # define A42 (p->u.s[22]) 796 # define A43 (p->u.s[23]) 797 # define A44 (p->u.s[24]) 798 # define ROL64(a,x) ((a<<x)|(a>>(64-x))) 799 800 for(i=0; i<24; i+=4){ 801 C0 = A00^A10^A20^A30^A40; 802 C1 = A01^A11^A21^A31^A41; 803 C2 = A02^A12^A22^A32^A42; 804 C3 = A03^A13^A23^A33^A43; 805 C4 = A04^A14^A24^A34^A44; 806 D0 = C4^ROL64(C1, 1); 807 D1 = C0^ROL64(C2, 1); 808 D2 = C1^ROL64(C3, 1); 809 D3 = C2^ROL64(C4, 1); 810 D4 = C3^ROL64(C0, 1); 811 812 B0 = (A00^D0); 813 B1 = ROL64((A11^D1), 44); 814 B2 = ROL64((A22^D2), 43); 815 B3 = ROL64((A33^D3), 21); 816 B4 = ROL64((A44^D4), 14); 817 A00 = B0 ^((~B1)& B2 ); 818 A00 ^= RC[i]; 819 A11 = B1 ^((~B2)& B3 ); 820 A22 = B2 ^((~B3)& B4 ); 821 A33 = B3 ^((~B4)& B0 ); 822 A44 = B4 ^((~B0)& B1 ); 823 824 B2 = ROL64((A20^D0), 3); 825 B3 = ROL64((A31^D1), 45); 826 B4 = ROL64((A42^D2), 61); 827 B0 = ROL64((A03^D3), 28); 828 B1 = ROL64((A14^D4), 20); 829 A20 = B0 ^((~B1)& B2 ); 830 A31 = B1 ^((~B2)& B3 ); 831 A42 = B2 ^((~B3)& B4 ); 832 A03 = B3 ^((~B4)& B0 ); 833 A14 = B4 ^((~B0)& B1 ); 834 835 B4 = ROL64((A40^D0), 18); 836 B0 = ROL64((A01^D1), 1); 837 B1 = ROL64((A12^D2), 6); 838 B2 = ROL64((A23^D3), 25); 839 B3 = ROL64((A34^D4), 8); 840 A40 = B0 ^((~B1)& B2 ); 841 A01 = B1 ^((~B2)& B3 ); 842 A12 = B2 ^((~B3)& B4 ); 843 A23 = B3 ^((~B4)& B0 ); 844 A34 = B4 ^((~B0)& B1 ); 845 846 B1 = ROL64((A10^D0), 36); 847 B2 = ROL64((A21^D1), 10); 848 B3 = ROL64((A32^D2), 15); 849 B4 = ROL64((A43^D3), 56); 850 B0 = ROL64((A04^D4), 27); 851 A10 = B0 ^((~B1)& B2 ); 852 A21 = B1 ^((~B2)& B3 ); 853 A32 = B2 ^((~B3)& B4 ); 854 A43 = B3 ^((~B4)& B0 ); 855 A04 = B4 ^((~B0)& B1 ); 856 857 B3 = ROL64((A30^D0), 41); 858 B4 = ROL64((A41^D1), 2); 859 B0 = ROL64((A02^D2), 62); 860 B1 = ROL64((A13^D3), 55); 861 B2 = ROL64((A24^D4), 39); 862 A30 = B0 ^((~B1)& B2 ); 863 A41 = B1 ^((~B2)& B3 ); 864 A02 = B2 ^((~B3)& B4 ); 865 A13 = B3 ^((~B4)& B0 ); 866 A24 = B4 ^((~B0)& B1 ); 867 868 C0 = A00^A20^A40^A10^A30; 869 C1 = A11^A31^A01^A21^A41; 870 C2 = A22^A42^A12^A32^A02; 871 C3 = A33^A03^A23^A43^A13; 872 C4 = A44^A14^A34^A04^A24; 873 D0 = C4^ROL64(C1, 1); 874 D1 = C0^ROL64(C2, 1); 875 D2 = C1^ROL64(C3, 1); 876 D3 = C2^ROL64(C4, 1); 877 D4 = C3^ROL64(C0, 1); 878 879 B0 = (A00^D0); 880 B1 = ROL64((A31^D1), 44); 881 B2 = ROL64((A12^D2), 43); 882 B3 = ROL64((A43^D3), 21); 883 B4 = ROL64((A24^D4), 14); 884 A00 = B0 ^((~B1)& B2 ); 885 A00 ^= RC[i+1]; 886 A31 = B1 ^((~B2)& B3 ); 887 A12 = B2 ^((~B3)& B4 ); 888 A43 = B3 ^((~B4)& B0 ); 889 A24 = B4 ^((~B0)& B1 ); 890 891 B2 = ROL64((A40^D0), 3); 892 B3 = ROL64((A21^D1), 45); 893 B4 = ROL64((A02^D2), 61); 894 B0 = ROL64((A33^D3), 28); 895 B1 = ROL64((A14^D4), 20); 896 A40 = B0 ^((~B1)& B2 ); 897 A21 = B1 ^((~B2)& B3 ); 898 A02 = B2 ^((~B3)& B4 ); 899 A33 = B3 ^((~B4)& B0 ); 900 A14 = B4 ^((~B0)& B1 ); 901 902 B4 = ROL64((A30^D0), 18); 903 B0 = ROL64((A11^D1), 1); 904 B1 = ROL64((A42^D2), 6); 905 B2 = ROL64((A23^D3), 25); 906 B3 = ROL64((A04^D4), 8); 907 A30 = B0 ^((~B1)& B2 ); 908 A11 = B1 ^((~B2)& B3 ); 909 A42 = B2 ^((~B3)& B4 ); 910 A23 = B3 ^((~B4)& B0 ); 911 A04 = B4 ^((~B0)& B1 ); 912 913 B1 = ROL64((A20^D0), 36); 914 B2 = ROL64((A01^D1), 10); 915 B3 = ROL64((A32^D2), 15); 916 B4 = ROL64((A13^D3), 56); 917 B0 = ROL64((A44^D4), 27); 918 A20 = B0 ^((~B1)& B2 ); 919 A01 = B1 ^((~B2)& B3 ); 920 A32 = B2 ^((~B3)& B4 ); 921 A13 = B3 ^((~B4)& B0 ); 922 A44 = B4 ^((~B0)& B1 ); 923 924 B3 = ROL64((A10^D0), 41); 925 B4 = ROL64((A41^D1), 2); 926 B0 = ROL64((A22^D2), 62); 927 B1 = ROL64((A03^D3), 55); 928 B2 = ROL64((A34^D4), 39); 929 A10 = B0 ^((~B1)& B2 ); 930 A41 = B1 ^((~B2)& B3 ); 931 A22 = B2 ^((~B3)& B4 ); 932 A03 = B3 ^((~B4)& B0 ); 933 A34 = B4 ^((~B0)& B1 ); 934 935 C0 = A00^A40^A30^A20^A10; 936 C1 = A31^A21^A11^A01^A41; 937 C2 = A12^A02^A42^A32^A22; 938 C3 = A43^A33^A23^A13^A03; 939 C4 = A24^A14^A04^A44^A34; 940 D0 = C4^ROL64(C1, 1); 941 D1 = C0^ROL64(C2, 1); 942 D2 = C1^ROL64(C3, 1); 943 D3 = C2^ROL64(C4, 1); 944 D4 = C3^ROL64(C0, 1); 945 946 B0 = (A00^D0); 947 B1 = ROL64((A21^D1), 44); 948 B2 = ROL64((A42^D2), 43); 949 B3 = ROL64((A13^D3), 21); 950 B4 = ROL64((A34^D4), 14); 951 A00 = B0 ^((~B1)& B2 ); 952 A00 ^= RC[i+2]; 953 A21 = B1 ^((~B2)& B3 ); 954 A42 = B2 ^((~B3)& B4 ); 955 A13 = B3 ^((~B4)& B0 ); 956 A34 = B4 ^((~B0)& B1 ); 957 958 B2 = ROL64((A30^D0), 3); 959 B3 = ROL64((A01^D1), 45); 960 B4 = ROL64((A22^D2), 61); 961 B0 = ROL64((A43^D3), 28); 962 B1 = ROL64((A14^D4), 20); 963 A30 = B0 ^((~B1)& B2 ); 964 A01 = B1 ^((~B2)& B3 ); 965 A22 = B2 ^((~B3)& B4 ); 966 A43 = B3 ^((~B4)& B0 ); 967 A14 = B4 ^((~B0)& B1 ); 968 969 B4 = ROL64((A10^D0), 18); 970 B0 = ROL64((A31^D1), 1); 971 B1 = ROL64((A02^D2), 6); 972 B2 = ROL64((A23^D3), 25); 973 B3 = ROL64((A44^D4), 8); 974 A10 = B0 ^((~B1)& B2 ); 975 A31 = B1 ^((~B2)& B3 ); 976 A02 = B2 ^((~B3)& B4 ); 977 A23 = B3 ^((~B4)& B0 ); 978 A44 = B4 ^((~B0)& B1 ); 979 980 B1 = ROL64((A40^D0), 36); 981 B2 = ROL64((A11^D1), 10); 982 B3 = ROL64((A32^D2), 15); 983 B4 = ROL64((A03^D3), 56); 984 B0 = ROL64((A24^D4), 27); 985 A40 = B0 ^((~B1)& B2 ); 986 A11 = B1 ^((~B2)& B3 ); 987 A32 = B2 ^((~B3)& B4 ); 988 A03 = B3 ^((~B4)& B0 ); 989 A24 = B4 ^((~B0)& B1 ); 990 991 B3 = ROL64((A20^D0), 41); 992 B4 = ROL64((A41^D1), 2); 993 B0 = ROL64((A12^D2), 62); 994 B1 = ROL64((A33^D3), 55); 995 B2 = ROL64((A04^D4), 39); 996 A20 = B0 ^((~B1)& B2 ); 997 A41 = B1 ^((~B2)& B3 ); 998 A12 = B2 ^((~B3)& B4 ); 999 A33 = B3 ^((~B4)& B0 ); 1000 A04 = B4 ^((~B0)& B1 ); 1001 1002 C0 = A00^A30^A10^A40^A20; 1003 C1 = A21^A01^A31^A11^A41; 1004 C2 = A42^A22^A02^A32^A12; 1005 C3 = A13^A43^A23^A03^A33; 1006 C4 = A34^A14^A44^A24^A04; 1007 D0 = C4^ROL64(C1, 1); 1008 D1 = C0^ROL64(C2, 1); 1009 D2 = C1^ROL64(C3, 1); 1010 D3 = C2^ROL64(C4, 1); 1011 D4 = C3^ROL64(C0, 1); 1012 1013 B0 = (A00^D0); 1014 B1 = ROL64((A01^D1), 44); 1015 B2 = ROL64((A02^D2), 43); 1016 B3 = ROL64((A03^D3), 21); 1017 B4 = ROL64((A04^D4), 14); 1018 A00 = B0 ^((~B1)& B2 ); 1019 A00 ^= RC[i+3]; 1020 A01 = B1 ^((~B2)& B3 ); 1021 A02 = B2 ^((~B3)& B4 ); 1022 A03 = B3 ^((~B4)& B0 ); 1023 A04 = B4 ^((~B0)& B1 ); 1024 1025 B2 = ROL64((A10^D0), 3); 1026 B3 = ROL64((A11^D1), 45); 1027 B4 = ROL64((A12^D2), 61); 1028 B0 = ROL64((A13^D3), 28); 1029 B1 = ROL64((A14^D4), 20); 1030 A10 = B0 ^((~B1)& B2 ); 1031 A11 = B1 ^((~B2)& B3 ); 1032 A12 = B2 ^((~B3)& B4 ); 1033 A13 = B3 ^((~B4)& B0 ); 1034 A14 = B4 ^((~B0)& B1 ); 1035 1036 B4 = ROL64((A20^D0), 18); 1037 B0 = ROL64((A21^D1), 1); 1038 B1 = ROL64((A22^D2), 6); 1039 B2 = ROL64((A23^D3), 25); 1040 B3 = ROL64((A24^D4), 8); 1041 A20 = B0 ^((~B1)& B2 ); 1042 A21 = B1 ^((~B2)& B3 ); 1043 A22 = B2 ^((~B3)& B4 ); 1044 A23 = B3 ^((~B4)& B0 ); 1045 A24 = B4 ^((~B0)& B1 ); 1046 1047 B1 = ROL64((A30^D0), 36); 1048 B2 = ROL64((A31^D1), 10); 1049 B3 = ROL64((A32^D2), 15); 1050 B4 = ROL64((A33^D3), 56); 1051 B0 = ROL64((A34^D4), 27); 1052 A30 = B0 ^((~B1)& B2 ); 1053 A31 = B1 ^((~B2)& B3 ); 1054 A32 = B2 ^((~B3)& B4 ); 1055 A33 = B3 ^((~B4)& B0 ); 1056 A34 = B4 ^((~B0)& B1 ); 1057 1058 B3 = ROL64((A40^D0), 41); 1059 B4 = ROL64((A41^D1), 2); 1060 B0 = ROL64((A42^D2), 62); 1061 B1 = ROL64((A43^D3), 55); 1062 B2 = ROL64((A44^D4), 39); 1063 A40 = B0 ^((~B1)& B2 ); 1064 A41 = B1 ^((~B2)& B3 ); 1065 A42 = B2 ^((~B3)& B4 ); 1066 A43 = B3 ^((~B4)& B0 ); 1067 A44 = B4 ^((~B0)& B1 ); 1068 } 1069 } 1070 1071 /* 1072 ** Initialize a new hash. iSize determines the size of the hash 1073 ** in bits and should be one of 224, 256, 384, or 512. Or iSize 1074 ** can be zero to use the default hash size of 256 bits. 1075 */ 1076 static void SHA3Init(SHA3Context *p, int iSize){ 1077 memset(p, 0, sizeof(*p)); 1078 if( iSize>=128 && iSize<=512 ){ 1079 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; 1080 }else{ 1081 p->nRate = (1600 - 2*256)/8; 1082 } 1083 #if SHA3_BYTEORDER==1234 1084 /* Known to be little-endian at compile-time. No-op */ 1085 #elif SHA3_BYTEORDER==4321 1086 p->ixMask = 7; /* Big-endian */ 1087 #else 1088 { 1089 static unsigned int one = 1; 1090 if( 1==*(unsigned char*)&one ){ 1091 /* Little endian. No byte swapping. */ 1092 p->ixMask = 0; 1093 }else{ 1094 /* Big endian. Byte swap. */ 1095 p->ixMask = 7; 1096 } 1097 } 1098 #endif 1099 } 1100 1101 /* 1102 ** Make consecutive calls to the SHA3Update function to add new content 1103 ** to the hash 1104 */ 1105 static void SHA3Update( 1106 SHA3Context *p, 1107 const unsigned char *aData, 1108 unsigned int nData 1109 ){ 1110 unsigned int i = 0; 1111 #if SHA3_BYTEORDER==1234 1112 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ 1113 for(; i+7<nData; i+=8){ 1114 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; 1115 p->nLoaded += 8; 1116 if( p->nLoaded>=p->nRate ){ 1117 KeccakF1600Step(p); 1118 p->nLoaded = 0; 1119 } 1120 } 1121 } 1122 #endif 1123 for(; i<nData; i++){ 1124 #if SHA3_BYTEORDER==1234 1125 p->u.x[p->nLoaded] ^= aData[i]; 1126 #elif SHA3_BYTEORDER==4321 1127 p->u.x[p->nLoaded^0x07] ^= aData[i]; 1128 #else 1129 p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; 1130 #endif 1131 p->nLoaded++; 1132 if( p->nLoaded==p->nRate ){ 1133 KeccakF1600Step(p); 1134 p->nLoaded = 0; 1135 } 1136 } 1137 } 1138 1139 /* 1140 ** After all content has been added, invoke SHA3Final() to compute 1141 ** the final hash. The function returns a pointer to the binary 1142 ** hash value. 1143 */ 1144 static unsigned char *SHA3Final(SHA3Context *p){ 1145 unsigned int i; 1146 if( p->nLoaded==p->nRate-1 ){ 1147 const unsigned char c1 = 0x86; 1148 SHA3Update(p, &c1, 1); 1149 }else{ 1150 const unsigned char c2 = 0x06; 1151 const unsigned char c3 = 0x80; 1152 SHA3Update(p, &c2, 1); 1153 p->nLoaded = p->nRate - 1; 1154 SHA3Update(p, &c3, 1); 1155 } 1156 for(i=0; i<p->nRate; i++){ 1157 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; 1158 } 1159 return &p->u.x[p->nRate]; 1160 } 1161 1162 /* 1163 ** Implementation of the sha3(X,SIZE) function. 1164 ** 1165 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default 1166 ** size is 256. If X is a BLOB, it is hashed as is. 1167 ** For all other non-NULL types of input, X is converted into a UTF-8 string 1168 ** and the string is hashed without the trailing 0x00 terminator. The hash 1169 ** of a NULL value is NULL. 1170 */ 1171 static void sha3Func( 1172 sqlite3_context *context, 1173 int argc, 1174 sqlite3_value **argv 1175 ){ 1176 SHA3Context cx; 1177 int eType = sqlite3_value_type(argv[0]); 1178 int nByte = sqlite3_value_bytes(argv[0]); 1179 int iSize; 1180 if( argc==1 ){ 1181 iSize = 256; 1182 }else{ 1183 iSize = sqlite3_value_int(argv[1]); 1184 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1185 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1186 "384 512", -1); 1187 return; 1188 } 1189 } 1190 if( eType==SQLITE_NULL ) return; 1191 SHA3Init(&cx, iSize); 1192 if( eType==SQLITE_BLOB ){ 1193 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); 1194 }else{ 1195 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); 1196 } 1197 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 1198 } 1199 1200 /* Compute a string using sqlite3_vsnprintf() with a maximum length 1201 ** of 50 bytes and add it to the hash. 1202 */ 1203 static void hash_step_vformat( 1204 SHA3Context *p, /* Add content to this context */ 1205 const char *zFormat, 1206 ... 1207 ){ 1208 va_list ap; 1209 int n; 1210 char zBuf[50]; 1211 va_start(ap, zFormat); 1212 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); 1213 va_end(ap); 1214 n = (int)strlen(zBuf); 1215 SHA3Update(p, (unsigned char*)zBuf, n); 1216 } 1217 1218 /* 1219 ** Implementation of the sha3_query(SQL,SIZE) function. 1220 ** 1221 ** This function compiles and runs the SQL statement(s) given in the 1222 ** argument. The results are hashed using a SIZE-bit SHA3. The default 1223 ** size is 256. 1224 ** 1225 ** The format of the byte stream that is hashed is summarized as follows: 1226 ** 1227 ** S<n>:<sql> 1228 ** R 1229 ** N 1230 ** I<int> 1231 ** F<ieee-float> 1232 ** B<size>:<bytes> 1233 ** T<size>:<text> 1234 ** 1235 ** <sql> is the original SQL text for each statement run and <n> is 1236 ** the size of that text. The SQL text is UTF-8. A single R character 1237 ** occurs before the start of each row. N means a NULL value. 1238 ** I mean an 8-byte little-endian integer <int>. F is a floating point 1239 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>. 1240 ** B means blobs of <size> bytes. T means text rendered as <size> 1241 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII 1242 ** text integers. 1243 ** 1244 ** For each SQL statement in the X input, there is one S segment. Each 1245 ** S segment is followed by zero or more R segments, one for each row in the 1246 ** result set. After each R, there are one or more N, I, F, B, or T segments, 1247 ** one for each column in the result set. Segments are concatentated directly 1248 ** with no delimiters of any kind. 1249 */ 1250 static void sha3QueryFunc( 1251 sqlite3_context *context, 1252 int argc, 1253 sqlite3_value **argv 1254 ){ 1255 sqlite3 *db = sqlite3_context_db_handle(context); 1256 const char *zSql = (const char*)sqlite3_value_text(argv[0]); 1257 sqlite3_stmt *pStmt = 0; 1258 int nCol; /* Number of columns in the result set */ 1259 int i; /* Loop counter */ 1260 int rc; 1261 int n; 1262 const char *z; 1263 SHA3Context cx; 1264 int iSize; 1265 1266 if( argc==1 ){ 1267 iSize = 256; 1268 }else{ 1269 iSize = sqlite3_value_int(argv[1]); 1270 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1271 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1272 "384 512", -1); 1273 return; 1274 } 1275 } 1276 if( zSql==0 ) return; 1277 SHA3Init(&cx, iSize); 1278 while( zSql[0] ){ 1279 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); 1280 if( rc ){ 1281 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", 1282 zSql, sqlite3_errmsg(db)); 1283 sqlite3_finalize(pStmt); 1284 sqlite3_result_error(context, zMsg, -1); 1285 sqlite3_free(zMsg); 1286 return; 1287 } 1288 if( !sqlite3_stmt_readonly(pStmt) ){ 1289 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); 1290 sqlite3_finalize(pStmt); 1291 sqlite3_result_error(context, zMsg, -1); 1292 sqlite3_free(zMsg); 1293 return; 1294 } 1295 nCol = sqlite3_column_count(pStmt); 1296 z = sqlite3_sql(pStmt); 1297 if( z==0 ){ 1298 sqlite3_finalize(pStmt); 1299 continue; 1300 } 1301 n = (int)strlen(z); 1302 hash_step_vformat(&cx,"S%d:",n); 1303 SHA3Update(&cx,(unsigned char*)z,n); 1304 1305 /* Compute a hash over the result of the query */ 1306 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 1307 SHA3Update(&cx,(const unsigned char*)"R",1); 1308 for(i=0; i<nCol; i++){ 1309 switch( sqlite3_column_type(pStmt,i) ){ 1310 case SQLITE_NULL: { 1311 SHA3Update(&cx, (const unsigned char*)"N",1); 1312 break; 1313 } 1314 case SQLITE_INTEGER: { 1315 sqlite3_uint64 u; 1316 int j; 1317 unsigned char x[9]; 1318 sqlite3_int64 v = sqlite3_column_int64(pStmt,i); 1319 memcpy(&u, &v, 8); 1320 for(j=8; j>=1; j--){ 1321 x[j] = u & 0xff; 1322 u >>= 8; 1323 } 1324 x[0] = 'I'; 1325 SHA3Update(&cx, x, 9); 1326 break; 1327 } 1328 case SQLITE_FLOAT: { 1329 sqlite3_uint64 u; 1330 int j; 1331 unsigned char x[9]; 1332 double r = sqlite3_column_double(pStmt,i); 1333 memcpy(&u, &r, 8); 1334 for(j=8; j>=1; j--){ 1335 x[j] = u & 0xff; 1336 u >>= 8; 1337 } 1338 x[0] = 'F'; 1339 SHA3Update(&cx,x,9); 1340 break; 1341 } 1342 case SQLITE_TEXT: { 1343 int n2 = sqlite3_column_bytes(pStmt, i); 1344 const unsigned char *z2 = sqlite3_column_text(pStmt, i); 1345 hash_step_vformat(&cx,"T%d:",n2); 1346 SHA3Update(&cx, z2, n2); 1347 break; 1348 } 1349 case SQLITE_BLOB: { 1350 int n2 = sqlite3_column_bytes(pStmt, i); 1351 const unsigned char *z2 = sqlite3_column_blob(pStmt, i); 1352 hash_step_vformat(&cx,"B%d:",n2); 1353 SHA3Update(&cx, z2, n2); 1354 break; 1355 } 1356 } 1357 } 1358 } 1359 sqlite3_finalize(pStmt); 1360 } 1361 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 1362 } 1363 /* End of SHA3 hashing logic copy/pasted from ../ext/misc/shathree.c 1364 ********************************************************************************/ 1365 1366 #if defined(SQLITE_ENABLE_SESSION) 1367 /* 1368 ** State information for a single open session 1369 */ 1370 typedef struct OpenSession OpenSession; 1371 struct OpenSession { 1372 char *zName; /* Symbolic name for this session */ 1373 int nFilter; /* Number of xFilter rejection GLOB patterns */ 1374 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 1375 sqlite3_session *p; /* The open session */ 1376 }; 1377 #endif 1378 1379 /* 1380 ** Shell output mode information from before ".explain on", 1381 ** saved so that it can be restored by ".explain off" 1382 */ 1383 typedef struct SavedModeInfo SavedModeInfo; 1384 struct SavedModeInfo { 1385 int valid; /* Is there legit data in here? */ 1386 int mode; /* Mode prior to ".explain on" */ 1387 int showHeader; /* The ".header" setting prior to ".explain on" */ 1388 int colWidth[100]; /* Column widths prior to ".explain on" */ 1389 }; 1390 1391 /* 1392 ** State information about the database connection is contained in an 1393 ** instance of the following structure. 1394 */ 1395 typedef struct ShellState ShellState; 1396 struct ShellState { 1397 sqlite3 *db; /* The database */ 1398 int autoExplain; /* Automatically turn on .explain mode */ 1399 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 1400 int statsOn; /* True to display memory stats before each finalize */ 1401 int scanstatsOn; /* True to display scan stats before each finalize */ 1402 int outCount; /* Revert to stdout when reaching zero */ 1403 int cnt; /* Number of records displayed so far */ 1404 FILE *out; /* Write results here */ 1405 FILE *traceOut; /* Output for sqlite3_trace() */ 1406 int nErr; /* Number of errors seen */ 1407 int mode; /* An output mode setting */ 1408 int cMode; /* temporary output mode for the current query */ 1409 int normalMode; /* Output mode before ".explain on" */ 1410 int writableSchema; /* True if PRAGMA writable_schema=ON */ 1411 int showHeader; /* True to show column names in List or Column mode */ 1412 int nCheck; /* Number of ".check" commands run */ 1413 unsigned shellFlgs; /* Various flags */ 1414 char *zDestTable; /* Name of destination table when MODE_Insert */ 1415 char zTestcase[30]; /* Name of current test case */ 1416 char colSeparator[20]; /* Column separator character for several modes */ 1417 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 1418 int colWidth[100]; /* Requested width of each column when in column mode*/ 1419 int actualWidth[100]; /* Actual width of each column */ 1420 char nullValue[20]; /* The text to print when a NULL comes back from 1421 ** the database */ 1422 char outfile[FILENAME_MAX]; /* Filename for *out */ 1423 const char *zDbFilename; /* name of the database file */ 1424 char *zFreeOnClose; /* Filename to free when closing */ 1425 const char *zVfs; /* Name of VFS to use */ 1426 sqlite3_stmt *pStmt; /* Current statement if any. */ 1427 FILE *pLog; /* Write log output here */ 1428 int *aiIndent; /* Array of indents used in MODE_Explain */ 1429 int nIndent; /* Size of array aiIndent[] */ 1430 int iIndent; /* Index of current op in aiIndent[] */ 1431 #if defined(SQLITE_ENABLE_SESSION) 1432 int nSession; /* Number of active sessions */ 1433 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 1434 #endif 1435 }; 1436 1437 /* 1438 ** These are the allowed shellFlgs values 1439 */ 1440 #define SHFLG_Scratch 0x00000001 /* The --scratch option is used */ 1441 #define SHFLG_Pagecache 0x00000002 /* The --pagecache option is used */ 1442 #define SHFLG_Lookaside 0x00000004 /* Lookaside memory is used */ 1443 #define SHFLG_Backslash 0x00000008 /* The --backslash option is used */ 1444 #define SHFLG_PreserveRowid 0x00000010 /* .dump preserves rowid values */ 1445 #define SHFLG_CountChanges 0x00000020 /* .changes setting */ 1446 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 1447 1448 /* 1449 ** Macros for testing and setting shellFlgs 1450 */ 1451 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 1452 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 1453 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 1454 1455 /* 1456 ** These are the allowed modes. 1457 */ 1458 #define MODE_Line 0 /* One column per line. Blank line between records */ 1459 #define MODE_Column 1 /* One record per line in neat columns */ 1460 #define MODE_List 2 /* One record per line with a separator */ 1461 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 1462 #define MODE_Html 4 /* Generate an XHTML table */ 1463 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 1464 #define MODE_Quote 6 /* Quote values as for SQL */ 1465 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 1466 #define MODE_Csv 8 /* Quote strings, numbers are plain */ 1467 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 1468 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 1469 #define MODE_Pretty 11 /* Pretty-print schemas */ 1470 1471 static const char *modeDescr[] = { 1472 "line", 1473 "column", 1474 "list", 1475 "semi", 1476 "html", 1477 "insert", 1478 "quote", 1479 "tcl", 1480 "csv", 1481 "explain", 1482 "ascii", 1483 "prettyprint", 1484 }; 1485 1486 /* 1487 ** These are the column/row/line separators used by the various 1488 ** import/export modes. 1489 */ 1490 #define SEP_Column "|" 1491 #define SEP_Row "\n" 1492 #define SEP_Tab "\t" 1493 #define SEP_Space " " 1494 #define SEP_Comma "," 1495 #define SEP_CrLf "\r\n" 1496 #define SEP_Unit "\x1F" 1497 #define SEP_Record "\x1E" 1498 1499 /* 1500 ** Number of elements in an array 1501 */ 1502 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 1503 1504 /* 1505 ** A callback for the sqlite3_log() interface. 1506 */ 1507 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 1508 ShellState *p = (ShellState*)pArg; 1509 if( p->pLog==0 ) return; 1510 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 1511 fflush(p->pLog); 1512 } 1513 1514 /* 1515 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 1516 */ 1517 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 1518 int i; 1519 char *zBlob = (char *)pBlob; 1520 raw_printf(out,"X'"); 1521 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 1522 raw_printf(out,"'"); 1523 } 1524 1525 /* 1526 ** Find a string that is not found anywhere in z[]. Return a pointer 1527 ** to that string. 1528 ** 1529 ** Try to use zA and zB first. If both of those are already found in z[] 1530 ** then make up some string and store it in the buffer zBuf. 1531 */ 1532 static const char *unused_string( 1533 const char *z, /* Result must not appear anywhere in z */ 1534 const char *zA, const char *zB, /* Try these first */ 1535 char *zBuf /* Space to store a generated string */ 1536 ){ 1537 unsigned i = 0; 1538 if( strstr(z, zA)==0 ) return zA; 1539 if( strstr(z, zB)==0 ) return zB; 1540 do{ 1541 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 1542 }while( strstr(z,zBuf)!=0 ); 1543 return zBuf; 1544 } 1545 1546 /* 1547 ** Output the given string as a quoted string using SQL quoting conventions. 1548 ** 1549 ** See also: output_quoted_escaped_string() 1550 */ 1551 static void output_quoted_string(FILE *out, const char *z){ 1552 int i; 1553 char c; 1554 setBinaryMode(out, 1); 1555 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1556 if( c==0 ){ 1557 utf8_printf(out,"'%s'",z); 1558 }else{ 1559 raw_printf(out, "'"); 1560 while( *z ){ 1561 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1562 if( c=='\'' ) i++; 1563 if( i ){ 1564 utf8_printf(out, "%.*s", i, z); 1565 z += i; 1566 } 1567 if( c=='\'' ){ 1568 raw_printf(out, "'"); 1569 continue; 1570 } 1571 if( c==0 ){ 1572 break; 1573 } 1574 z++; 1575 } 1576 raw_printf(out, "'"); 1577 } 1578 setTextMode(out, 1); 1579 } 1580 1581 /* 1582 ** Output the given string as a quoted string using SQL quoting conventions. 1583 ** Additionallly , escape the "\n" and "\r" characters so that they do not 1584 ** get corrupted by end-of-line translation facilities in some operating 1585 ** systems. 1586 ** 1587 ** This is like output_quoted_string() but with the addition of the \r\n 1588 ** escape mechanism. 1589 */ 1590 static void output_quoted_escaped_string(FILE *out, const char *z){ 1591 int i; 1592 char c; 1593 setBinaryMode(out, 1); 1594 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 1595 if( c==0 ){ 1596 utf8_printf(out,"'%s'",z); 1597 }else{ 1598 const char *zNL = 0; 1599 const char *zCR = 0; 1600 int nNL = 0; 1601 int nCR = 0; 1602 char zBuf1[20], zBuf2[20]; 1603 for(i=0; z[i]; i++){ 1604 if( z[i]=='\n' ) nNL++; 1605 if( z[i]=='\r' ) nCR++; 1606 } 1607 if( nNL ){ 1608 raw_printf(out, "replace("); 1609 zNL = unused_string(z, "\\n", "\\012", zBuf1); 1610 } 1611 if( nCR ){ 1612 raw_printf(out, "replace("); 1613 zCR = unused_string(z, "\\r", "\\015", zBuf2); 1614 } 1615 raw_printf(out, "'"); 1616 while( *z ){ 1617 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 1618 if( c=='\'' ) i++; 1619 if( i ){ 1620 utf8_printf(out, "%.*s", i, z); 1621 z += i; 1622 } 1623 if( c=='\'' ){ 1624 raw_printf(out, "'"); 1625 continue; 1626 } 1627 if( c==0 ){ 1628 break; 1629 } 1630 z++; 1631 if( c=='\n' ){ 1632 raw_printf(out, "%s", zNL); 1633 continue; 1634 } 1635 raw_printf(out, "%s", zCR); 1636 } 1637 raw_printf(out, "'"); 1638 if( nCR ){ 1639 raw_printf(out, ",'%s',char(13))", zCR); 1640 } 1641 if( nNL ){ 1642 raw_printf(out, ",'%s',char(10))", zNL); 1643 } 1644 } 1645 setTextMode(out, 1); 1646 } 1647 1648 /* 1649 ** Output the given string as a quoted according to C or TCL quoting rules. 1650 */ 1651 static void output_c_string(FILE *out, const char *z){ 1652 unsigned int c; 1653 fputc('"', out); 1654 while( (c = *(z++))!=0 ){ 1655 if( c=='\\' ){ 1656 fputc(c, out); 1657 fputc(c, out); 1658 }else if( c=='"' ){ 1659 fputc('\\', out); 1660 fputc('"', out); 1661 }else if( c=='\t' ){ 1662 fputc('\\', out); 1663 fputc('t', out); 1664 }else if( c=='\n' ){ 1665 fputc('\\', out); 1666 fputc('n', out); 1667 }else if( c=='\r' ){ 1668 fputc('\\', out); 1669 fputc('r', out); 1670 }else if( !isprint(c&0xff) ){ 1671 raw_printf(out, "\\%03o", c&0xff); 1672 }else{ 1673 fputc(c, out); 1674 } 1675 } 1676 fputc('"', out); 1677 } 1678 1679 /* 1680 ** Output the given string with characters that are special to 1681 ** HTML escaped. 1682 */ 1683 static void output_html_string(FILE *out, const char *z){ 1684 int i; 1685 if( z==0 ) z = ""; 1686 while( *z ){ 1687 for(i=0; z[i] 1688 && z[i]!='<' 1689 && z[i]!='&' 1690 && z[i]!='>' 1691 && z[i]!='\"' 1692 && z[i]!='\''; 1693 i++){} 1694 if( i>0 ){ 1695 utf8_printf(out,"%.*s",i,z); 1696 } 1697 if( z[i]=='<' ){ 1698 raw_printf(out,"<"); 1699 }else if( z[i]=='&' ){ 1700 raw_printf(out,"&"); 1701 }else if( z[i]=='>' ){ 1702 raw_printf(out,">"); 1703 }else if( z[i]=='\"' ){ 1704 raw_printf(out,"""); 1705 }else if( z[i]=='\'' ){ 1706 raw_printf(out,"'"); 1707 }else{ 1708 break; 1709 } 1710 z += i + 1; 1711 } 1712 } 1713 1714 /* 1715 ** If a field contains any character identified by a 1 in the following 1716 ** array, then the string must be quoted for CSV. 1717 */ 1718 static const char needCsvQuote[] = { 1719 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1720 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1721 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1722 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1724 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1725 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1726 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1727 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1728 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1729 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1730 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1731 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1732 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1733 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1734 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1735 }; 1736 1737 /* 1738 ** Output a single term of CSV. Actually, p->colSeparator is used for 1739 ** the separator, which may or may not be a comma. p->nullValue is 1740 ** the null value. Strings are quoted if necessary. The separator 1741 ** is only issued if bSep is true. 1742 */ 1743 static void output_csv(ShellState *p, const char *z, int bSep){ 1744 FILE *out = p->out; 1745 if( z==0 ){ 1746 utf8_printf(out,"%s",p->nullValue); 1747 }else{ 1748 int i; 1749 int nSep = strlen30(p->colSeparator); 1750 for(i=0; z[i]; i++){ 1751 if( needCsvQuote[((unsigned char*)z)[i]] 1752 || (z[i]==p->colSeparator[0] && 1753 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ 1754 i = 0; 1755 break; 1756 } 1757 } 1758 if( i==0 ){ 1759 putc('"', out); 1760 for(i=0; z[i]; i++){ 1761 if( z[i]=='"' ) putc('"', out); 1762 putc(z[i], out); 1763 } 1764 putc('"', out); 1765 }else{ 1766 utf8_printf(out, "%s", z); 1767 } 1768 } 1769 if( bSep ){ 1770 utf8_printf(p->out, "%s", p->colSeparator); 1771 } 1772 } 1773 1774 #ifdef SIGINT 1775 /* 1776 ** This routine runs when the user presses Ctrl-C 1777 */ 1778 static void interrupt_handler(int NotUsed){ 1779 UNUSED_PARAMETER(NotUsed); 1780 seenInterrupt++; 1781 if( seenInterrupt>2 ) exit(1); 1782 if( globalDb ) sqlite3_interrupt(globalDb); 1783 } 1784 #endif 1785 1786 #ifndef SQLITE_OMIT_AUTHORIZATION 1787 /* 1788 ** When the ".auth ON" is set, the following authorizer callback is 1789 ** invoked. It always returns SQLITE_OK. 1790 */ 1791 static int shellAuth( 1792 void *pClientData, 1793 int op, 1794 const char *zA1, 1795 const char *zA2, 1796 const char *zA3, 1797 const char *zA4 1798 ){ 1799 ShellState *p = (ShellState*)pClientData; 1800 static const char *azAction[] = { 0, 1801 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 1802 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 1803 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 1804 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 1805 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 1806 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 1807 "PRAGMA", "READ", "SELECT", 1808 "TRANSACTION", "UPDATE", "ATTACH", 1809 "DETACH", "ALTER_TABLE", "REINDEX", 1810 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 1811 "FUNCTION", "SAVEPOINT", "RECURSIVE" 1812 }; 1813 int i; 1814 const char *az[4]; 1815 az[0] = zA1; 1816 az[1] = zA2; 1817 az[2] = zA3; 1818 az[3] = zA4; 1819 utf8_printf(p->out, "authorizer: %s", azAction[op]); 1820 for(i=0; i<4; i++){ 1821 raw_printf(p->out, " "); 1822 if( az[i] ){ 1823 output_c_string(p->out, az[i]); 1824 }else{ 1825 raw_printf(p->out, "NULL"); 1826 } 1827 } 1828 raw_printf(p->out, "\n"); 1829 return SQLITE_OK; 1830 } 1831 #endif 1832 1833 /* 1834 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 1835 ** 1836 ** This routine converts some CREATE TABLE statements for shadow tables 1837 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 1838 */ 1839 static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 1840 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 1841 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 1842 }else{ 1843 utf8_printf(out, "%s%s", z, zTail); 1844 } 1845 } 1846 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 1847 char c = z[n]; 1848 z[n] = 0; 1849 printSchemaLine(out, z, zTail); 1850 z[n] = c; 1851 } 1852 1853 /* 1854 ** This is the callback routine that the shell 1855 ** invokes for each row of a query result. 1856 */ 1857 static int shell_callback( 1858 void *pArg, 1859 int nArg, /* Number of result columns */ 1860 char **azArg, /* Text of each result column */ 1861 char **azCol, /* Column names */ 1862 int *aiType /* Column types */ 1863 ){ 1864 int i; 1865 ShellState *p = (ShellState*)pArg; 1866 1867 switch( p->cMode ){ 1868 case MODE_Line: { 1869 int w = 5; 1870 if( azArg==0 ) break; 1871 for(i=0; i<nArg; i++){ 1872 int len = strlen30(azCol[i] ? azCol[i] : ""); 1873 if( len>w ) w = len; 1874 } 1875 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 1876 for(i=0; i<nArg; i++){ 1877 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 1878 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 1879 } 1880 break; 1881 } 1882 case MODE_Explain: 1883 case MODE_Column: { 1884 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; 1885 const int *colWidth; 1886 int showHdr; 1887 char *rowSep; 1888 if( p->cMode==MODE_Column ){ 1889 colWidth = p->colWidth; 1890 showHdr = p->showHeader; 1891 rowSep = p->rowSeparator; 1892 }else{ 1893 colWidth = aExplainWidths; 1894 showHdr = 1; 1895 rowSep = SEP_Row; 1896 } 1897 if( p->cnt++==0 ){ 1898 for(i=0; i<nArg; i++){ 1899 int w, n; 1900 if( i<ArraySize(p->colWidth) ){ 1901 w = colWidth[i]; 1902 }else{ 1903 w = 0; 1904 } 1905 if( w==0 ){ 1906 w = strlen30(azCol[i] ? azCol[i] : ""); 1907 if( w<10 ) w = 10; 1908 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue); 1909 if( w<n ) w = n; 1910 } 1911 if( i<ArraySize(p->actualWidth) ){ 1912 p->actualWidth[i] = w; 1913 } 1914 if( showHdr ){ 1915 utf8_width_print(p->out, w, azCol[i]); 1916 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); 1917 } 1918 } 1919 if( showHdr ){ 1920 for(i=0; i<nArg; i++){ 1921 int w; 1922 if( i<ArraySize(p->actualWidth) ){ 1923 w = p->actualWidth[i]; 1924 if( w<0 ) w = -w; 1925 }else{ 1926 w = 10; 1927 } 1928 utf8_printf(p->out,"%-*.*s%s",w,w, 1929 "----------------------------------------------------------" 1930 "----------------------------------------------------------", 1931 i==nArg-1 ? rowSep : " "); 1932 } 1933 } 1934 } 1935 if( azArg==0 ) break; 1936 for(i=0; i<nArg; i++){ 1937 int w; 1938 if( i<ArraySize(p->actualWidth) ){ 1939 w = p->actualWidth[i]; 1940 }else{ 1941 w = 10; 1942 } 1943 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){ 1944 w = strlen30(azArg[i]); 1945 } 1946 if( i==1 && p->aiIndent && p->pStmt ){ 1947 if( p->iIndent<p->nIndent ){ 1948 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 1949 } 1950 p->iIndent++; 1951 } 1952 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 1953 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); 1954 } 1955 break; 1956 } 1957 case MODE_Semi: { /* .schema and .fullschema output */ 1958 printSchemaLine(p->out, azArg[0], ";\n"); 1959 break; 1960 } 1961 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 1962 char *z; 1963 int j; 1964 int nParen = 0; 1965 char cEnd = 0; 1966 char c; 1967 int nLine = 0; 1968 assert( nArg==1 ); 1969 if( azArg[0]==0 ) break; 1970 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 1971 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 1972 ){ 1973 utf8_printf(p->out, "%s;\n", azArg[0]); 1974 break; 1975 } 1976 z = sqlite3_mprintf("%s", azArg[0]); 1977 j = 0; 1978 for(i=0; IsSpace(z[i]); i++){} 1979 for(; (c = z[i])!=0; i++){ 1980 if( IsSpace(c) ){ 1981 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 1982 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 1983 j--; 1984 } 1985 z[j++] = c; 1986 } 1987 while( j>0 && IsSpace(z[j-1]) ){ j--; } 1988 z[j] = 0; 1989 if( strlen30(z)>=79 ){ 1990 for(i=j=0; (c = z[i])!=0; i++){ 1991 if( c==cEnd ){ 1992 cEnd = 0; 1993 }else if( c=='"' || c=='\'' || c=='`' ){ 1994 cEnd = c; 1995 }else if( c=='[' ){ 1996 cEnd = ']'; 1997 }else if( c=='(' ){ 1998 nParen++; 1999 }else if( c==')' ){ 2000 nParen--; 2001 if( nLine>0 && nParen==0 && j>0 ){ 2002 printSchemaLineN(p->out, z, j, "\n"); 2003 j = 0; 2004 } 2005 } 2006 z[j++] = c; 2007 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){ 2008 if( c=='\n' ) j--; 2009 printSchemaLineN(p->out, z, j, "\n "); 2010 j = 0; 2011 nLine++; 2012 while( IsSpace(z[i+1]) ){ i++; } 2013 } 2014 } 2015 z[j] = 0; 2016 } 2017 printSchemaLine(p->out, z, ";\n"); 2018 sqlite3_free(z); 2019 break; 2020 } 2021 case MODE_List: { 2022 if( p->cnt++==0 && p->showHeader ){ 2023 for(i=0; i<nArg; i++){ 2024 utf8_printf(p->out,"%s%s",azCol[i], 2025 i==nArg-1 ? p->rowSeparator : p->colSeparator); 2026 } 2027 } 2028 if( azArg==0 ) break; 2029 for(i=0; i<nArg; i++){ 2030 char *z = azArg[i]; 2031 if( z==0 ) z = p->nullValue; 2032 utf8_printf(p->out, "%s", z); 2033 if( i<nArg-1 ){ 2034 utf8_printf(p->out, "%s", p->colSeparator); 2035 }else{ 2036 utf8_printf(p->out, "%s", p->rowSeparator); 2037 } 2038 } 2039 break; 2040 } 2041 case MODE_Html: { 2042 if( p->cnt++==0 && p->showHeader ){ 2043 raw_printf(p->out,"<TR>"); 2044 for(i=0; i<nArg; i++){ 2045 raw_printf(p->out,"<TH>"); 2046 output_html_string(p->out, azCol[i]); 2047 raw_printf(p->out,"</TH>\n"); 2048 } 2049 raw_printf(p->out,"</TR>\n"); 2050 } 2051 if( azArg==0 ) break; 2052 raw_printf(p->out,"<TR>"); 2053 for(i=0; i<nArg; i++){ 2054 raw_printf(p->out,"<TD>"); 2055 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2056 raw_printf(p->out,"</TD>\n"); 2057 } 2058 raw_printf(p->out,"</TR>\n"); 2059 break; 2060 } 2061 case MODE_Tcl: { 2062 if( p->cnt++==0 && p->showHeader ){ 2063 for(i=0; i<nArg; i++){ 2064 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 2065 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2066 } 2067 utf8_printf(p->out, "%s", p->rowSeparator); 2068 } 2069 if( azArg==0 ) break; 2070 for(i=0; i<nArg; i++){ 2071 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2072 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2073 } 2074 utf8_printf(p->out, "%s", p->rowSeparator); 2075 break; 2076 } 2077 case MODE_Csv: { 2078 setBinaryMode(p->out, 1); 2079 if( p->cnt++==0 && p->showHeader ){ 2080 for(i=0; i<nArg; i++){ 2081 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 2082 } 2083 utf8_printf(p->out, "%s", p->rowSeparator); 2084 } 2085 if( nArg>0 ){ 2086 for(i=0; i<nArg; i++){ 2087 output_csv(p, azArg[i], i<nArg-1); 2088 } 2089 utf8_printf(p->out, "%s", p->rowSeparator); 2090 } 2091 setTextMode(p->out, 1); 2092 break; 2093 } 2094 case MODE_Insert: { 2095 if( azArg==0 ) break; 2096 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 2097 if( p->showHeader ){ 2098 raw_printf(p->out,"("); 2099 for(i=0; i<nArg; i++){ 2100 if( i>0 ) raw_printf(p->out, ","); 2101 if( quoteChar(azCol[i]) ){ 2102 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 2103 utf8_printf(p->out, "%s", z); 2104 sqlite3_free(z); 2105 }else{ 2106 raw_printf(p->out, "%s", azCol[i]); 2107 } 2108 } 2109 raw_printf(p->out,")"); 2110 } 2111 p->cnt++; 2112 for(i=0; i<nArg; i++){ 2113 raw_printf(p->out, i>0 ? "," : " VALUES("); 2114 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2115 utf8_printf(p->out,"NULL"); 2116 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2117 output_quoted_escaped_string(p->out, azArg[i]); 2118 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2119 utf8_printf(p->out,"%s", azArg[i]); 2120 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2121 char z[50]; 2122 double r = sqlite3_column_double(p->pStmt, i); 2123 sqlite3_snprintf(50,z,"%!.20g", r); 2124 raw_printf(p->out, "%s", z); 2125 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2126 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2127 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2128 output_hex_blob(p->out, pBlob, nBlob); 2129 }else if( isNumber(azArg[i], 0) ){ 2130 utf8_printf(p->out,"%s", azArg[i]); 2131 }else{ 2132 output_quoted_escaped_string(p->out, azArg[i]); 2133 } 2134 } 2135 raw_printf(p->out,");\n"); 2136 break; 2137 } 2138 case MODE_Quote: { 2139 if( azArg==0 ) break; 2140 if( p->cnt==0 && p->showHeader ){ 2141 for(i=0; i<nArg; i++){ 2142 if( i>0 ) raw_printf(p->out, ","); 2143 output_quoted_string(p->out, azCol[i]); 2144 } 2145 raw_printf(p->out,"\n"); 2146 } 2147 p->cnt++; 2148 for(i=0; i<nArg; i++){ 2149 if( i>0 ) raw_printf(p->out, ","); 2150 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2151 utf8_printf(p->out,"NULL"); 2152 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2153 output_quoted_string(p->out, azArg[i]); 2154 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2155 utf8_printf(p->out,"%s", azArg[i]); 2156 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2157 char z[50]; 2158 double r = sqlite3_column_double(p->pStmt, i); 2159 sqlite3_snprintf(50,z,"%!.20g", r); 2160 raw_printf(p->out, "%s", z); 2161 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2162 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2163 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2164 output_hex_blob(p->out, pBlob, nBlob); 2165 }else if( isNumber(azArg[i], 0) ){ 2166 utf8_printf(p->out,"%s", azArg[i]); 2167 }else{ 2168 output_quoted_string(p->out, azArg[i]); 2169 } 2170 } 2171 raw_printf(p->out,"\n"); 2172 break; 2173 } 2174 case MODE_Ascii: { 2175 if( p->cnt++==0 && p->showHeader ){ 2176 for(i=0; i<nArg; i++){ 2177 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2178 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 2179 } 2180 utf8_printf(p->out, "%s", p->rowSeparator); 2181 } 2182 if( azArg==0 ) break; 2183 for(i=0; i<nArg; i++){ 2184 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2185 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 2186 } 2187 utf8_printf(p->out, "%s", p->rowSeparator); 2188 break; 2189 } 2190 } 2191 return 0; 2192 } 2193 2194 /* 2195 ** This is the callback routine that the SQLite library 2196 ** invokes for each row of a query result. 2197 */ 2198 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 2199 /* since we don't have type info, call the shell_callback with a NULL value */ 2200 return shell_callback(pArg, nArg, azArg, azCol, NULL); 2201 } 2202 2203 /* 2204 ** This is the callback routine from sqlite3_exec() that appends all 2205 ** output onto the end of a ShellText object. 2206 */ 2207 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 2208 ShellText *p = (ShellText*)pArg; 2209 int i; 2210 UNUSED_PARAMETER(az); 2211 if( p->n ) appendText(p, "|", 0); 2212 for(i=0; i<nArg; i++){ 2213 if( i ) appendText(p, ",", 0); 2214 if( azArg[i] ) appendText(p, azArg[i], 0); 2215 } 2216 return 0; 2217 } 2218 2219 /* 2220 ** Generate an appropriate SELFTEST table in the main database. 2221 */ 2222 static void createSelftestTable(ShellState *p){ 2223 char *zErrMsg = 0; 2224 sqlite3_exec(p->db, 2225 "SAVEPOINT selftest_init;\n" 2226 "CREATE TABLE IF NOT EXISTS selftest(\n" 2227 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 2228 " op TEXT,\n" /* Operator: memo run */ 2229 " cmd TEXT,\n" /* Command text */ 2230 " ans TEXT\n" /* Desired answer */ 2231 ");" 2232 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 2233 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 2234 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 2235 " 'memo','Tests generated by --init');\n" 2236 "INSERT INTO [_shell$self]\n" 2237 " SELECT 'run',\n" 2238 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 2239 "FROM sqlite_master ORDER BY 2'',224))',\n" 2240 " hex(sha3_query('SELECT type,name,tbl_name,sql " 2241 "FROM sqlite_master ORDER BY 2',224));\n" 2242 "INSERT INTO [_shell$self]\n" 2243 " SELECT 'run'," 2244 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 2245 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 2246 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 2247 " FROM (\n" 2248 " SELECT name FROM sqlite_master\n" 2249 " WHERE type='table'\n" 2250 " AND name<>'selftest'\n" 2251 " AND coalesce(rootpage,0)>0\n" 2252 " )\n" 2253 " ORDER BY name;\n" 2254 "INSERT INTO [_shell$self]\n" 2255 " VALUES('run','PRAGMA integrity_check','ok');\n" 2256 "INSERT INTO selftest(tno,op,cmd,ans)" 2257 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 2258 "DROP TABLE [_shell$self];" 2259 ,0,0,&zErrMsg); 2260 if( zErrMsg ){ 2261 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 2262 sqlite3_free(zErrMsg); 2263 } 2264 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 2265 } 2266 2267 2268 /* 2269 ** Set the destination table field of the ShellState structure to 2270 ** the name of the table given. Escape any quote characters in the 2271 ** table name. 2272 */ 2273 static void set_table_name(ShellState *p, const char *zName){ 2274 int i, n; 2275 int cQuote; 2276 char *z; 2277 2278 if( p->zDestTable ){ 2279 free(p->zDestTable); 2280 p->zDestTable = 0; 2281 } 2282 if( zName==0 ) return; 2283 cQuote = quoteChar(zName); 2284 n = strlen30(zName); 2285 if( cQuote ) n += 2; 2286 z = p->zDestTable = malloc( n+1 ); 2287 if( z==0 ){ 2288 raw_printf(stderr,"Error: out of memory\n"); 2289 exit(1); 2290 } 2291 n = 0; 2292 if( cQuote ) z[n++] = cQuote; 2293 for(i=0; zName[i]; i++){ 2294 z[n++] = zName[i]; 2295 if( zName[i]==cQuote ) z[n++] = cQuote; 2296 } 2297 if( cQuote ) z[n++] = cQuote; 2298 z[n] = 0; 2299 } 2300 2301 2302 /* 2303 ** Execute a query statement that will generate SQL output. Print 2304 ** the result columns, comma-separated, on a line and then add a 2305 ** semicolon terminator to the end of that line. 2306 ** 2307 ** If the number of columns is 1 and that column contains text "--" 2308 ** then write the semicolon on a separate line. That way, if a 2309 ** "--" comment occurs at the end of the statement, the comment 2310 ** won't consume the semicolon terminator. 2311 */ 2312 static int run_table_dump_query( 2313 ShellState *p, /* Query context */ 2314 const char *zSelect, /* SELECT statement to extract content */ 2315 const char *zFirstRow /* Print before first row, if not NULL */ 2316 ){ 2317 sqlite3_stmt *pSelect; 2318 int rc; 2319 int nResult; 2320 int i; 2321 const char *z; 2322 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 2323 if( rc!=SQLITE_OK || !pSelect ){ 2324 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2325 sqlite3_errmsg(p->db)); 2326 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2327 return rc; 2328 } 2329 rc = sqlite3_step(pSelect); 2330 nResult = sqlite3_column_count(pSelect); 2331 while( rc==SQLITE_ROW ){ 2332 if( zFirstRow ){ 2333 utf8_printf(p->out, "%s", zFirstRow); 2334 zFirstRow = 0; 2335 } 2336 z = (const char*)sqlite3_column_text(pSelect, 0); 2337 utf8_printf(p->out, "%s", z); 2338 for(i=1; i<nResult; i++){ 2339 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 2340 } 2341 if( z==0 ) z = ""; 2342 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 2343 if( z[0] ){ 2344 raw_printf(p->out, "\n;\n"); 2345 }else{ 2346 raw_printf(p->out, ";\n"); 2347 } 2348 rc = sqlite3_step(pSelect); 2349 } 2350 rc = sqlite3_finalize(pSelect); 2351 if( rc!=SQLITE_OK ){ 2352 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2353 sqlite3_errmsg(p->db)); 2354 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2355 } 2356 return rc; 2357 } 2358 2359 /* 2360 ** Allocate space and save off current error string. 2361 */ 2362 static char *save_err_msg( 2363 sqlite3 *db /* Database to query */ 2364 ){ 2365 int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); 2366 char *zErrMsg = sqlite3_malloc64(nErrMsg); 2367 if( zErrMsg ){ 2368 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); 2369 } 2370 return zErrMsg; 2371 } 2372 2373 #ifdef __linux__ 2374 /* 2375 ** Attempt to display I/O stats on Linux using /proc/PID/io 2376 */ 2377 static void displayLinuxIoStats(FILE *out){ 2378 FILE *in; 2379 char z[200]; 2380 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 2381 in = fopen(z, "rb"); 2382 if( in==0 ) return; 2383 while( fgets(z, sizeof(z), in)!=0 ){ 2384 static const struct { 2385 const char *zPattern; 2386 const char *zDesc; 2387 } aTrans[] = { 2388 { "rchar: ", "Bytes received by read():" }, 2389 { "wchar: ", "Bytes sent to write():" }, 2390 { "syscr: ", "Read() system calls:" }, 2391 { "syscw: ", "Write() system calls:" }, 2392 { "read_bytes: ", "Bytes read from storage:" }, 2393 { "write_bytes: ", "Bytes written to storage:" }, 2394 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 2395 }; 2396 int i; 2397 for(i=0; i<ArraySize(aTrans); i++){ 2398 int n = (int)strlen(aTrans[i].zPattern); 2399 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 2400 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 2401 break; 2402 } 2403 } 2404 } 2405 fclose(in); 2406 } 2407 #endif 2408 2409 /* 2410 ** Display a single line of status using 64-bit values. 2411 */ 2412 static void displayStatLine( 2413 ShellState *p, /* The shell context */ 2414 char *zLabel, /* Label for this one line */ 2415 char *zFormat, /* Format for the result */ 2416 int iStatusCtrl, /* Which status to display */ 2417 int bReset /* True to reset the stats */ 2418 ){ 2419 sqlite3_int64 iCur = -1; 2420 sqlite3_int64 iHiwtr = -1; 2421 int i, nPercent; 2422 char zLine[200]; 2423 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 2424 for(i=0, nPercent=0; zFormat[i]; i++){ 2425 if( zFormat[i]=='%' ) nPercent++; 2426 } 2427 if( nPercent>1 ){ 2428 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 2429 }else{ 2430 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 2431 } 2432 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 2433 } 2434 2435 /* 2436 ** Display memory stats. 2437 */ 2438 static int display_stats( 2439 sqlite3 *db, /* Database to query */ 2440 ShellState *pArg, /* Pointer to ShellState */ 2441 int bReset /* True to reset the stats */ 2442 ){ 2443 int iCur; 2444 int iHiwtr; 2445 2446 if( pArg && pArg->out ){ 2447 displayStatLine(pArg, "Memory Used:", 2448 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 2449 displayStatLine(pArg, "Number of Outstanding Allocations:", 2450 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 2451 if( pArg->shellFlgs & SHFLG_Pagecache ){ 2452 displayStatLine(pArg, "Number of Pcache Pages Used:", 2453 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 2454 } 2455 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 2456 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 2457 if( pArg->shellFlgs & SHFLG_Scratch ){ 2458 displayStatLine(pArg, "Number of Scratch Allocations Used:", 2459 "%lld (max %lld)", SQLITE_STATUS_SCRATCH_USED, bReset); 2460 } 2461 displayStatLine(pArg, "Number of Scratch Overflow Bytes:", 2462 "%lld (max %lld) bytes", SQLITE_STATUS_SCRATCH_OVERFLOW, bReset); 2463 displayStatLine(pArg, "Largest Allocation:", 2464 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 2465 displayStatLine(pArg, "Largest Pcache Allocation:", 2466 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 2467 displayStatLine(pArg, "Largest Scratch Allocation:", 2468 "%lld bytes", SQLITE_STATUS_SCRATCH_SIZE, bReset); 2469 #ifdef YYTRACKMAXSTACKDEPTH 2470 displayStatLine(pArg, "Deepest Parser Stack:", 2471 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 2472 #endif 2473 } 2474 2475 if( pArg && pArg->out && db ){ 2476 if( pArg->shellFlgs & SHFLG_Lookaside ){ 2477 iHiwtr = iCur = -1; 2478 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 2479 &iCur, &iHiwtr, bReset); 2480 raw_printf(pArg->out, 2481 "Lookaside Slots Used: %d (max %d)\n", 2482 iCur, iHiwtr); 2483 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 2484 &iCur, &iHiwtr, bReset); 2485 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 2486 iHiwtr); 2487 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 2488 &iCur, &iHiwtr, bReset); 2489 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 2490 iHiwtr); 2491 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 2492 &iCur, &iHiwtr, bReset); 2493 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 2494 iHiwtr); 2495 } 2496 iHiwtr = iCur = -1; 2497 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 2498 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 2499 iCur); 2500 iHiwtr = iCur = -1; 2501 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 2502 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 2503 iHiwtr = iCur = -1; 2504 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 2505 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 2506 iHiwtr = iCur = -1; 2507 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 2508 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 2509 iHiwtr = iCur = -1; 2510 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 2511 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 2512 iCur); 2513 iHiwtr = iCur = -1; 2514 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 2515 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 2516 iCur); 2517 } 2518 2519 if( pArg && pArg->out && db && pArg->pStmt ){ 2520 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 2521 bReset); 2522 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 2523 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 2524 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 2525 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 2526 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 2527 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2528 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 2529 } 2530 2531 #ifdef __linux__ 2532 displayLinuxIoStats(pArg->out); 2533 #endif 2534 2535 /* Do not remove this machine readable comment: extra-stats-output-here */ 2536 2537 return 0; 2538 } 2539 2540 /* 2541 ** Display scan stats. 2542 */ 2543 static void display_scanstats( 2544 sqlite3 *db, /* Database to query */ 2545 ShellState *pArg /* Pointer to ShellState */ 2546 ){ 2547 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 2548 UNUSED_PARAMETER(db); 2549 UNUSED_PARAMETER(pArg); 2550 #else 2551 int i, k, n, mx; 2552 raw_printf(pArg->out, "-------- scanstats --------\n"); 2553 mx = 0; 2554 for(k=0; k<=mx; k++){ 2555 double rEstLoop = 1.0; 2556 for(i=n=0; 1; i++){ 2557 sqlite3_stmt *p = pArg->pStmt; 2558 sqlite3_int64 nLoop, nVisit; 2559 double rEst; 2560 int iSid; 2561 const char *zExplain; 2562 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 2563 break; 2564 } 2565 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 2566 if( iSid>mx ) mx = iSid; 2567 if( iSid!=k ) continue; 2568 if( n==0 ){ 2569 rEstLoop = (double)nLoop; 2570 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 2571 } 2572 n++; 2573 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 2574 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 2575 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 2576 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 2577 rEstLoop *= rEst; 2578 raw_printf(pArg->out, 2579 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 2580 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 2581 ); 2582 } 2583 } 2584 raw_printf(pArg->out, "---------------------------\n"); 2585 #endif 2586 } 2587 2588 /* 2589 ** Parameter azArray points to a zero-terminated array of strings. zStr 2590 ** points to a single nul-terminated string. Return non-zero if zStr 2591 ** is equal, according to strcmp(), to any of the strings in the array. 2592 ** Otherwise, return zero. 2593 */ 2594 static int str_in_array(const char *zStr, const char **azArray){ 2595 int i; 2596 for(i=0; azArray[i]; i++){ 2597 if( 0==strcmp(zStr, azArray[i]) ) return 1; 2598 } 2599 return 0; 2600 } 2601 2602 /* 2603 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate 2604 ** and populate the ShellState.aiIndent[] array with the number of 2605 ** spaces each opcode should be indented before it is output. 2606 ** 2607 ** The indenting rules are: 2608 ** 2609 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 2610 ** all opcodes that occur between the p2 jump destination and the opcode 2611 ** itself by 2 spaces. 2612 ** 2613 ** * For each "Goto", if the jump destination is earlier in the program 2614 ** and ends on one of: 2615 ** Yield SeekGt SeekLt RowSetRead Rewind 2616 ** or if the P1 parameter is one instead of zero, 2617 ** then indent all opcodes between the earlier instruction 2618 ** and "Goto" by 2 spaces. 2619 */ 2620 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 2621 const char *zSql; /* The text of the SQL statement */ 2622 const char *z; /* Used to check if this is an EXPLAIN */ 2623 int *abYield = 0; /* True if op is an OP_Yield */ 2624 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 2625 int iOp; /* Index of operation in p->aiIndent[] */ 2626 2627 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 2628 "NextIfOpen", "PrevIfOpen", 0 }; 2629 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 2630 "Rewind", 0 }; 2631 const char *azGoto[] = { "Goto", 0 }; 2632 2633 /* Try to figure out if this is really an EXPLAIN statement. If this 2634 ** cannot be verified, return early. */ 2635 if( sqlite3_column_count(pSql)!=8 ){ 2636 p->cMode = p->mode; 2637 return; 2638 } 2639 zSql = sqlite3_sql(pSql); 2640 if( zSql==0 ) return; 2641 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 2642 if( sqlite3_strnicmp(z, "explain", 7) ){ 2643 p->cMode = p->mode; 2644 return; 2645 } 2646 2647 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 2648 int i; 2649 int iAddr = sqlite3_column_int(pSql, 0); 2650 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 2651 2652 /* Set p2 to the P2 field of the current opcode. Then, assuming that 2653 ** p2 is an instruction address, set variable p2op to the index of that 2654 ** instruction in the aiIndent[] array. p2 and p2op may be different if 2655 ** the current instruction is part of a sub-program generated by an 2656 ** SQL trigger or foreign key. */ 2657 int p2 = sqlite3_column_int(pSql, 3); 2658 int p2op = (p2 + (iOp-iAddr)); 2659 2660 /* Grow the p->aiIndent array as required */ 2661 if( iOp>=nAlloc ){ 2662 if( iOp==0 ){ 2663 /* Do further verfication that this is explain output. Abort if 2664 ** it is not */ 2665 static const char *explainCols[] = { 2666 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 2667 int jj; 2668 for(jj=0; jj<ArraySize(explainCols); jj++){ 2669 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 2670 p->cMode = p->mode; 2671 sqlite3_reset(pSql); 2672 return; 2673 } 2674 } 2675 } 2676 nAlloc += 100; 2677 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 2678 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 2679 } 2680 abYield[iOp] = str_in_array(zOp, azYield); 2681 p->aiIndent[iOp] = 0; 2682 p->nIndent = iOp+1; 2683 2684 if( str_in_array(zOp, azNext) ){ 2685 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2686 } 2687 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 2688 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 2689 ){ 2690 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2691 } 2692 } 2693 2694 p->iIndent = 0; 2695 sqlite3_free(abYield); 2696 sqlite3_reset(pSql); 2697 } 2698 2699 /* 2700 ** Free the array allocated by explain_data_prepare(). 2701 */ 2702 static void explain_data_delete(ShellState *p){ 2703 sqlite3_free(p->aiIndent); 2704 p->aiIndent = 0; 2705 p->nIndent = 0; 2706 p->iIndent = 0; 2707 } 2708 2709 /* 2710 ** Disable and restore .wheretrace and .selecttrace settings. 2711 */ 2712 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2713 extern int sqlite3SelectTrace; 2714 static int savedSelectTrace; 2715 #endif 2716 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2717 extern int sqlite3WhereTrace; 2718 static int savedWhereTrace; 2719 #endif 2720 static void disable_debug_trace_modes(void){ 2721 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2722 savedSelectTrace = sqlite3SelectTrace; 2723 sqlite3SelectTrace = 0; 2724 #endif 2725 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2726 savedWhereTrace = sqlite3WhereTrace; 2727 sqlite3WhereTrace = 0; 2728 #endif 2729 } 2730 static void restore_debug_trace_modes(void){ 2731 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2732 sqlite3SelectTrace = savedSelectTrace; 2733 #endif 2734 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2735 sqlite3WhereTrace = savedWhereTrace; 2736 #endif 2737 } 2738 2739 /* 2740 ** Run a prepared statement 2741 */ 2742 static void exec_prepared_stmt( 2743 ShellState *pArg, /* Pointer to ShellState */ 2744 sqlite3_stmt *pStmt, /* Statment to run */ 2745 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */ 2746 ){ 2747 int rc; 2748 2749 /* perform the first step. this will tell us if we 2750 ** have a result set or not and how wide it is. 2751 */ 2752 rc = sqlite3_step(pStmt); 2753 /* if we have a result set... */ 2754 if( SQLITE_ROW == rc ){ 2755 /* if we have a callback... */ 2756 if( xCallback ){ 2757 /* allocate space for col name ptr, value ptr, and type */ 2758 int nCol = sqlite3_column_count(pStmt); 2759 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 2760 if( !pData ){ 2761 rc = SQLITE_NOMEM; 2762 }else{ 2763 char **azCols = (char **)pData; /* Names of result columns */ 2764 char **azVals = &azCols[nCol]; /* Results */ 2765 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 2766 int i, x; 2767 assert(sizeof(int) <= sizeof(char *)); 2768 /* save off ptrs to column names */ 2769 for(i=0; i<nCol; i++){ 2770 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 2771 } 2772 do{ 2773 /* extract the data and data types */ 2774 for(i=0; i<nCol; i++){ 2775 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 2776 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 2777 azVals[i] = ""; 2778 }else{ 2779 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 2780 } 2781 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 2782 rc = SQLITE_NOMEM; 2783 break; /* from for */ 2784 } 2785 } /* end for */ 2786 2787 /* if data and types extracted successfully... */ 2788 if( SQLITE_ROW == rc ){ 2789 /* call the supplied callback with the result row data */ 2790 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){ 2791 rc = SQLITE_ABORT; 2792 }else{ 2793 rc = sqlite3_step(pStmt); 2794 } 2795 } 2796 } while( SQLITE_ROW == rc ); 2797 sqlite3_free(pData); 2798 } 2799 }else{ 2800 do{ 2801 rc = sqlite3_step(pStmt); 2802 } while( rc == SQLITE_ROW ); 2803 } 2804 } 2805 } 2806 2807 /* 2808 ** Execute a statement or set of statements. Print 2809 ** any result rows/columns depending on the current mode 2810 ** set via the supplied callback. 2811 ** 2812 ** This is very similar to SQLite's built-in sqlite3_exec() 2813 ** function except it takes a slightly different callback 2814 ** and callback data argument. 2815 */ 2816 static int shell_exec( 2817 sqlite3 *db, /* An open database */ 2818 const char *zSql, /* SQL to be evaluated */ 2819 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */ 2820 /* (not the same as sqlite3_exec) */ 2821 ShellState *pArg, /* Pointer to ShellState */ 2822 char **pzErrMsg /* Error msg written here */ 2823 ){ 2824 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 2825 int rc = SQLITE_OK; /* Return Code */ 2826 int rc2; 2827 const char *zLeftover; /* Tail of unprocessed SQL */ 2828 2829 if( pzErrMsg ){ 2830 *pzErrMsg = NULL; 2831 } 2832 2833 while( zSql[0] && (SQLITE_OK == rc) ){ 2834 static const char *zStmtSql; 2835 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 2836 if( SQLITE_OK != rc ){ 2837 if( pzErrMsg ){ 2838 *pzErrMsg = save_err_msg(db); 2839 } 2840 }else{ 2841 if( !pStmt ){ 2842 /* this happens for a comment or white-space */ 2843 zSql = zLeftover; 2844 while( IsSpace(zSql[0]) ) zSql++; 2845 continue; 2846 } 2847 zStmtSql = sqlite3_sql(pStmt); 2848 if( zStmtSql==0 ) zStmtSql = ""; 2849 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 2850 2851 /* save off the prepared statment handle and reset row count */ 2852 if( pArg ){ 2853 pArg->pStmt = pStmt; 2854 pArg->cnt = 0; 2855 } 2856 2857 /* echo the sql statement if echo on */ 2858 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 2859 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 2860 } 2861 2862 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 2863 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){ 2864 sqlite3_stmt *pExplain; 2865 char *zEQP; 2866 disable_debug_trace_modes(); 2867 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 2868 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 2869 if( rc==SQLITE_OK ){ 2870 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 2871 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0)); 2872 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1)); 2873 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2)); 2874 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3)); 2875 } 2876 } 2877 sqlite3_finalize(pExplain); 2878 sqlite3_free(zEQP); 2879 if( pArg->autoEQP>=2 ){ 2880 /* Also do an EXPLAIN for ".eqp full" mode */ 2881 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 2882 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 2883 if( rc==SQLITE_OK ){ 2884 pArg->cMode = MODE_Explain; 2885 explain_data_prepare(pArg, pExplain); 2886 exec_prepared_stmt(pArg, pExplain, xCallback); 2887 explain_data_delete(pArg); 2888 } 2889 sqlite3_finalize(pExplain); 2890 sqlite3_free(zEQP); 2891 } 2892 restore_debug_trace_modes(); 2893 } 2894 2895 if( pArg ){ 2896 pArg->cMode = pArg->mode; 2897 if( pArg->autoExplain 2898 && sqlite3_column_count(pStmt)==8 2899 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0 2900 ){ 2901 pArg->cMode = MODE_Explain; 2902 } 2903 2904 /* If the shell is currently in ".explain" mode, gather the extra 2905 ** data required to add indents to the output.*/ 2906 if( pArg->cMode==MODE_Explain ){ 2907 explain_data_prepare(pArg, pStmt); 2908 } 2909 } 2910 2911 exec_prepared_stmt(pArg, pStmt, xCallback); 2912 explain_data_delete(pArg); 2913 2914 /* print usage stats if stats on */ 2915 if( pArg && pArg->statsOn ){ 2916 display_stats(db, pArg, 0); 2917 } 2918 2919 /* print loop-counters if required */ 2920 if( pArg && pArg->scanstatsOn ){ 2921 display_scanstats(db, pArg); 2922 } 2923 2924 /* Finalize the statement just executed. If this fails, save a 2925 ** copy of the error message. Otherwise, set zSql to point to the 2926 ** next statement to execute. */ 2927 rc2 = sqlite3_finalize(pStmt); 2928 if( rc!=SQLITE_NOMEM ) rc = rc2; 2929 if( rc==SQLITE_OK ){ 2930 zSql = zLeftover; 2931 while( IsSpace(zSql[0]) ) zSql++; 2932 }else if( pzErrMsg ){ 2933 *pzErrMsg = save_err_msg(db); 2934 } 2935 2936 /* clear saved stmt handle */ 2937 if( pArg ){ 2938 pArg->pStmt = NULL; 2939 } 2940 } 2941 } /* end while */ 2942 2943 return rc; 2944 } 2945 2946 /* 2947 ** Release memory previously allocated by tableColumnList(). 2948 */ 2949 static void freeColumnList(char **azCol){ 2950 int i; 2951 for(i=1; azCol[i]; i++){ 2952 sqlite3_free(azCol[i]); 2953 } 2954 /* azCol[0] is a static string */ 2955 sqlite3_free(azCol); 2956 } 2957 2958 /* 2959 ** Return a list of pointers to strings which are the names of all 2960 ** columns in table zTab. The memory to hold the names is dynamically 2961 ** allocated and must be released by the caller using a subsequent call 2962 ** to freeColumnList(). 2963 ** 2964 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 2965 ** value that needs to be preserved, then azCol[0] is filled in with the 2966 ** name of the rowid column. 2967 ** 2968 ** The first regular column in the table is azCol[1]. The list is terminated 2969 ** by an entry with azCol[i]==0. 2970 */ 2971 static char **tableColumnList(ShellState *p, const char *zTab){ 2972 char **azCol = 0; 2973 sqlite3_stmt *pStmt; 2974 char *zSql; 2975 int nCol = 0; 2976 int nAlloc = 0; 2977 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 2978 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 2979 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 2980 int rc; 2981 2982 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 2983 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 2984 sqlite3_free(zSql); 2985 if( rc ) return 0; 2986 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 2987 if( nCol>=nAlloc-2 ){ 2988 nAlloc = nAlloc*2 + nCol + 10; 2989 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 2990 if( azCol==0 ){ 2991 raw_printf(stderr, "Error: out of memory\n"); 2992 exit(1); 2993 } 2994 } 2995 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 2996 if( sqlite3_column_int(pStmt, 5) ){ 2997 nPK++; 2998 if( nPK==1 2999 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 3000 "INTEGER")==0 3001 ){ 3002 isIPK = 1; 3003 }else{ 3004 isIPK = 0; 3005 } 3006 } 3007 } 3008 sqlite3_finalize(pStmt); 3009 azCol[0] = 0; 3010 azCol[nCol+1] = 0; 3011 3012 /* The decision of whether or not a rowid really needs to be preserved 3013 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 3014 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 3015 ** rowids on tables where the rowid is inaccessible because there are other 3016 ** columns in the table named "rowid", "_rowid_", and "oid". 3017 */ 3018 if( preserveRowid && isIPK ){ 3019 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 3020 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 3021 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 3022 ** ROWID aliases. To distinguish these cases, check to see if 3023 ** there is a "pk" entry in "PRAGMA index_list". There will be 3024 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 3025 */ 3026 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 3027 " WHERE origin='pk'", zTab); 3028 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3029 sqlite3_free(zSql); 3030 if( rc ){ 3031 freeColumnList(azCol); 3032 return 0; 3033 } 3034 rc = sqlite3_step(pStmt); 3035 sqlite3_finalize(pStmt); 3036 preserveRowid = rc==SQLITE_ROW; 3037 } 3038 if( preserveRowid ){ 3039 /* Only preserve the rowid if we can find a name to use for the 3040 ** rowid */ 3041 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 3042 int i, j; 3043 for(j=0; j<3; j++){ 3044 for(i=1; i<=nCol; i++){ 3045 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 3046 } 3047 if( i>nCol ){ 3048 /* At this point, we know that azRowid[j] is not the name of any 3049 ** ordinary column in the table. Verify that azRowid[j] is a valid 3050 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 3051 ** tables will fail this last check */ 3052 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 3053 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 3054 break; 3055 } 3056 } 3057 } 3058 return azCol; 3059 } 3060 3061 /* 3062 ** Toggle the reverse_unordered_selects setting. 3063 */ 3064 static void toggleSelectOrder(sqlite3 *db){ 3065 sqlite3_stmt *pStmt = 0; 3066 int iSetting = 0; 3067 char zStmt[100]; 3068 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 3069 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 3070 iSetting = sqlite3_column_int(pStmt, 0); 3071 } 3072 sqlite3_finalize(pStmt); 3073 sqlite3_snprintf(sizeof(zStmt), zStmt, 3074 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 3075 sqlite3_exec(db, zStmt, 0, 0, 0); 3076 } 3077 3078 /* 3079 ** This is a different callback routine used for dumping the database. 3080 ** Each row received by this callback consists of a table name, 3081 ** the table type ("index" or "table") and SQL to create the table. 3082 ** This routine should print text sufficient to recreate the table. 3083 */ 3084 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 3085 int rc; 3086 const char *zTable; 3087 const char *zType; 3088 const char *zSql; 3089 ShellState *p = (ShellState *)pArg; 3090 3091 UNUSED_PARAMETER(azNotUsed); 3092 if( nArg!=3 ) return 1; 3093 zTable = azArg[0]; 3094 zType = azArg[1]; 3095 zSql = azArg[2]; 3096 3097 if( strcmp(zTable, "sqlite_sequence")==0 ){ 3098 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 3099 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){ 3100 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 3101 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 3102 return 0; 3103 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 3104 char *zIns; 3105 if( !p->writableSchema ){ 3106 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 3107 p->writableSchema = 1; 3108 } 3109 zIns = sqlite3_mprintf( 3110 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" 3111 "VALUES('table','%q','%q',0,'%q');", 3112 zTable, zTable, zSql); 3113 utf8_printf(p->out, "%s\n", zIns); 3114 sqlite3_free(zIns); 3115 return 0; 3116 }else{ 3117 printSchemaLine(p->out, zSql, ";\n"); 3118 } 3119 3120 if( strcmp(zType, "table")==0 ){ 3121 ShellText sSelect; 3122 ShellText sTable; 3123 char **azCol; 3124 int i; 3125 char *savedDestTable; 3126 int savedMode; 3127 3128 azCol = tableColumnList(p, zTable); 3129 if( azCol==0 ){ 3130 p->nErr++; 3131 return 0; 3132 } 3133 3134 /* Always quote the table name, even if it appears to be pure ascii, 3135 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 3136 initText(&sTable); 3137 appendText(&sTable, zTable, quoteChar(zTable)); 3138 /* If preserving the rowid, add a column list after the table name. 3139 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 3140 ** instead of the usual "INSERT INTO tab VALUES(...)". 3141 */ 3142 if( azCol[0] ){ 3143 appendText(&sTable, "(", 0); 3144 appendText(&sTable, azCol[0], 0); 3145 for(i=1; azCol[i]; i++){ 3146 appendText(&sTable, ",", 0); 3147 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 3148 } 3149 appendText(&sTable, ")", 0); 3150 } 3151 3152 /* Build an appropriate SELECT statement */ 3153 initText(&sSelect); 3154 appendText(&sSelect, "SELECT ", 0); 3155 if( azCol[0] ){ 3156 appendText(&sSelect, azCol[0], 0); 3157 appendText(&sSelect, ",", 0); 3158 } 3159 for(i=1; azCol[i]; i++){ 3160 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 3161 if( azCol[i+1] ){ 3162 appendText(&sSelect, ",", 0); 3163 } 3164 } 3165 freeColumnList(azCol); 3166 appendText(&sSelect, " FROM ", 0); 3167 appendText(&sSelect, zTable, quoteChar(zTable)); 3168 3169 savedDestTable = p->zDestTable; 3170 savedMode = p->mode; 3171 p->zDestTable = sTable.z; 3172 p->mode = p->cMode = MODE_Insert; 3173 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0); 3174 if( (rc&0xff)==SQLITE_CORRUPT ){ 3175 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3176 toggleSelectOrder(p->db); 3177 shell_exec(p->db, sSelect.z, shell_callback, p, 0); 3178 toggleSelectOrder(p->db); 3179 } 3180 p->zDestTable = savedDestTable; 3181 p->mode = savedMode; 3182 freeText(&sTable); 3183 freeText(&sSelect); 3184 if( rc ) p->nErr++; 3185 } 3186 return 0; 3187 } 3188 3189 /* 3190 ** Run zQuery. Use dump_callback() as the callback routine so that 3191 ** the contents of the query are output as SQL statements. 3192 ** 3193 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 3194 ** "ORDER BY rowid DESC" to the end. 3195 */ 3196 static int run_schema_dump_query( 3197 ShellState *p, 3198 const char *zQuery 3199 ){ 3200 int rc; 3201 char *zErr = 0; 3202 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 3203 if( rc==SQLITE_CORRUPT ){ 3204 char *zQ2; 3205 int len = strlen30(zQuery); 3206 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3207 if( zErr ){ 3208 utf8_printf(p->out, "/****** %s ******/\n", zErr); 3209 sqlite3_free(zErr); 3210 zErr = 0; 3211 } 3212 zQ2 = malloc( len+100 ); 3213 if( zQ2==0 ) return rc; 3214 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 3215 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 3216 if( rc ){ 3217 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 3218 }else{ 3219 rc = SQLITE_CORRUPT; 3220 } 3221 sqlite3_free(zErr); 3222 free(zQ2); 3223 } 3224 return rc; 3225 } 3226 3227 /* 3228 ** Text of a help message 3229 */ 3230 static char zHelp[] = 3231 #ifndef SQLITE_OMIT_AUTHORIZATION 3232 ".auth ON|OFF Show authorizer callbacks\n" 3233 #endif 3234 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" 3235 ".bail on|off Stop after hitting an error. Default OFF\n" 3236 ".binary on|off Turn binary output on or off. Default OFF\n" 3237 ".changes on|off Show number of rows changed by SQL\n" 3238 ".check GLOB Fail if output since .testcase does not match\n" 3239 ".clone NEWDB Clone data into NEWDB from the existing database\n" 3240 ".databases List names and files of attached databases\n" 3241 ".dbinfo ?DB? Show status information about the database\n" 3242 ".dump ?TABLE? ... Dump the database in an SQL text format\n" 3243 " If TABLE specified, only dump tables matching\n" 3244 " LIKE pattern TABLE.\n" 3245 ".echo on|off Turn command echo on or off\n" 3246 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n" 3247 ".exit Exit this program\n" 3248 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n" 3249 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n" 3250 ".headers on|off Turn display of headers on or off\n" 3251 ".help Show this message\n" 3252 ".import FILE TABLE Import data from FILE into TABLE\n" 3253 #ifndef SQLITE_OMIT_TEST_CONTROL 3254 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n" 3255 #endif 3256 ".indexes ?TABLE? Show names of all indexes\n" 3257 " If TABLE specified, only show indexes for tables\n" 3258 " matching LIKE pattern TABLE.\n" 3259 #ifdef SQLITE_ENABLE_IOTRACE 3260 ".iotrace FILE Enable I/O diagnostic logging to FILE\n" 3261 #endif 3262 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n" 3263 ".lint OPTIONS Report potential schema issues. Options:\n" 3264 " fkey-indexes Find missing foreign key indexes\n" 3265 #ifndef SQLITE_OMIT_LOAD_EXTENSION 3266 ".load FILE ?ENTRY? Load an extension library\n" 3267 #endif 3268 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n" 3269 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" 3270 " ascii Columns/rows delimited by 0x1F and 0x1E\n" 3271 " csv Comma-separated values\n" 3272 " column Left-aligned columns. (See .width)\n" 3273 " html HTML <table> code\n" 3274 " insert SQL insert statements for TABLE\n" 3275 " line One value per line\n" 3276 " list Values delimited by \"|\"\n" 3277 " quote Escape answers as for SQL\n" 3278 " tabs Tab-separated values\n" 3279 " tcl TCL list elements\n" 3280 ".nullvalue STRING Use STRING in place of NULL values\n" 3281 ".once FILENAME Output for the next SQL command only to FILENAME\n" 3282 ".open ?--new? ?FILE? Close existing database and reopen FILE\n" 3283 " The --new starts with an empty file\n" 3284 ".output ?FILENAME? Send output to FILENAME or stdout\n" 3285 ".print STRING... Print literal STRING\n" 3286 ".prompt MAIN CONTINUE Replace the standard prompts\n" 3287 ".quit Exit this program\n" 3288 ".read FILENAME Execute SQL in FILENAME\n" 3289 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" 3290 ".save FILE Write in-memory database into FILE\n" 3291 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n" 3292 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n" 3293 " Add --indent for pretty-printing\n" 3294 ".selftest ?--init? Run tests defined in the SELFTEST table\n" 3295 ".separator COL ?ROW? Change the column separator and optionally the row\n" 3296 " separator for both the output mode and .import\n" 3297 #if defined(SQLITE_ENABLE_SESSION) 3298 ".session CMD ... Create or control sessions\n" 3299 #endif 3300 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n" 3301 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n" 3302 ".show Show the current values for various settings\n" 3303 ".stats ?on|off? Show stats or turn stats on or off\n" 3304 ".system CMD ARGS... Run CMD ARGS... in a system shell\n" 3305 ".tables ?TABLE? List names of tables\n" 3306 " If TABLE specified, only list tables matching\n" 3307 " LIKE pattern TABLE.\n" 3308 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n" 3309 ".timeout MS Try opening locked tables for MS milliseconds\n" 3310 ".timer on|off Turn SQL timer on or off\n" 3311 ".trace FILE|off Output each SQL statement as it is run\n" 3312 ".vfsinfo ?AUX? Information about the top-level VFS\n" 3313 ".vfslist List all available VFSes\n" 3314 ".vfsname ?AUX? Print the name of the VFS stack\n" 3315 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" 3316 " Negative values right-justify\n" 3317 ; 3318 3319 #if defined(SQLITE_ENABLE_SESSION) 3320 /* 3321 ** Print help information for the ".sessions" command 3322 */ 3323 void session_help(ShellState *p){ 3324 raw_printf(p->out, 3325 ".session ?NAME? SUBCOMMAND ?ARGS...?\n" 3326 "If ?NAME? is omitted, the first defined session is used.\n" 3327 "Subcommands:\n" 3328 " attach TABLE Attach TABLE\n" 3329 " changeset FILE Write a changeset into FILE\n" 3330 " close Close one session\n" 3331 " enable ?BOOLEAN? Set or query the enable bit\n" 3332 " filter GLOB... Reject tables matching GLOBs\n" 3333 " indirect ?BOOLEAN? Mark or query the indirect status\n" 3334 " isempty Query whether the session is empty\n" 3335 " list List currently open session names\n" 3336 " open DB NAME Open a new session on DB\n" 3337 " patchset FILE Write a patchset into FILE\n" 3338 ); 3339 } 3340 #endif 3341 3342 3343 /* Forward reference */ 3344 static int process_input(ShellState *p, FILE *in); 3345 3346 /* 3347 ** Read the content of file zName into memory obtained from sqlite3_malloc64() 3348 ** and return a pointer to the buffer. The caller is responsible for freeing 3349 ** the memory. 3350 ** 3351 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 3352 ** read. 3353 ** 3354 ** For convenience, a nul-terminator byte is always appended to the data read 3355 ** from the file before the buffer is returned. This byte is not included in 3356 ** the final value of (*pnByte), if applicable. 3357 ** 3358 ** NULL is returned if any error is encountered. The final value of *pnByte 3359 ** is undefined in this case. 3360 */ 3361 static char *readFile(const char *zName, int *pnByte){ 3362 FILE *in = fopen(zName, "rb"); 3363 long nIn; 3364 size_t nRead; 3365 char *pBuf; 3366 if( in==0 ) return 0; 3367 fseek(in, 0, SEEK_END); 3368 nIn = ftell(in); 3369 rewind(in); 3370 pBuf = sqlite3_malloc64( nIn+1 ); 3371 if( pBuf==0 ) return 0; 3372 nRead = fread(pBuf, nIn, 1, in); 3373 fclose(in); 3374 if( nRead!=1 ){ 3375 sqlite3_free(pBuf); 3376 return 0; 3377 } 3378 pBuf[nIn] = 0; 3379 if( pnByte ) *pnByte = nIn; 3380 return pBuf; 3381 } 3382 3383 /* 3384 ** Implementation of the "readfile(X)" SQL function. The entire content 3385 ** of the file named X is read and returned as a BLOB. NULL is returned 3386 ** if the file does not exist or is unreadable. 3387 */ 3388 static void readfileFunc( 3389 sqlite3_context *context, 3390 int argc, 3391 sqlite3_value **argv 3392 ){ 3393 const char *zName; 3394 void *pBuf; 3395 int nBuf; 3396 3397 UNUSED_PARAMETER(argc); 3398 zName = (const char*)sqlite3_value_text(argv[0]); 3399 if( zName==0 ) return; 3400 pBuf = readFile(zName, &nBuf); 3401 if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free); 3402 } 3403 3404 /* 3405 ** Implementation of the "writefile(X,Y)" SQL function. The argument Y 3406 ** is written into file X. The number of bytes written is returned. Or 3407 ** NULL is returned if something goes wrong, such as being unable to open 3408 ** file X for writing. 3409 */ 3410 static void writefileFunc( 3411 sqlite3_context *context, 3412 int argc, 3413 sqlite3_value **argv 3414 ){ 3415 FILE *out; 3416 const char *z; 3417 sqlite3_int64 rc; 3418 const char *zFile; 3419 3420 UNUSED_PARAMETER(argc); 3421 zFile = (const char*)sqlite3_value_text(argv[0]); 3422 if( zFile==0 ) return; 3423 out = fopen(zFile, "wb"); 3424 if( out==0 ) return; 3425 z = (const char*)sqlite3_value_blob(argv[1]); 3426 if( z==0 ){ 3427 rc = 0; 3428 }else{ 3429 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out); 3430 } 3431 fclose(out); 3432 sqlite3_result_int64(context, rc); 3433 } 3434 3435 #if defined(SQLITE_ENABLE_SESSION) 3436 /* 3437 ** Close a single OpenSession object and release all of its associated 3438 ** resources. 3439 */ 3440 static void session_close(OpenSession *pSession){ 3441 int i; 3442 sqlite3session_delete(pSession->p); 3443 sqlite3_free(pSession->zName); 3444 for(i=0; i<pSession->nFilter; i++){ 3445 sqlite3_free(pSession->azFilter[i]); 3446 } 3447 sqlite3_free(pSession->azFilter); 3448 memset(pSession, 0, sizeof(OpenSession)); 3449 } 3450 #endif 3451 3452 /* 3453 ** Close all OpenSession objects and release all associated resources. 3454 */ 3455 #if defined(SQLITE_ENABLE_SESSION) 3456 static void session_close_all(ShellState *p){ 3457 int i; 3458 for(i=0; i<p->nSession; i++){ 3459 session_close(&p->aSession[i]); 3460 } 3461 p->nSession = 0; 3462 } 3463 #else 3464 # define session_close_all(X) 3465 #endif 3466 3467 /* 3468 ** Implementation of the xFilter function for an open session. Omit 3469 ** any tables named by ".session filter" but let all other table through. 3470 */ 3471 #if defined(SQLITE_ENABLE_SESSION) 3472 static int session_filter(void *pCtx, const char *zTab){ 3473 OpenSession *pSession = (OpenSession*)pCtx; 3474 int i; 3475 for(i=0; i<pSession->nFilter; i++){ 3476 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 3477 } 3478 return 1; 3479 } 3480 #endif 3481 3482 /* 3483 ** Make sure the database is open. If it is not, then open it. If 3484 ** the database fails to open, print an error message and exit. 3485 */ 3486 static void open_db(ShellState *p, int keepAlive){ 3487 if( p->db==0 ){ 3488 sqlite3_initialize(); 3489 sqlite3_open(p->zDbFilename, &p->db); 3490 globalDb = p->db; 3491 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 3492 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 3493 p->zDbFilename, sqlite3_errmsg(p->db)); 3494 if( keepAlive ) return; 3495 exit(1); 3496 } 3497 #ifndef SQLITE_OMIT_LOAD_EXTENSION 3498 sqlite3_enable_load_extension(p->db, 1); 3499 #endif 3500 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0, 3501 readfileFunc, 0, 0); 3502 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0, 3503 writefileFunc, 0, 0); 3504 sqlite3_create_function(p->db, "sha3", 1, SQLITE_UTF8, 0, 3505 sha3Func, 0, 0); 3506 sqlite3_create_function(p->db, "sha3", 2, SQLITE_UTF8, 0, 3507 sha3Func, 0, 0); 3508 sqlite3_create_function(p->db, "sha3_query", 1, SQLITE_UTF8, 0, 3509 sha3QueryFunc, 0, 0); 3510 sqlite3_create_function(p->db, "sha3_query", 2, SQLITE_UTF8, 0, 3511 sha3QueryFunc, 0, 0); 3512 } 3513 } 3514 3515 /* 3516 ** Do C-language style dequoting. 3517 ** 3518 ** \a -> alarm 3519 ** \b -> backspace 3520 ** \t -> tab 3521 ** \n -> newline 3522 ** \v -> vertical tab 3523 ** \f -> form feed 3524 ** \r -> carriage return 3525 ** \s -> space 3526 ** \" -> " 3527 ** \' -> ' 3528 ** \\ -> backslash 3529 ** \NNN -> ascii character NNN in octal 3530 */ 3531 static void resolve_backslashes(char *z){ 3532 int i, j; 3533 char c; 3534 while( *z && *z!='\\' ) z++; 3535 for(i=j=0; (c = z[i])!=0; i++, j++){ 3536 if( c=='\\' && z[i+1]!=0 ){ 3537 c = z[++i]; 3538 if( c=='a' ){ 3539 c = '\a'; 3540 }else if( c=='b' ){ 3541 c = '\b'; 3542 }else if( c=='t' ){ 3543 c = '\t'; 3544 }else if( c=='n' ){ 3545 c = '\n'; 3546 }else if( c=='v' ){ 3547 c = '\v'; 3548 }else if( c=='f' ){ 3549 c = '\f'; 3550 }else if( c=='r' ){ 3551 c = '\r'; 3552 }else if( c=='"' ){ 3553 c = '"'; 3554 }else if( c=='\'' ){ 3555 c = '\''; 3556 }else if( c=='\\' ){ 3557 c = '\\'; 3558 }else if( c>='0' && c<='7' ){ 3559 c -= '0'; 3560 if( z[i+1]>='0' && z[i+1]<='7' ){ 3561 i++; 3562 c = (c<<3) + z[i] - '0'; 3563 if( z[i+1]>='0' && z[i+1]<='7' ){ 3564 i++; 3565 c = (c<<3) + z[i] - '0'; 3566 } 3567 } 3568 } 3569 } 3570 z[j] = c; 3571 } 3572 if( j<i ) z[j] = 0; 3573 } 3574 3575 /* 3576 ** Return the value of a hexadecimal digit. Return -1 if the input 3577 ** is not a hex digit. 3578 */ 3579 static int hexDigitValue(char c){ 3580 if( c>='0' && c<='9' ) return c - '0'; 3581 if( c>='a' && c<='f' ) return c - 'a' + 10; 3582 if( c>='A' && c<='F' ) return c - 'A' + 10; 3583 return -1; 3584 } 3585 3586 /* 3587 ** Interpret zArg as an integer value, possibly with suffixes. 3588 */ 3589 static sqlite3_int64 integerValue(const char *zArg){ 3590 sqlite3_int64 v = 0; 3591 static const struct { char *zSuffix; int iMult; } aMult[] = { 3592 { "KiB", 1024 }, 3593 { "MiB", 1024*1024 }, 3594 { "GiB", 1024*1024*1024 }, 3595 { "KB", 1000 }, 3596 { "MB", 1000000 }, 3597 { "GB", 1000000000 }, 3598 { "K", 1000 }, 3599 { "M", 1000000 }, 3600 { "G", 1000000000 }, 3601 }; 3602 int i; 3603 int isNeg = 0; 3604 if( zArg[0]=='-' ){ 3605 isNeg = 1; 3606 zArg++; 3607 }else if( zArg[0]=='+' ){ 3608 zArg++; 3609 } 3610 if( zArg[0]=='0' && zArg[1]=='x' ){ 3611 int x; 3612 zArg += 2; 3613 while( (x = hexDigitValue(zArg[0]))>=0 ){ 3614 v = (v<<4) + x; 3615 zArg++; 3616 } 3617 }else{ 3618 while( IsDigit(zArg[0]) ){ 3619 v = v*10 + zArg[0] - '0'; 3620 zArg++; 3621 } 3622 } 3623 for(i=0; i<ArraySize(aMult); i++){ 3624 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 3625 v *= aMult[i].iMult; 3626 break; 3627 } 3628 } 3629 return isNeg? -v : v; 3630 } 3631 3632 /* 3633 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0 3634 ** for TRUE and FALSE. Return the integer value if appropriate. 3635 */ 3636 static int booleanValue(const char *zArg){ 3637 int i; 3638 if( zArg[0]=='0' && zArg[1]=='x' ){ 3639 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 3640 }else{ 3641 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 3642 } 3643 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 3644 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 3645 return 1; 3646 } 3647 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 3648 return 0; 3649 } 3650 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 3651 zArg); 3652 return 0; 3653 } 3654 3655 /* 3656 ** Set or clear a shell flag according to a boolean value. 3657 */ 3658 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 3659 if( booleanValue(zArg) ){ 3660 ShellSetFlag(p, mFlag); 3661 }else{ 3662 ShellClearFlag(p, mFlag); 3663 } 3664 } 3665 3666 /* 3667 ** Close an output file, assuming it is not stderr or stdout 3668 */ 3669 static void output_file_close(FILE *f){ 3670 if( f && f!=stdout && f!=stderr ) fclose(f); 3671 } 3672 3673 /* 3674 ** Try to open an output file. The names "stdout" and "stderr" are 3675 ** recognized and do the right thing. NULL is returned if the output 3676 ** filename is "off". 3677 */ 3678 static FILE *output_file_open(const char *zFile){ 3679 FILE *f; 3680 if( strcmp(zFile,"stdout")==0 ){ 3681 f = stdout; 3682 }else if( strcmp(zFile, "stderr")==0 ){ 3683 f = stderr; 3684 }else if( strcmp(zFile, "off")==0 ){ 3685 f = 0; 3686 }else{ 3687 f = fopen(zFile, "wb"); 3688 if( f==0 ){ 3689 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 3690 } 3691 } 3692 return f; 3693 } 3694 3695 #if !defined(SQLITE_UNTESTABLE) 3696 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) 3697 /* 3698 ** A routine for handling output from sqlite3_trace(). 3699 */ 3700 static int sql_trace_callback( 3701 unsigned mType, 3702 void *pArg, 3703 void *pP, 3704 void *pX 3705 ){ 3706 FILE *f = (FILE*)pArg; 3707 UNUSED_PARAMETER(mType); 3708 UNUSED_PARAMETER(pP); 3709 if( f ){ 3710 const char *z = (const char*)pX; 3711 int i = (int)strlen(z); 3712 while( i>0 && z[i-1]==';' ){ i--; } 3713 utf8_printf(f, "%.*s;\n", i, z); 3714 } 3715 return 0; 3716 } 3717 #endif 3718 #endif 3719 3720 /* 3721 ** A no-op routine that runs with the ".breakpoint" doc-command. This is 3722 ** a useful spot to set a debugger breakpoint. 3723 */ 3724 static void test_breakpoint(void){ 3725 static int nCall = 0; 3726 nCall++; 3727 } 3728 3729 /* 3730 ** An object used to read a CSV and other files for import. 3731 */ 3732 typedef struct ImportCtx ImportCtx; 3733 struct ImportCtx { 3734 const char *zFile; /* Name of the input file */ 3735 FILE *in; /* Read the CSV text from this input stream */ 3736 char *z; /* Accumulated text for a field */ 3737 int n; /* Number of bytes in z */ 3738 int nAlloc; /* Space allocated for z[] */ 3739 int nLine; /* Current line number */ 3740 int cTerm; /* Character that terminated the most recent field */ 3741 int cColSep; /* The column separator character. (Usually ",") */ 3742 int cRowSep; /* The row separator character. (Usually "\n") */ 3743 }; 3744 3745 /* Append a single byte to z[] */ 3746 static void import_append_char(ImportCtx *p, int c){ 3747 if( p->n+1>=p->nAlloc ){ 3748 p->nAlloc += p->nAlloc + 100; 3749 p->z = sqlite3_realloc64(p->z, p->nAlloc); 3750 if( p->z==0 ){ 3751 raw_printf(stderr, "out of memory\n"); 3752 exit(1); 3753 } 3754 } 3755 p->z[p->n++] = (char)c; 3756 } 3757 3758 /* Read a single field of CSV text. Compatible with rfc4180 and extended 3759 ** with the option of having a separator other than ",". 3760 ** 3761 ** + Input comes from p->in. 3762 ** + Store results in p->z of length p->n. Space to hold p->z comes 3763 ** from sqlite3_malloc64(). 3764 ** + Use p->cSep as the column separator. The default is ",". 3765 ** + Use p->rSep as the row separator. The default is "\n". 3766 ** + Keep track of the line number in p->nLine. 3767 ** + Store the character that terminates the field in p->cTerm. Store 3768 ** EOF on end-of-file. 3769 ** + Report syntax errors on stderr 3770 */ 3771 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 3772 int c; 3773 int cSep = p->cColSep; 3774 int rSep = p->cRowSep; 3775 p->n = 0; 3776 c = fgetc(p->in); 3777 if( c==EOF || seenInterrupt ){ 3778 p->cTerm = EOF; 3779 return 0; 3780 } 3781 if( c=='"' ){ 3782 int pc, ppc; 3783 int startLine = p->nLine; 3784 int cQuote = c; 3785 pc = ppc = 0; 3786 while( 1 ){ 3787 c = fgetc(p->in); 3788 if( c==rSep ) p->nLine++; 3789 if( c==cQuote ){ 3790 if( pc==cQuote ){ 3791 pc = 0; 3792 continue; 3793 } 3794 } 3795 if( (c==cSep && pc==cQuote) 3796 || (c==rSep && pc==cQuote) 3797 || (c==rSep && pc=='\r' && ppc==cQuote) 3798 || (c==EOF && pc==cQuote) 3799 ){ 3800 do{ p->n--; }while( p->z[p->n]!=cQuote ); 3801 p->cTerm = c; 3802 break; 3803 } 3804 if( pc==cQuote && c!='\r' ){ 3805 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 3806 p->zFile, p->nLine, cQuote); 3807 } 3808 if( c==EOF ){ 3809 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 3810 p->zFile, startLine, cQuote); 3811 p->cTerm = c; 3812 break; 3813 } 3814 import_append_char(p, c); 3815 ppc = pc; 3816 pc = c; 3817 } 3818 }else{ 3819 while( c!=EOF && c!=cSep && c!=rSep ){ 3820 import_append_char(p, c); 3821 c = fgetc(p->in); 3822 } 3823 if( c==rSep ){ 3824 p->nLine++; 3825 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 3826 } 3827 p->cTerm = c; 3828 } 3829 if( p->z ) p->z[p->n] = 0; 3830 return p->z; 3831 } 3832 3833 /* Read a single field of ASCII delimited text. 3834 ** 3835 ** + Input comes from p->in. 3836 ** + Store results in p->z of length p->n. Space to hold p->z comes 3837 ** from sqlite3_malloc64(). 3838 ** + Use p->cSep as the column separator. The default is "\x1F". 3839 ** + Use p->rSep as the row separator. The default is "\x1E". 3840 ** + Keep track of the row number in p->nLine. 3841 ** + Store the character that terminates the field in p->cTerm. Store 3842 ** EOF on end-of-file. 3843 ** + Report syntax errors on stderr 3844 */ 3845 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 3846 int c; 3847 int cSep = p->cColSep; 3848 int rSep = p->cRowSep; 3849 p->n = 0; 3850 c = fgetc(p->in); 3851 if( c==EOF || seenInterrupt ){ 3852 p->cTerm = EOF; 3853 return 0; 3854 } 3855 while( c!=EOF && c!=cSep && c!=rSep ){ 3856 import_append_char(p, c); 3857 c = fgetc(p->in); 3858 } 3859 if( c==rSep ){ 3860 p->nLine++; 3861 } 3862 p->cTerm = c; 3863 if( p->z ) p->z[p->n] = 0; 3864 return p->z; 3865 } 3866 3867 /* 3868 ** Try to transfer data for table zTable. If an error is seen while 3869 ** moving forward, try to go backwards. The backwards movement won't 3870 ** work for WITHOUT ROWID tables. 3871 */ 3872 static void tryToCloneData( 3873 ShellState *p, 3874 sqlite3 *newDb, 3875 const char *zTable 3876 ){ 3877 sqlite3_stmt *pQuery = 0; 3878 sqlite3_stmt *pInsert = 0; 3879 char *zQuery = 0; 3880 char *zInsert = 0; 3881 int rc; 3882 int i, j, n; 3883 int nTable = (int)strlen(zTable); 3884 int k = 0; 3885 int cnt = 0; 3886 const int spinRate = 10000; 3887 3888 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 3889 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 3890 if( rc ){ 3891 utf8_printf(stderr, "Error %d: %s on [%s]\n", 3892 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 3893 zQuery); 3894 goto end_data_xfer; 3895 } 3896 n = sqlite3_column_count(pQuery); 3897 zInsert = sqlite3_malloc64(200 + nTable + n*3); 3898 if( zInsert==0 ){ 3899 raw_printf(stderr, "out of memory\n"); 3900 goto end_data_xfer; 3901 } 3902 sqlite3_snprintf(200+nTable,zInsert, 3903 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 3904 i = (int)strlen(zInsert); 3905 for(j=1; j<n; j++){ 3906 memcpy(zInsert+i, ",?", 2); 3907 i += 2; 3908 } 3909 memcpy(zInsert+i, ");", 3); 3910 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 3911 if( rc ){ 3912 utf8_printf(stderr, "Error %d: %s on [%s]\n", 3913 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 3914 zQuery); 3915 goto end_data_xfer; 3916 } 3917 for(k=0; k<2; k++){ 3918 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 3919 for(i=0; i<n; i++){ 3920 switch( sqlite3_column_type(pQuery, i) ){ 3921 case SQLITE_NULL: { 3922 sqlite3_bind_null(pInsert, i+1); 3923 break; 3924 } 3925 case SQLITE_INTEGER: { 3926 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 3927 break; 3928 } 3929 case SQLITE_FLOAT: { 3930 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 3931 break; 3932 } 3933 case SQLITE_TEXT: { 3934 sqlite3_bind_text(pInsert, i+1, 3935 (const char*)sqlite3_column_text(pQuery,i), 3936 -1, SQLITE_STATIC); 3937 break; 3938 } 3939 case SQLITE_BLOB: { 3940 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 3941 sqlite3_column_bytes(pQuery,i), 3942 SQLITE_STATIC); 3943 break; 3944 } 3945 } 3946 } /* End for */ 3947 rc = sqlite3_step(pInsert); 3948 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 3949 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 3950 sqlite3_errmsg(newDb)); 3951 } 3952 sqlite3_reset(pInsert); 3953 cnt++; 3954 if( (cnt%spinRate)==0 ){ 3955 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 3956 fflush(stdout); 3957 } 3958 } /* End while */ 3959 if( rc==SQLITE_DONE ) break; 3960 sqlite3_finalize(pQuery); 3961 sqlite3_free(zQuery); 3962 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 3963 zTable); 3964 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 3965 if( rc ){ 3966 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 3967 break; 3968 } 3969 } /* End for(k=0...) */ 3970 3971 end_data_xfer: 3972 sqlite3_finalize(pQuery); 3973 sqlite3_finalize(pInsert); 3974 sqlite3_free(zQuery); 3975 sqlite3_free(zInsert); 3976 } 3977 3978 3979 /* 3980 ** Try to transfer all rows of the schema that match zWhere. For 3981 ** each row, invoke xForEach() on the object defined by that row. 3982 ** If an error is encountered while moving forward through the 3983 ** sqlite_master table, try again moving backwards. 3984 */ 3985 static void tryToCloneSchema( 3986 ShellState *p, 3987 sqlite3 *newDb, 3988 const char *zWhere, 3989 void (*xForEach)(ShellState*,sqlite3*,const char*) 3990 ){ 3991 sqlite3_stmt *pQuery = 0; 3992 char *zQuery = 0; 3993 int rc; 3994 const unsigned char *zName; 3995 const unsigned char *zSql; 3996 char *zErrMsg = 0; 3997 3998 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" 3999 " WHERE %s", zWhere); 4000 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4001 if( rc ){ 4002 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 4003 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 4004 zQuery); 4005 goto end_schema_xfer; 4006 } 4007 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 4008 zName = sqlite3_column_text(pQuery, 0); 4009 zSql = sqlite3_column_text(pQuery, 1); 4010 printf("%s... ", zName); fflush(stdout); 4011 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 4012 if( zErrMsg ){ 4013 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 4014 sqlite3_free(zErrMsg); 4015 zErrMsg = 0; 4016 } 4017 if( xForEach ){ 4018 xForEach(p, newDb, (const char*)zName); 4019 } 4020 printf("done\n"); 4021 } 4022 if( rc!=SQLITE_DONE ){ 4023 sqlite3_finalize(pQuery); 4024 sqlite3_free(zQuery); 4025 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" 4026 " WHERE %s ORDER BY rowid DESC", zWhere); 4027 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4028 if( rc ){ 4029 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 4030 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 4031 zQuery); 4032 goto end_schema_xfer; 4033 } 4034 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 4035 zName = sqlite3_column_text(pQuery, 0); 4036 zSql = sqlite3_column_text(pQuery, 1); 4037 printf("%s... ", zName); fflush(stdout); 4038 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 4039 if( zErrMsg ){ 4040 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 4041 sqlite3_free(zErrMsg); 4042 zErrMsg = 0; 4043 } 4044 if( xForEach ){ 4045 xForEach(p, newDb, (const char*)zName); 4046 } 4047 printf("done\n"); 4048 } 4049 } 4050 end_schema_xfer: 4051 sqlite3_finalize(pQuery); 4052 sqlite3_free(zQuery); 4053 } 4054 4055 /* 4056 ** Open a new database file named "zNewDb". Try to recover as much information 4057 ** as possible out of the main database (which might be corrupt) and write it 4058 ** into zNewDb. 4059 */ 4060 static void tryToClone(ShellState *p, const char *zNewDb){ 4061 int rc; 4062 sqlite3 *newDb = 0; 4063 if( access(zNewDb,0)==0 ){ 4064 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 4065 return; 4066 } 4067 rc = sqlite3_open(zNewDb, &newDb); 4068 if( rc ){ 4069 utf8_printf(stderr, "Cannot create output database: %s\n", 4070 sqlite3_errmsg(newDb)); 4071 }else{ 4072 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 4073 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 4074 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 4075 tryToCloneSchema(p, newDb, "type!='table'", 0); 4076 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 4077 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 4078 } 4079 sqlite3_close(newDb); 4080 } 4081 4082 /* 4083 ** Change the output file back to stdout 4084 */ 4085 static void output_reset(ShellState *p){ 4086 if( p->outfile[0]=='|' ){ 4087 #ifndef SQLITE_OMIT_POPEN 4088 pclose(p->out); 4089 #endif 4090 }else{ 4091 output_file_close(p->out); 4092 } 4093 p->outfile[0] = 0; 4094 p->out = stdout; 4095 } 4096 4097 /* 4098 ** Run an SQL command and return the single integer result. 4099 */ 4100 static int db_int(ShellState *p, const char *zSql){ 4101 sqlite3_stmt *pStmt; 4102 int res = 0; 4103 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 4104 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 4105 res = sqlite3_column_int(pStmt,0); 4106 } 4107 sqlite3_finalize(pStmt); 4108 return res; 4109 } 4110 4111 /* 4112 ** Convert a 2-byte or 4-byte big-endian integer into a native integer 4113 */ 4114 static unsigned int get2byteInt(unsigned char *a){ 4115 return (a[0]<<8) + a[1]; 4116 } 4117 static unsigned int get4byteInt(unsigned char *a){ 4118 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 4119 } 4120 4121 /* 4122 ** Implementation of the ".info" command. 4123 ** 4124 ** Return 1 on error, 2 to exit, and 0 otherwise. 4125 */ 4126 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 4127 static const struct { const char *zName; int ofst; } aField[] = { 4128 { "file change counter:", 24 }, 4129 { "database page count:", 28 }, 4130 { "freelist page count:", 36 }, 4131 { "schema cookie:", 40 }, 4132 { "schema format:", 44 }, 4133 { "default cache size:", 48 }, 4134 { "autovacuum top root:", 52 }, 4135 { "incremental vacuum:", 64 }, 4136 { "text encoding:", 56 }, 4137 { "user version:", 60 }, 4138 { "application id:", 68 }, 4139 { "software version:", 96 }, 4140 }; 4141 static const struct { const char *zName; const char *zSql; } aQuery[] = { 4142 { "number of tables:", 4143 "SELECT count(*) FROM %s WHERE type='table'" }, 4144 { "number of indexes:", 4145 "SELECT count(*) FROM %s WHERE type='index'" }, 4146 { "number of triggers:", 4147 "SELECT count(*) FROM %s WHERE type='trigger'" }, 4148 { "number of views:", 4149 "SELECT count(*) FROM %s WHERE type='view'" }, 4150 { "schema size:", 4151 "SELECT total(length(sql)) FROM %s" }, 4152 }; 4153 sqlite3_file *pFile = 0; 4154 int i; 4155 char *zSchemaTab; 4156 char *zDb = nArg>=2 ? azArg[1] : "main"; 4157 unsigned char aHdr[100]; 4158 open_db(p, 0); 4159 if( p->db==0 ) return 1; 4160 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile); 4161 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){ 4162 return 1; 4163 } 4164 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0); 4165 if( i!=SQLITE_OK ){ 4166 raw_printf(stderr, "unable to read database header\n"); 4167 return 1; 4168 } 4169 i = get2byteInt(aHdr+16); 4170 if( i==1 ) i = 65536; 4171 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 4172 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 4173 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 4174 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 4175 for(i=0; i<ArraySize(aField); i++){ 4176 int ofst = aField[i].ofst; 4177 unsigned int val = get4byteInt(aHdr + ofst); 4178 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 4179 switch( ofst ){ 4180 case 56: { 4181 if( val==1 ) raw_printf(p->out, " (utf8)"); 4182 if( val==2 ) raw_printf(p->out, " (utf16le)"); 4183 if( val==3 ) raw_printf(p->out, " (utf16be)"); 4184 } 4185 } 4186 raw_printf(p->out, "\n"); 4187 } 4188 if( zDb==0 ){ 4189 zSchemaTab = sqlite3_mprintf("main.sqlite_master"); 4190 }else if( strcmp(zDb,"temp")==0 ){ 4191 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master"); 4192 }else{ 4193 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb); 4194 } 4195 for(i=0; i<ArraySize(aQuery); i++){ 4196 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 4197 int val = db_int(p, zSql); 4198 sqlite3_free(zSql); 4199 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 4200 } 4201 sqlite3_free(zSchemaTab); 4202 return 0; 4203 } 4204 4205 /* 4206 ** Print the current sqlite3_errmsg() value to stderr and return 1. 4207 */ 4208 static int shellDatabaseError(sqlite3 *db){ 4209 const char *zErr = sqlite3_errmsg(db); 4210 utf8_printf(stderr, "Error: %s\n", zErr); 4211 return 1; 4212 } 4213 4214 /* 4215 ** Print an out-of-memory message to stderr and return 1. 4216 */ 4217 static int shellNomemError(void){ 4218 raw_printf(stderr, "Error: out of memory\n"); 4219 return 1; 4220 } 4221 4222 /* 4223 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 4224 ** if they match and FALSE (0) if they do not match. 4225 ** 4226 ** Globbing rules: 4227 ** 4228 ** '*' Matches any sequence of zero or more characters. 4229 ** 4230 ** '?' Matches exactly one character. 4231 ** 4232 ** [...] Matches one character from the enclosed list of 4233 ** characters. 4234 ** 4235 ** [^...] Matches one character not in the enclosed list. 4236 ** 4237 ** '#' Matches any sequence of one or more digits with an 4238 ** optional + or - sign in front 4239 ** 4240 ** ' ' Any span of whitespace matches any other span of 4241 ** whitespace. 4242 ** 4243 ** Extra whitespace at the end of z[] is ignored. 4244 */ 4245 static int testcase_glob(const char *zGlob, const char *z){ 4246 int c, c2; 4247 int invert; 4248 int seen; 4249 4250 while( (c = (*(zGlob++)))!=0 ){ 4251 if( IsSpace(c) ){ 4252 if( !IsSpace(*z) ) return 0; 4253 while( IsSpace(*zGlob) ) zGlob++; 4254 while( IsSpace(*z) ) z++; 4255 }else if( c=='*' ){ 4256 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 4257 if( c=='?' && (*(z++))==0 ) return 0; 4258 } 4259 if( c==0 ){ 4260 return 1; 4261 }else if( c=='[' ){ 4262 while( *z && testcase_glob(zGlob-1,z)==0 ){ 4263 z++; 4264 } 4265 return (*z)!=0; 4266 } 4267 while( (c2 = (*(z++)))!=0 ){ 4268 while( c2!=c ){ 4269 c2 = *(z++); 4270 if( c2==0 ) return 0; 4271 } 4272 if( testcase_glob(zGlob,z) ) return 1; 4273 } 4274 return 0; 4275 }else if( c=='?' ){ 4276 if( (*(z++))==0 ) return 0; 4277 }else if( c=='[' ){ 4278 int prior_c = 0; 4279 seen = 0; 4280 invert = 0; 4281 c = *(z++); 4282 if( c==0 ) return 0; 4283 c2 = *(zGlob++); 4284 if( c2=='^' ){ 4285 invert = 1; 4286 c2 = *(zGlob++); 4287 } 4288 if( c2==']' ){ 4289 if( c==']' ) seen = 1; 4290 c2 = *(zGlob++); 4291 } 4292 while( c2 && c2!=']' ){ 4293 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 4294 c2 = *(zGlob++); 4295 if( c>=prior_c && c<=c2 ) seen = 1; 4296 prior_c = 0; 4297 }else{ 4298 if( c==c2 ){ 4299 seen = 1; 4300 } 4301 prior_c = c2; 4302 } 4303 c2 = *(zGlob++); 4304 } 4305 if( c2==0 || (seen ^ invert)==0 ) return 0; 4306 }else if( c=='#' ){ 4307 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 4308 if( !IsDigit(z[0]) ) return 0; 4309 z++; 4310 while( IsDigit(z[0]) ){ z++; } 4311 }else{ 4312 if( c!=(*(z++)) ) return 0; 4313 } 4314 } 4315 while( IsSpace(*z) ){ z++; } 4316 return *z==0; 4317 } 4318 4319 4320 /* 4321 ** Compare the string as a command-line option with either one or two 4322 ** initial "-" characters. 4323 */ 4324 static int optionMatch(const char *zStr, const char *zOpt){ 4325 if( zStr[0]!='-' ) return 0; 4326 zStr++; 4327 if( zStr[0]=='-' ) zStr++; 4328 return strcmp(zStr, zOpt)==0; 4329 } 4330 4331 /* 4332 ** Delete a file. 4333 */ 4334 int shellDeleteFile(const char *zFilename){ 4335 int rc; 4336 #ifdef _WIN32 4337 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 4338 rc = _wunlink(z); 4339 sqlite3_free(z); 4340 #else 4341 rc = unlink(zFilename); 4342 #endif 4343 return rc; 4344 } 4345 4346 4347 /* 4348 ** The implementation of SQL scalar function fkey_collate_clause(), used 4349 ** by the ".lint fkey-indexes" command. This scalar function is always 4350 ** called with four arguments - the parent table name, the parent column name, 4351 ** the child table name and the child column name. 4352 ** 4353 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 4354 ** 4355 ** If either of the named tables or columns do not exist, this function 4356 ** returns an empty string. An empty string is also returned if both tables 4357 ** and columns exist but have the same default collation sequence. Or, 4358 ** if both exist but the default collation sequences are different, this 4359 ** function returns the string " COLLATE <parent-collation>", where 4360 ** <parent-collation> is the default collation sequence of the parent column. 4361 */ 4362 static void shellFkeyCollateClause( 4363 sqlite3_context *pCtx, 4364 int nVal, 4365 sqlite3_value **apVal 4366 ){ 4367 sqlite3 *db = sqlite3_context_db_handle(pCtx); 4368 const char *zParent; 4369 const char *zParentCol; 4370 const char *zParentSeq; 4371 const char *zChild; 4372 const char *zChildCol; 4373 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 4374 int rc; 4375 4376 assert( nVal==4 ); 4377 zParent = (const char*)sqlite3_value_text(apVal[0]); 4378 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 4379 zChild = (const char*)sqlite3_value_text(apVal[2]); 4380 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 4381 4382 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 4383 rc = sqlite3_table_column_metadata( 4384 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 4385 ); 4386 if( rc==SQLITE_OK ){ 4387 rc = sqlite3_table_column_metadata( 4388 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 4389 ); 4390 } 4391 4392 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 4393 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 4394 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 4395 sqlite3_free(z); 4396 } 4397 } 4398 4399 4400 /* 4401 ** The implementation of dot-command ".lint fkey-indexes". 4402 */ 4403 static int lintFkeyIndexes( 4404 ShellState *pState, /* Current shell tool state */ 4405 char **azArg, /* Array of arguments passed to dot command */ 4406 int nArg /* Number of entries in azArg[] */ 4407 ){ 4408 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 4409 FILE *out = pState->out; /* Stream to write non-error output to */ 4410 int bVerbose = 0; /* If -verbose is present */ 4411 int bGroupByParent = 0; /* If -groupbyparent is present */ 4412 int i; /* To iterate through azArg[] */ 4413 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 4414 int rc; /* Return code */ 4415 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 4416 4417 /* 4418 ** This SELECT statement returns one row for each foreign key constraint 4419 ** in the schema of the main database. The column values are: 4420 ** 4421 ** 0. The text of an SQL statement similar to: 4422 ** 4423 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?" 4424 ** 4425 ** This is the same SELECT that the foreign keys implementation needs 4426 ** to run internally on child tables. If there is an index that can 4427 ** be used to optimize this query, then it can also be used by the FK 4428 ** implementation to optimize DELETE or UPDATE statements on the parent 4429 ** table. 4430 ** 4431 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 4432 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 4433 ** contains an index that can be used to optimize the query. 4434 ** 4435 ** 2. Human readable text that describes the child table and columns. e.g. 4436 ** 4437 ** "child_table(child_key1, child_key2)" 4438 ** 4439 ** 3. Human readable text that describes the parent table and columns. e.g. 4440 ** 4441 ** "parent_table(parent_key1, parent_key2)" 4442 ** 4443 ** 4. A full CREATE INDEX statement for an index that could be used to 4444 ** optimize DELETE or UPDATE statements on the parent table. e.g. 4445 ** 4446 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 4447 ** 4448 ** 5. The name of the parent table. 4449 ** 4450 ** These six values are used by the C logic below to generate the report. 4451 */ 4452 const char *zSql = 4453 "SELECT " 4454 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '" 4455 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 4456 " || fkey_collate_clause(" 4457 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 4458 ", " 4459 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" 4460 " || group_concat('*=?', ' AND ') || ')'" 4461 ", " 4462 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 4463 ", " 4464 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 4465 ", " 4466 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 4467 " || ' ON ' || quote(s.name) || '('" 4468 " || group_concat(quote(f.[from]) ||" 4469 " fkey_collate_clause(" 4470 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 4471 " || ');'" 4472 ", " 4473 " f.[table] " 4474 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f " 4475 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 4476 "GROUP BY s.name, f.id " 4477 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 4478 ; 4479 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)"; 4480 4481 for(i=2; i<nArg; i++){ 4482 int n = (int)strlen(azArg[i]); 4483 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 4484 bVerbose = 1; 4485 } 4486 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 4487 bGroupByParent = 1; 4488 zIndent = " "; 4489 } 4490 else{ 4491 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 4492 azArg[0], azArg[1] 4493 ); 4494 return SQLITE_ERROR; 4495 } 4496 } 4497 4498 /* Register the fkey_collate_clause() SQL function */ 4499 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 4500 0, shellFkeyCollateClause, 0, 0 4501 ); 4502 4503 4504 if( rc==SQLITE_OK ){ 4505 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 4506 } 4507 if( rc==SQLITE_OK ){ 4508 sqlite3_bind_int(pSql, 1, bGroupByParent); 4509 } 4510 4511 if( rc==SQLITE_OK ){ 4512 int rc2; 4513 char *zPrev = 0; 4514 while( SQLITE_ROW==sqlite3_step(pSql) ){ 4515 int res = -1; 4516 sqlite3_stmt *pExplain = 0; 4517 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 4518 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 4519 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 4520 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 4521 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 4522 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 4523 4524 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 4525 if( rc!=SQLITE_OK ) break; 4526 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 4527 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 4528 res = ( 4529 0==sqlite3_strglob(zGlob, zPlan) 4530 || 0==sqlite3_strglob(zGlobIPK, zPlan) 4531 ); 4532 } 4533 rc = sqlite3_finalize(pExplain); 4534 if( rc!=SQLITE_OK ) break; 4535 4536 if( res<0 ){ 4537 raw_printf(stderr, "Error: internal error"); 4538 break; 4539 }else{ 4540 if( bGroupByParent 4541 && (bVerbose || res==0) 4542 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 4543 ){ 4544 raw_printf(out, "-- Parent table %s\n", zParent); 4545 sqlite3_free(zPrev); 4546 zPrev = sqlite3_mprintf("%s", zParent); 4547 } 4548 4549 if( res==0 ){ 4550 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 4551 }else if( bVerbose ){ 4552 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 4553 zIndent, zFrom, zTarget 4554 ); 4555 } 4556 } 4557 } 4558 sqlite3_free(zPrev); 4559 4560 if( rc!=SQLITE_OK ){ 4561 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4562 } 4563 4564 rc2 = sqlite3_finalize(pSql); 4565 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 4566 rc = rc2; 4567 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4568 } 4569 }else{ 4570 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4571 } 4572 4573 return rc; 4574 } 4575 4576 /* 4577 ** Implementation of ".lint" dot command. 4578 */ 4579 static int lintDotCommand( 4580 ShellState *pState, /* Current shell tool state */ 4581 char **azArg, /* Array of arguments passed to dot command */ 4582 int nArg /* Number of entries in azArg[] */ 4583 ){ 4584 int n; 4585 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0); 4586 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 4587 return lintFkeyIndexes(pState, azArg, nArg); 4588 4589 usage: 4590 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 4591 raw_printf(stderr, "Where sub-commands are:\n"); 4592 raw_printf(stderr, " fkey-indexes\n"); 4593 return SQLITE_ERROR; 4594 } 4595 4596 4597 /* 4598 ** If an input line begins with "." then invoke this routine to 4599 ** process that line. 4600 ** 4601 ** Return 1 on error, 2 to exit, and 0 otherwise. 4602 */ 4603 static int do_meta_command(char *zLine, ShellState *p){ 4604 int h = 1; 4605 int nArg = 0; 4606 int n, c; 4607 int rc = 0; 4608 char *azArg[50]; 4609 4610 /* Parse the input line into tokens. 4611 */ 4612 while( zLine[h] && nArg<ArraySize(azArg) ){ 4613 while( IsSpace(zLine[h]) ){ h++; } 4614 if( zLine[h]==0 ) break; 4615 if( zLine[h]=='\'' || zLine[h]=='"' ){ 4616 int delim = zLine[h++]; 4617 azArg[nArg++] = &zLine[h]; 4618 while( zLine[h] && zLine[h]!=delim ){ 4619 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 4620 h++; 4621 } 4622 if( zLine[h]==delim ){ 4623 zLine[h++] = 0; 4624 } 4625 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 4626 }else{ 4627 azArg[nArg++] = &zLine[h]; 4628 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 4629 if( zLine[h] ) zLine[h++] = 0; 4630 resolve_backslashes(azArg[nArg-1]); 4631 } 4632 } 4633 4634 /* Process the input line. 4635 */ 4636 if( nArg==0 ) return 0; /* no tokens, no error */ 4637 n = strlen30(azArg[0]); 4638 c = azArg[0][0]; 4639 4640 #ifndef SQLITE_OMIT_AUTHORIZATION 4641 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 4642 if( nArg!=2 ){ 4643 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 4644 rc = 1; 4645 goto meta_command_exit; 4646 } 4647 open_db(p, 0); 4648 if( booleanValue(azArg[1]) ){ 4649 sqlite3_set_authorizer(p->db, shellAuth, p); 4650 }else{ 4651 sqlite3_set_authorizer(p->db, 0, 0); 4652 } 4653 }else 4654 #endif 4655 4656 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 4657 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 4658 ){ 4659 const char *zDestFile = 0; 4660 const char *zDb = 0; 4661 sqlite3 *pDest; 4662 sqlite3_backup *pBackup; 4663 int j; 4664 for(j=1; j<nArg; j++){ 4665 const char *z = azArg[j]; 4666 if( z[0]=='-' ){ 4667 while( z[0]=='-' ) z++; 4668 /* No options to process at this time */ 4669 { 4670 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 4671 return 1; 4672 } 4673 }else if( zDestFile==0 ){ 4674 zDestFile = azArg[j]; 4675 }else if( zDb==0 ){ 4676 zDb = zDestFile; 4677 zDestFile = azArg[j]; 4678 }else{ 4679 raw_printf(stderr, "too many arguments to .backup\n"); 4680 return 1; 4681 } 4682 } 4683 if( zDestFile==0 ){ 4684 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 4685 return 1; 4686 } 4687 if( zDb==0 ) zDb = "main"; 4688 rc = sqlite3_open(zDestFile, &pDest); 4689 if( rc!=SQLITE_OK ){ 4690 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 4691 sqlite3_close(pDest); 4692 return 1; 4693 } 4694 open_db(p, 0); 4695 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 4696 if( pBackup==0 ){ 4697 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 4698 sqlite3_close(pDest); 4699 return 1; 4700 } 4701 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 4702 sqlite3_backup_finish(pBackup); 4703 if( rc==SQLITE_DONE ){ 4704 rc = 0; 4705 }else{ 4706 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 4707 rc = 1; 4708 } 4709 sqlite3_close(pDest); 4710 }else 4711 4712 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 4713 if( nArg==2 ){ 4714 bail_on_error = booleanValue(azArg[1]); 4715 }else{ 4716 raw_printf(stderr, "Usage: .bail on|off\n"); 4717 rc = 1; 4718 } 4719 }else 4720 4721 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 4722 if( nArg==2 ){ 4723 if( booleanValue(azArg[1]) ){ 4724 setBinaryMode(p->out, 1); 4725 }else{ 4726 setTextMode(p->out, 1); 4727 } 4728 }else{ 4729 raw_printf(stderr, "Usage: .binary on|off\n"); 4730 rc = 1; 4731 } 4732 }else 4733 4734 /* The undocumented ".breakpoint" command causes a call to the no-op 4735 ** routine named test_breakpoint(). 4736 */ 4737 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 4738 test_breakpoint(); 4739 }else 4740 4741 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 4742 if( nArg==2 ){ 4743 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 4744 }else{ 4745 raw_printf(stderr, "Usage: .changes on|off\n"); 4746 rc = 1; 4747 } 4748 }else 4749 4750 /* Cancel output redirection, if it is currently set (by .testcase) 4751 ** Then read the content of the testcase-out.txt file and compare against 4752 ** azArg[1]. If there are differences, report an error and exit. 4753 */ 4754 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 4755 char *zRes = 0; 4756 output_reset(p); 4757 if( nArg!=2 ){ 4758 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 4759 rc = 2; 4760 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 4761 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 4762 rc = 2; 4763 }else if( testcase_glob(azArg[1],zRes)==0 ){ 4764 utf8_printf(stderr, 4765 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 4766 p->zTestcase, azArg[1], zRes); 4767 rc = 2; 4768 }else{ 4769 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 4770 p->nCheck++; 4771 } 4772 sqlite3_free(zRes); 4773 }else 4774 4775 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 4776 if( nArg==2 ){ 4777 tryToClone(p, azArg[1]); 4778 }else{ 4779 raw_printf(stderr, "Usage: .clone FILENAME\n"); 4780 rc = 1; 4781 } 4782 }else 4783 4784 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 4785 ShellState data; 4786 char *zErrMsg = 0; 4787 open_db(p, 0); 4788 memcpy(&data, p, sizeof(data)); 4789 data.showHeader = 0; 4790 data.cMode = data.mode = MODE_List; 4791 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": "); 4792 data.cnt = 0; 4793 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list", 4794 callback, &data, &zErrMsg); 4795 if( zErrMsg ){ 4796 utf8_printf(stderr,"Error: %s\n", zErrMsg); 4797 sqlite3_free(zErrMsg); 4798 rc = 1; 4799 } 4800 }else 4801 4802 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){ 4803 rc = shell_dbinfo_command(p, nArg, azArg); 4804 }else 4805 4806 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 4807 const char *zLike = 0; 4808 int i; 4809 int savedShowHeader = p->showHeader; 4810 ShellClearFlag(p, SHFLG_PreserveRowid); 4811 for(i=1; i<nArg; i++){ 4812 if( azArg[i][0]=='-' ){ 4813 const char *z = azArg[i]+1; 4814 if( z[0]=='-' ) z++; 4815 if( strcmp(z,"preserve-rowids")==0 ){ 4816 #ifdef SQLITE_OMIT_VIRTUALTABLE 4817 raw_printf(stderr, "The --preserve-rowids option is not compatible" 4818 " with SQLITE_OMIT_VIRTUALTABLE\n"); 4819 rc = 1; 4820 goto meta_command_exit; 4821 #else 4822 ShellSetFlag(p, SHFLG_PreserveRowid); 4823 #endif 4824 }else 4825 { 4826 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 4827 rc = 1; 4828 goto meta_command_exit; 4829 } 4830 }else if( zLike ){ 4831 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? ?LIKE-PATTERN?\n"); 4832 rc = 1; 4833 goto meta_command_exit; 4834 }else{ 4835 zLike = azArg[i]; 4836 } 4837 } 4838 open_db(p, 0); 4839 /* When playing back a "dump", the content might appear in an order 4840 ** which causes immediate foreign key constraints to be violated. 4841 ** So disable foreign-key constraint enforcement to prevent problems. */ 4842 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 4843 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 4844 p->writableSchema = 0; 4845 p->showHeader = 0; 4846 /* Set writable_schema=ON since doing so forces SQLite to initialize 4847 ** as much of the schema as it can even if the sqlite_master table is 4848 ** corrupt. */ 4849 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 4850 p->nErr = 0; 4851 if( zLike==0 ){ 4852 run_schema_dump_query(p, 4853 "SELECT name, type, sql FROM sqlite_master " 4854 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'" 4855 ); 4856 run_schema_dump_query(p, 4857 "SELECT name, type, sql FROM sqlite_master " 4858 "WHERE name=='sqlite_sequence'" 4859 ); 4860 run_table_dump_query(p, 4861 "SELECT sql FROM sqlite_master " 4862 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0 4863 ); 4864 }else{ 4865 char *zSql; 4866 zSql = sqlite3_mprintf( 4867 "SELECT name, type, sql FROM sqlite_master " 4868 "WHERE tbl_name LIKE %Q AND type=='table'" 4869 " AND sql NOT NULL", zLike); 4870 run_schema_dump_query(p,zSql); 4871 sqlite3_free(zSql); 4872 zSql = sqlite3_mprintf( 4873 "SELECT sql FROM sqlite_master " 4874 "WHERE sql NOT NULL" 4875 " AND type IN ('index','trigger','view')" 4876 " AND tbl_name LIKE %Q", zLike); 4877 run_table_dump_query(p, zSql, 0); 4878 sqlite3_free(zSql); 4879 } 4880 if( p->writableSchema ){ 4881 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 4882 p->writableSchema = 0; 4883 } 4884 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 4885 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 4886 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n"); 4887 p->showHeader = savedShowHeader; 4888 }else 4889 4890 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 4891 if( nArg==2 ){ 4892 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 4893 }else{ 4894 raw_printf(stderr, "Usage: .echo on|off\n"); 4895 rc = 1; 4896 } 4897 }else 4898 4899 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 4900 if( nArg==2 ){ 4901 if( strcmp(azArg[1],"full")==0 ){ 4902 p->autoEQP = 2; 4903 }else{ 4904 p->autoEQP = booleanValue(azArg[1]); 4905 } 4906 }else{ 4907 raw_printf(stderr, "Usage: .eqp on|off|full\n"); 4908 rc = 1; 4909 } 4910 }else 4911 4912 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 4913 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 4914 rc = 2; 4915 }else 4916 4917 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 4918 int val = 1; 4919 if( nArg>=2 ){ 4920 if( strcmp(azArg[1],"auto")==0 ){ 4921 val = 99; 4922 }else{ 4923 val = booleanValue(azArg[1]); 4924 } 4925 } 4926 if( val==1 && p->mode!=MODE_Explain ){ 4927 p->normalMode = p->mode; 4928 p->mode = MODE_Explain; 4929 p->autoExplain = 0; 4930 }else if( val==0 ){ 4931 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 4932 p->autoExplain = 0; 4933 }else if( val==99 ){ 4934 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 4935 p->autoExplain = 1; 4936 } 4937 }else 4938 4939 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 4940 ShellState data; 4941 char *zErrMsg = 0; 4942 int doStats = 0; 4943 memcpy(&data, p, sizeof(data)); 4944 data.showHeader = 0; 4945 data.cMode = data.mode = MODE_Semi; 4946 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 4947 data.cMode = data.mode = MODE_Pretty; 4948 nArg = 1; 4949 } 4950 if( nArg!=1 ){ 4951 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 4952 rc = 1; 4953 goto meta_command_exit; 4954 } 4955 open_db(p, 0); 4956 rc = sqlite3_exec(p->db, 4957 "SELECT sql FROM" 4958 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 4959 " FROM sqlite_master UNION ALL" 4960 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " 4961 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 4962 "ORDER BY rowid", 4963 callback, &data, &zErrMsg 4964 ); 4965 if( rc==SQLITE_OK ){ 4966 sqlite3_stmt *pStmt; 4967 rc = sqlite3_prepare_v2(p->db, 4968 "SELECT rowid FROM sqlite_master" 4969 " WHERE name GLOB 'sqlite_stat[134]'", 4970 -1, &pStmt, 0); 4971 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 4972 sqlite3_finalize(pStmt); 4973 } 4974 if( doStats==0 ){ 4975 raw_printf(p->out, "/* No STAT tables available */\n"); 4976 }else{ 4977 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 4978 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'", 4979 callback, &data, &zErrMsg); 4980 data.cMode = data.mode = MODE_Insert; 4981 data.zDestTable = "sqlite_stat1"; 4982 shell_exec(p->db, "SELECT * FROM sqlite_stat1", 4983 shell_callback, &data,&zErrMsg); 4984 data.zDestTable = "sqlite_stat3"; 4985 shell_exec(p->db, "SELECT * FROM sqlite_stat3", 4986 shell_callback, &data,&zErrMsg); 4987 data.zDestTable = "sqlite_stat4"; 4988 shell_exec(p->db, "SELECT * FROM sqlite_stat4", 4989 shell_callback, &data, &zErrMsg); 4990 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 4991 } 4992 }else 4993 4994 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 4995 if( nArg==2 ){ 4996 p->showHeader = booleanValue(azArg[1]); 4997 }else{ 4998 raw_printf(stderr, "Usage: .headers on|off\n"); 4999 rc = 1; 5000 } 5001 }else 5002 5003 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 5004 utf8_printf(p->out, "%s", zHelp); 5005 }else 5006 5007 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 5008 char *zTable; /* Insert data into this table */ 5009 char *zFile; /* Name of file to extra content from */ 5010 sqlite3_stmt *pStmt = NULL; /* A statement */ 5011 int nCol; /* Number of columns in the table */ 5012 int nByte; /* Number of bytes in an SQL string */ 5013 int i, j; /* Loop counters */ 5014 int needCommit; /* True to COMMIT or ROLLBACK at end */ 5015 int nSep; /* Number of bytes in p->colSeparator[] */ 5016 char *zSql; /* An SQL statement */ 5017 ImportCtx sCtx; /* Reader context */ 5018 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 5019 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */ 5020 5021 if( nArg!=3 ){ 5022 raw_printf(stderr, "Usage: .import FILE TABLE\n"); 5023 goto meta_command_exit; 5024 } 5025 zFile = azArg[1]; 5026 zTable = azArg[2]; 5027 seenInterrupt = 0; 5028 memset(&sCtx, 0, sizeof(sCtx)); 5029 open_db(p, 0); 5030 nSep = strlen30(p->colSeparator); 5031 if( nSep==0 ){ 5032 raw_printf(stderr, 5033 "Error: non-null column separator required for import\n"); 5034 return 1; 5035 } 5036 if( nSep>1 ){ 5037 raw_printf(stderr, "Error: multi-character column separators not allowed" 5038 " for import\n"); 5039 return 1; 5040 } 5041 nSep = strlen30(p->rowSeparator); 5042 if( nSep==0 ){ 5043 raw_printf(stderr, "Error: non-null row separator required for import\n"); 5044 return 1; 5045 } 5046 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){ 5047 /* When importing CSV (only), if the row separator is set to the 5048 ** default output row separator, change it to the default input 5049 ** row separator. This avoids having to maintain different input 5050 ** and output row separators. */ 5051 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 5052 nSep = strlen30(p->rowSeparator); 5053 } 5054 if( nSep>1 ){ 5055 raw_printf(stderr, "Error: multi-character row separators not allowed" 5056 " for import\n"); 5057 return 1; 5058 } 5059 sCtx.zFile = zFile; 5060 sCtx.nLine = 1; 5061 if( sCtx.zFile[0]=='|' ){ 5062 #ifdef SQLITE_OMIT_POPEN 5063 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 5064 return 1; 5065 #else 5066 sCtx.in = popen(sCtx.zFile+1, "r"); 5067 sCtx.zFile = "<pipe>"; 5068 xCloser = pclose; 5069 #endif 5070 }else{ 5071 sCtx.in = fopen(sCtx.zFile, "rb"); 5072 xCloser = fclose; 5073 } 5074 if( p->mode==MODE_Ascii ){ 5075 xRead = ascii_read_one_field; 5076 }else{ 5077 xRead = csv_read_one_field; 5078 } 5079 if( sCtx.in==0 ){ 5080 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 5081 return 1; 5082 } 5083 sCtx.cColSep = p->colSeparator[0]; 5084 sCtx.cRowSep = p->rowSeparator[0]; 5085 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); 5086 if( zSql==0 ){ 5087 raw_printf(stderr, "Error: out of memory\n"); 5088 xCloser(sCtx.in); 5089 return 1; 5090 } 5091 nByte = strlen30(zSql); 5092 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5093 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 5094 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 5095 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); 5096 char cSep = '('; 5097 while( xRead(&sCtx) ){ 5098 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 5099 cSep = ','; 5100 if( sCtx.cTerm!=sCtx.cColSep ) break; 5101 } 5102 if( cSep=='(' ){ 5103 sqlite3_free(zCreate); 5104 sqlite3_free(sCtx.z); 5105 xCloser(sCtx.in); 5106 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 5107 return 1; 5108 } 5109 zCreate = sqlite3_mprintf("%z\n)", zCreate); 5110 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 5111 sqlite3_free(zCreate); 5112 if( rc ){ 5113 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, 5114 sqlite3_errmsg(p->db)); 5115 sqlite3_free(sCtx.z); 5116 xCloser(sCtx.in); 5117 return 1; 5118 } 5119 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5120 } 5121 sqlite3_free(zSql); 5122 if( rc ){ 5123 if (pStmt) sqlite3_finalize(pStmt); 5124 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 5125 xCloser(sCtx.in); 5126 return 1; 5127 } 5128 nCol = sqlite3_column_count(pStmt); 5129 sqlite3_finalize(pStmt); 5130 pStmt = 0; 5131 if( nCol==0 ) return 0; /* no columns, no error */ 5132 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 5133 if( zSql==0 ){ 5134 raw_printf(stderr, "Error: out of memory\n"); 5135 xCloser(sCtx.in); 5136 return 1; 5137 } 5138 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 5139 j = strlen30(zSql); 5140 for(i=1; i<nCol; i++){ 5141 zSql[j++] = ','; 5142 zSql[j++] = '?'; 5143 } 5144 zSql[j++] = ')'; 5145 zSql[j] = 0; 5146 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5147 sqlite3_free(zSql); 5148 if( rc ){ 5149 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 5150 if (pStmt) sqlite3_finalize(pStmt); 5151 xCloser(sCtx.in); 5152 return 1; 5153 } 5154 needCommit = sqlite3_get_autocommit(p->db); 5155 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 5156 do{ 5157 int startLine = sCtx.nLine; 5158 for(i=0; i<nCol; i++){ 5159 char *z = xRead(&sCtx); 5160 /* 5161 ** Did we reach end-of-file before finding any columns? 5162 ** If so, stop instead of NULL filling the remaining columns. 5163 */ 5164 if( z==0 && i==0 ) break; 5165 /* 5166 ** Did we reach end-of-file OR end-of-line before finding any 5167 ** columns in ASCII mode? If so, stop instead of NULL filling 5168 ** the remaining columns. 5169 */ 5170 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 5171 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 5172 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 5173 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 5174 "filling the rest with NULL\n", 5175 sCtx.zFile, startLine, nCol, i+1); 5176 i += 2; 5177 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 5178 } 5179 } 5180 if( sCtx.cTerm==sCtx.cColSep ){ 5181 do{ 5182 xRead(&sCtx); 5183 i++; 5184 }while( sCtx.cTerm==sCtx.cColSep ); 5185 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 5186 "extras ignored\n", 5187 sCtx.zFile, startLine, nCol, i); 5188 } 5189 if( i>=nCol ){ 5190 sqlite3_step(pStmt); 5191 rc = sqlite3_reset(pStmt); 5192 if( rc!=SQLITE_OK ){ 5193 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 5194 startLine, sqlite3_errmsg(p->db)); 5195 } 5196 } 5197 }while( sCtx.cTerm!=EOF ); 5198 5199 xCloser(sCtx.in); 5200 sqlite3_free(sCtx.z); 5201 sqlite3_finalize(pStmt); 5202 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 5203 }else 5204 5205 #ifndef SQLITE_UNTESTABLE 5206 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 5207 char *zSql; 5208 char *zCollist = 0; 5209 sqlite3_stmt *pStmt; 5210 int tnum = 0; 5211 int i; 5212 if( nArg!=3 ){ 5213 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"); 5214 rc = 1; 5215 goto meta_command_exit; 5216 } 5217 open_db(p, 0); 5218 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master" 5219 " WHERE name='%q' AND type='index'", azArg[1]); 5220 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5221 sqlite3_free(zSql); 5222 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 5223 tnum = sqlite3_column_int(pStmt, 0); 5224 } 5225 sqlite3_finalize(pStmt); 5226 if( tnum==0 ){ 5227 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 5228 rc = 1; 5229 goto meta_command_exit; 5230 } 5231 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 5232 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5233 sqlite3_free(zSql); 5234 i = 0; 5235 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 5236 char zLabel[20]; 5237 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 5238 i++; 5239 if( zCol==0 ){ 5240 if( sqlite3_column_int(pStmt,1)==-1 ){ 5241 zCol = "_ROWID_"; 5242 }else{ 5243 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 5244 zCol = zLabel; 5245 } 5246 } 5247 if( zCollist==0 ){ 5248 zCollist = sqlite3_mprintf("\"%w\"", zCol); 5249 }else{ 5250 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 5251 } 5252 } 5253 sqlite3_finalize(pStmt); 5254 zSql = sqlite3_mprintf( 5255 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID", 5256 azArg[2], zCollist, zCollist); 5257 sqlite3_free(zCollist); 5258 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 5259 if( rc==SQLITE_OK ){ 5260 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 5261 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 5262 if( rc ){ 5263 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 5264 }else{ 5265 utf8_printf(stdout, "%s;\n", zSql); 5266 raw_printf(stdout, 5267 "WARNING: writing to an imposter table will corrupt the index!\n" 5268 ); 5269 } 5270 }else{ 5271 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 5272 rc = 1; 5273 } 5274 sqlite3_free(zSql); 5275 }else 5276 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 5277 5278 #ifdef SQLITE_ENABLE_IOTRACE 5279 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 5280 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 5281 if( iotrace && iotrace!=stdout ) fclose(iotrace); 5282 iotrace = 0; 5283 if( nArg<2 ){ 5284 sqlite3IoTrace = 0; 5285 }else if( strcmp(azArg[1], "-")==0 ){ 5286 sqlite3IoTrace = iotracePrintf; 5287 iotrace = stdout; 5288 }else{ 5289 iotrace = fopen(azArg[1], "w"); 5290 if( iotrace==0 ){ 5291 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 5292 sqlite3IoTrace = 0; 5293 rc = 1; 5294 }else{ 5295 sqlite3IoTrace = iotracePrintf; 5296 } 5297 } 5298 }else 5299 #endif 5300 5301 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 5302 static const struct { 5303 const char *zLimitName; /* Name of a limit */ 5304 int limitCode; /* Integer code for that limit */ 5305 } aLimit[] = { 5306 { "length", SQLITE_LIMIT_LENGTH }, 5307 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 5308 { "column", SQLITE_LIMIT_COLUMN }, 5309 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 5310 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 5311 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 5312 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 5313 { "attached", SQLITE_LIMIT_ATTACHED }, 5314 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 5315 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 5316 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 5317 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 5318 }; 5319 int i, n2; 5320 open_db(p, 0); 5321 if( nArg==1 ){ 5322 for(i=0; i<ArraySize(aLimit); i++){ 5323 printf("%20s %d\n", aLimit[i].zLimitName, 5324 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 5325 } 5326 }else if( nArg>3 ){ 5327 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 5328 rc = 1; 5329 goto meta_command_exit; 5330 }else{ 5331 int iLimit = -1; 5332 n2 = strlen30(azArg[1]); 5333 for(i=0; i<ArraySize(aLimit); i++){ 5334 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 5335 if( iLimit<0 ){ 5336 iLimit = i; 5337 }else{ 5338 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 5339 rc = 1; 5340 goto meta_command_exit; 5341 } 5342 } 5343 } 5344 if( iLimit<0 ){ 5345 utf8_printf(stderr, "unknown limit: \"%s\"\n" 5346 "enter \".limits\" with no arguments for a list.\n", 5347 azArg[1]); 5348 rc = 1; 5349 goto meta_command_exit; 5350 } 5351 if( nArg==3 ){ 5352 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 5353 (int)integerValue(azArg[2])); 5354 } 5355 printf("%20s %d\n", aLimit[iLimit].zLimitName, 5356 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 5357 } 5358 }else 5359 5360 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 5361 open_db(p, 0); 5362 lintDotCommand(p, azArg, nArg); 5363 }else 5364 5365 #ifndef SQLITE_OMIT_LOAD_EXTENSION 5366 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 5367 const char *zFile, *zProc; 5368 char *zErrMsg = 0; 5369 if( nArg<2 ){ 5370 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 5371 rc = 1; 5372 goto meta_command_exit; 5373 } 5374 zFile = azArg[1]; 5375 zProc = nArg>=3 ? azArg[2] : 0; 5376 open_db(p, 0); 5377 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 5378 if( rc!=SQLITE_OK ){ 5379 utf8_printf(stderr, "Error: %s\n", zErrMsg); 5380 sqlite3_free(zErrMsg); 5381 rc = 1; 5382 } 5383 }else 5384 #endif 5385 5386 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 5387 if( nArg!=2 ){ 5388 raw_printf(stderr, "Usage: .log FILENAME\n"); 5389 rc = 1; 5390 }else{ 5391 const char *zFile = azArg[1]; 5392 output_file_close(p->pLog); 5393 p->pLog = output_file_open(zFile); 5394 } 5395 }else 5396 5397 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 5398 const char *zMode = nArg>=2 ? azArg[1] : ""; 5399 int n2 = (int)strlen(zMode); 5400 int c2 = zMode[0]; 5401 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 5402 p->mode = MODE_Line; 5403 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 5404 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 5405 p->mode = MODE_Column; 5406 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 5407 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 5408 p->mode = MODE_List; 5409 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 5410 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 5411 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 5412 p->mode = MODE_Html; 5413 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 5414 p->mode = MODE_Tcl; 5415 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 5416 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 5417 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 5418 p->mode = MODE_Csv; 5419 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 5420 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 5421 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 5422 p->mode = MODE_List; 5423 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 5424 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 5425 p->mode = MODE_Insert; 5426 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 5427 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 5428 p->mode = MODE_Quote; 5429 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 5430 p->mode = MODE_Ascii; 5431 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 5432 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 5433 }else { 5434 raw_printf(stderr, "Error: mode should be one of: " 5435 "ascii column csv html insert line list quote tabs tcl\n"); 5436 rc = 1; 5437 } 5438 p->cMode = p->mode; 5439 }else 5440 5441 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 5442 if( nArg==2 ){ 5443 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 5444 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 5445 }else{ 5446 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 5447 rc = 1; 5448 } 5449 }else 5450 5451 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 5452 char *zNewFilename; /* Name of the database file to open */ 5453 int iName = 1; /* Index in azArg[] of the filename */ 5454 int newFlag = 0; /* True to delete file before opening */ 5455 /* Close the existing database */ 5456 session_close_all(p); 5457 sqlite3_close(p->db); 5458 p->db = 0; 5459 p->zDbFilename = 0; 5460 sqlite3_free(p->zFreeOnClose); 5461 p->zFreeOnClose = 0; 5462 /* Check for command-line arguments */ 5463 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){ 5464 const char *z = azArg[iName]; 5465 if( optionMatch(z,"new") ){ 5466 newFlag = 1; 5467 }else if( z[0]=='-' ){ 5468 utf8_printf(stderr, "unknown option: %s\n", z); 5469 rc = 1; 5470 goto meta_command_exit; 5471 } 5472 } 5473 /* If a filename is specified, try to open it first */ 5474 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; 5475 if( zNewFilename ){ 5476 if( newFlag ) shellDeleteFile(zNewFilename); 5477 p->zDbFilename = zNewFilename; 5478 open_db(p, 1); 5479 if( p->db==0 ){ 5480 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 5481 sqlite3_free(zNewFilename); 5482 }else{ 5483 p->zFreeOnClose = zNewFilename; 5484 } 5485 } 5486 if( p->db==0 ){ 5487 /* As a fall-back open a TEMP database */ 5488 p->zDbFilename = 0; 5489 open_db(p, 0); 5490 } 5491 }else 5492 5493 if( c=='o' 5494 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0) 5495 ){ 5496 const char *zFile = nArg>=2 ? azArg[1] : "stdout"; 5497 if( nArg>2 ){ 5498 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]); 5499 rc = 1; 5500 goto meta_command_exit; 5501 } 5502 if( n>1 && strncmp(azArg[0], "once", n)==0 ){ 5503 if( nArg<2 ){ 5504 raw_printf(stderr, "Usage: .once FILE\n"); 5505 rc = 1; 5506 goto meta_command_exit; 5507 } 5508 p->outCount = 2; 5509 }else{ 5510 p->outCount = 0; 5511 } 5512 output_reset(p); 5513 if( zFile[0]=='|' ){ 5514 #ifdef SQLITE_OMIT_POPEN 5515 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 5516 rc = 1; 5517 p->out = stdout; 5518 #else 5519 p->out = popen(zFile + 1, "w"); 5520 if( p->out==0 ){ 5521 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 5522 p->out = stdout; 5523 rc = 1; 5524 }else{ 5525 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 5526 } 5527 #endif 5528 }else{ 5529 p->out = output_file_open(zFile); 5530 if( p->out==0 ){ 5531 if( strcmp(zFile,"off")!=0 ){ 5532 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 5533 } 5534 p->out = stdout; 5535 rc = 1; 5536 } else { 5537 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 5538 } 5539 } 5540 }else 5541 5542 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 5543 int i; 5544 for(i=1; i<nArg; i++){ 5545 if( i>1 ) raw_printf(p->out, " "); 5546 utf8_printf(p->out, "%s", azArg[i]); 5547 } 5548 raw_printf(p->out, "\n"); 5549 }else 5550 5551 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 5552 if( nArg >= 2) { 5553 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 5554 } 5555 if( nArg >= 3) { 5556 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 5557 } 5558 }else 5559 5560 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 5561 rc = 2; 5562 }else 5563 5564 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 5565 FILE *alt; 5566 if( nArg!=2 ){ 5567 raw_printf(stderr, "Usage: .read FILE\n"); 5568 rc = 1; 5569 goto meta_command_exit; 5570 } 5571 alt = fopen(azArg[1], "rb"); 5572 if( alt==0 ){ 5573 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 5574 rc = 1; 5575 }else{ 5576 rc = process_input(p, alt); 5577 fclose(alt); 5578 } 5579 }else 5580 5581 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 5582 const char *zSrcFile; 5583 const char *zDb; 5584 sqlite3 *pSrc; 5585 sqlite3_backup *pBackup; 5586 int nTimeout = 0; 5587 5588 if( nArg==2 ){ 5589 zSrcFile = azArg[1]; 5590 zDb = "main"; 5591 }else if( nArg==3 ){ 5592 zSrcFile = azArg[2]; 5593 zDb = azArg[1]; 5594 }else{ 5595 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 5596 rc = 1; 5597 goto meta_command_exit; 5598 } 5599 rc = sqlite3_open(zSrcFile, &pSrc); 5600 if( rc!=SQLITE_OK ){ 5601 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 5602 sqlite3_close(pSrc); 5603 return 1; 5604 } 5605 open_db(p, 0); 5606 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 5607 if( pBackup==0 ){ 5608 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 5609 sqlite3_close(pSrc); 5610 return 1; 5611 } 5612 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 5613 || rc==SQLITE_BUSY ){ 5614 if( rc==SQLITE_BUSY ){ 5615 if( nTimeout++ >= 3 ) break; 5616 sqlite3_sleep(100); 5617 } 5618 } 5619 sqlite3_backup_finish(pBackup); 5620 if( rc==SQLITE_DONE ){ 5621 rc = 0; 5622 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 5623 raw_printf(stderr, "Error: source database is busy\n"); 5624 rc = 1; 5625 }else{ 5626 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 5627 rc = 1; 5628 } 5629 sqlite3_close(pSrc); 5630 }else 5631 5632 5633 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 5634 if( nArg==2 ){ 5635 p->scanstatsOn = booleanValue(azArg[1]); 5636 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 5637 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 5638 #endif 5639 }else{ 5640 raw_printf(stderr, "Usage: .scanstats on|off\n"); 5641 rc = 1; 5642 } 5643 }else 5644 5645 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 5646 ShellState data; 5647 char *zErrMsg = 0; 5648 open_db(p, 0); 5649 memcpy(&data, p, sizeof(data)); 5650 data.showHeader = 0; 5651 data.cMode = data.mode = MODE_Semi; 5652 if( nArg>=2 && optionMatch(azArg[1], "indent") ){ 5653 data.cMode = data.mode = MODE_Pretty; 5654 nArg--; 5655 if( nArg==2 ) azArg[1] = azArg[2]; 5656 } 5657 if( nArg==2 && azArg[1][0]!='-' ){ 5658 int i; 5659 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]); 5660 if( strcmp(azArg[1],"sqlite_master")==0 ){ 5661 char *new_argv[2], *new_colv[2]; 5662 new_argv[0] = "CREATE TABLE sqlite_master (\n" 5663 " type text,\n" 5664 " name text,\n" 5665 " tbl_name text,\n" 5666 " rootpage integer,\n" 5667 " sql text\n" 5668 ")"; 5669 new_argv[1] = 0; 5670 new_colv[0] = "sql"; 5671 new_colv[1] = 0; 5672 callback(&data, 1, new_argv, new_colv); 5673 rc = SQLITE_OK; 5674 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ 5675 char *new_argv[2], *new_colv[2]; 5676 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" 5677 " type text,\n" 5678 " name text,\n" 5679 " tbl_name text,\n" 5680 " rootpage integer,\n" 5681 " sql text\n" 5682 ")"; 5683 new_argv[1] = 0; 5684 new_colv[0] = "sql"; 5685 new_colv[1] = 0; 5686 callback(&data, 1, new_argv, new_colv); 5687 rc = SQLITE_OK; 5688 }else{ 5689 char *zSql; 5690 zSql = sqlite3_mprintf( 5691 "SELECT sql FROM " 5692 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 5693 " FROM sqlite_master UNION ALL" 5694 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " 5695 "WHERE lower(tbl_name) LIKE %Q" 5696 " AND type!='meta' AND sql NOTNULL " 5697 "ORDER BY rowid", azArg[1]); 5698 rc = sqlite3_exec(p->db, zSql, callback, &data, &zErrMsg); 5699 sqlite3_free(zSql); 5700 } 5701 }else if( nArg==1 ){ 5702 rc = sqlite3_exec(p->db, 5703 "SELECT sql FROM " 5704 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 5705 " FROM sqlite_master UNION ALL" 5706 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " 5707 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 5708 "ORDER BY rowid", 5709 callback, &data, &zErrMsg 5710 ); 5711 }else{ 5712 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n"); 5713 rc = 1; 5714 goto meta_command_exit; 5715 } 5716 if( zErrMsg ){ 5717 utf8_printf(stderr,"Error: %s\n", zErrMsg); 5718 sqlite3_free(zErrMsg); 5719 rc = 1; 5720 }else if( rc != SQLITE_OK ){ 5721 raw_printf(stderr,"Error: querying schema information\n"); 5722 rc = 1; 5723 }else{ 5724 rc = 0; 5725 } 5726 }else 5727 5728 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 5729 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 5730 sqlite3SelectTrace = (int)integerValue(azArg[1]); 5731 }else 5732 #endif 5733 5734 #if defined(SQLITE_ENABLE_SESSION) 5735 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 5736 OpenSession *pSession = &p->aSession[0]; 5737 char **azCmd = &azArg[1]; 5738 int iSes = 0; 5739 int nCmd = nArg - 1; 5740 int i; 5741 if( nArg<=1 ) goto session_syntax_error; 5742 open_db(p, 0); 5743 if( nArg>=3 ){ 5744 for(iSes=0; iSes<p->nSession; iSes++){ 5745 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; 5746 } 5747 if( iSes<p->nSession ){ 5748 pSession = &p->aSession[iSes]; 5749 azCmd++; 5750 nCmd--; 5751 }else{ 5752 pSession = &p->aSession[0]; 5753 iSes = 0; 5754 } 5755 } 5756 5757 /* .session attach TABLE 5758 ** Invoke the sqlite3session_attach() interface to attach a particular 5759 ** table so that it is never filtered. 5760 */ 5761 if( strcmp(azCmd[0],"attach")==0 ){ 5762 if( nCmd!=2 ) goto session_syntax_error; 5763 if( pSession->p==0 ){ 5764 session_not_open: 5765 raw_printf(stderr, "ERROR: No sessions are open\n"); 5766 }else{ 5767 rc = sqlite3session_attach(pSession->p, azCmd[1]); 5768 if( rc ){ 5769 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 5770 rc = 0; 5771 } 5772 } 5773 }else 5774 5775 /* .session changeset FILE 5776 ** .session patchset FILE 5777 ** Write a changeset or patchset into a file. The file is overwritten. 5778 */ 5779 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 5780 FILE *out = 0; 5781 if( nCmd!=2 ) goto session_syntax_error; 5782 if( pSession->p==0 ) goto session_not_open; 5783 out = fopen(azCmd[1], "wb"); 5784 if( out==0 ){ 5785 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]); 5786 }else{ 5787 int szChng; 5788 void *pChng; 5789 if( azCmd[0][0]=='c' ){ 5790 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 5791 }else{ 5792 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 5793 } 5794 if( rc ){ 5795 printf("Error: error code %d\n", rc); 5796 rc = 0; 5797 } 5798 if( pChng 5799 && fwrite(pChng, szChng, 1, out)!=1 ){ 5800 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 5801 szChng); 5802 } 5803 sqlite3_free(pChng); 5804 fclose(out); 5805 } 5806 }else 5807 5808 /* .session close 5809 ** Close the identified session 5810 */ 5811 if( strcmp(azCmd[0], "close")==0 ){ 5812 if( nCmd!=1 ) goto session_syntax_error; 5813 if( p->nSession ){ 5814 session_close(pSession); 5815 p->aSession[iSes] = p->aSession[--p->nSession]; 5816 } 5817 }else 5818 5819 /* .session enable ?BOOLEAN? 5820 ** Query or set the enable flag 5821 */ 5822 if( strcmp(azCmd[0], "enable")==0 ){ 5823 int ii; 5824 if( nCmd>2 ) goto session_syntax_error; 5825 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 5826 if( p->nSession ){ 5827 ii = sqlite3session_enable(pSession->p, ii); 5828 utf8_printf(p->out, "session %s enable flag = %d\n", 5829 pSession->zName, ii); 5830 } 5831 }else 5832 5833 /* .session filter GLOB .... 5834 ** Set a list of GLOB patterns of table names to be excluded. 5835 */ 5836 if( strcmp(azCmd[0], "filter")==0 ){ 5837 int ii, nByte; 5838 if( nCmd<2 ) goto session_syntax_error; 5839 if( p->nSession ){ 5840 for(ii=0; ii<pSession->nFilter; ii++){ 5841 sqlite3_free(pSession->azFilter[ii]); 5842 } 5843 sqlite3_free(pSession->azFilter); 5844 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 5845 pSession->azFilter = sqlite3_malloc( nByte ); 5846 if( pSession->azFilter==0 ){ 5847 raw_printf(stderr, "Error: out or memory\n"); 5848 exit(1); 5849 } 5850 for(ii=1; ii<nCmd; ii++){ 5851 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 5852 } 5853 pSession->nFilter = ii-1; 5854 } 5855 }else 5856 5857 /* .session indirect ?BOOLEAN? 5858 ** Query or set the indirect flag 5859 */ 5860 if( strcmp(azCmd[0], "indirect")==0 ){ 5861 int ii; 5862 if( nCmd>2 ) goto session_syntax_error; 5863 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 5864 if( p->nSession ){ 5865 ii = sqlite3session_indirect(pSession->p, ii); 5866 utf8_printf(p->out, "session %s indirect flag = %d\n", 5867 pSession->zName, ii); 5868 } 5869 }else 5870 5871 /* .session isempty 5872 ** Determine if the session is empty 5873 */ 5874 if( strcmp(azCmd[0], "isempty")==0 ){ 5875 int ii; 5876 if( nCmd!=1 ) goto session_syntax_error; 5877 if( p->nSession ){ 5878 ii = sqlite3session_isempty(pSession->p); 5879 utf8_printf(p->out, "session %s isempty flag = %d\n", 5880 pSession->zName, ii); 5881 } 5882 }else 5883 5884 /* .session list 5885 ** List all currently open sessions 5886 */ 5887 if( strcmp(azCmd[0],"list")==0 ){ 5888 for(i=0; i<p->nSession; i++){ 5889 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); 5890 } 5891 }else 5892 5893 /* .session open DB NAME 5894 ** Open a new session called NAME on the attached database DB. 5895 ** DB is normally "main". 5896 */ 5897 if( strcmp(azCmd[0],"open")==0 ){ 5898 char *zName; 5899 if( nCmd!=3 ) goto session_syntax_error; 5900 zName = azCmd[2]; 5901 if( zName[0]==0 ) goto session_syntax_error; 5902 for(i=0; i<p->nSession; i++){ 5903 if( strcmp(p->aSession[i].zName,zName)==0 ){ 5904 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 5905 goto meta_command_exit; 5906 } 5907 } 5908 if( p->nSession>=ArraySize(p->aSession) ){ 5909 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); 5910 goto meta_command_exit; 5911 } 5912 pSession = &p->aSession[p->nSession]; 5913 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 5914 if( rc ){ 5915 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 5916 rc = 0; 5917 goto meta_command_exit; 5918 } 5919 pSession->nFilter = 0; 5920 sqlite3session_table_filter(pSession->p, session_filter, pSession); 5921 p->nSession++; 5922 pSession->zName = sqlite3_mprintf("%s", zName); 5923 }else 5924 /* If no command name matches, show a syntax error */ 5925 session_syntax_error: 5926 session_help(p); 5927 }else 5928 #endif 5929 5930 #ifdef SQLITE_DEBUG 5931 /* Undocumented commands for internal testing. Subject to change 5932 ** without notice. */ 5933 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 5934 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 5935 int i, v; 5936 for(i=1; i<nArg; i++){ 5937 v = booleanValue(azArg[i]); 5938 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 5939 } 5940 } 5941 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 5942 int i; sqlite3_int64 v; 5943 for(i=1; i<nArg; i++){ 5944 char zBuf[200]; 5945 v = integerValue(azArg[i]); 5946 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 5947 utf8_printf(p->out, "%s", zBuf); 5948 } 5949 } 5950 }else 5951 #endif 5952 5953 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 5954 int bIsInit = 0; /* True to initialize the SELFTEST table */ 5955 int bVerbose = 0; /* Verbose output */ 5956 int bSelftestExists; /* True if SELFTEST already exists */ 5957 char **azTest = 0; /* Content of the SELFTEST table */ 5958 int nRow = 0; /* Number of rows in the SELFTEST table */ 5959 int nCol = 4; /* Number of columns in the SELFTEST table */ 5960 int i; /* Loop counter */ 5961 int nTest = 0; /* Number of tests runs */ 5962 int nErr = 0; /* Number of errors seen */ 5963 ShellText str; /* Answer for a query */ 5964 static char *azDefaultTest[] = { 5965 0, 0, 0, 0, 5966 "0", "memo", "Missing SELFTEST table - default checks only", "", 5967 "1", "run", "PRAGMA integrity_check", "ok" 5968 }; 5969 static const int nDefaultRow = 2; 5970 5971 open_db(p,0); 5972 for(i=1; i<nArg; i++){ 5973 const char *z = azArg[i]; 5974 if( z[0]=='-' && z[1]=='-' ) z++; 5975 if( strcmp(z,"-init")==0 ){ 5976 bIsInit = 1; 5977 }else 5978 if( strcmp(z,"-v")==0 ){ 5979 bVerbose++; 5980 }else 5981 { 5982 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 5983 azArg[i], azArg[0]); 5984 raw_printf(stderr, "Should be one of: --init -v\n"); 5985 rc = 1; 5986 goto meta_command_exit; 5987 } 5988 } 5989 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 5990 != SQLITE_OK ){ 5991 bSelftestExists = 0; 5992 }else{ 5993 bSelftestExists = 1; 5994 } 5995 if( bIsInit ){ 5996 createSelftestTable(p); 5997 bSelftestExists = 1; 5998 } 5999 if( bSelftestExists ){ 6000 rc = sqlite3_get_table(p->db, 6001 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 6002 &azTest, &nRow, &nCol, 0); 6003 if( rc ){ 6004 raw_printf(stderr, "Error querying the selftest table\n"); 6005 rc = 1; 6006 sqlite3_free_table(azTest); 6007 goto meta_command_exit; 6008 }else if( nRow==0 ){ 6009 sqlite3_free_table(azTest); 6010 azTest = azDefaultTest; 6011 nRow = nDefaultRow; 6012 } 6013 }else{ 6014 azTest = azDefaultTest; 6015 nRow = nDefaultRow; 6016 } 6017 initText(&str); 6018 appendText(&str, "x", 0); 6019 for(i=1; i<=nRow; i++){ 6020 int tno = atoi(azTest[i*nCol]); 6021 const char *zOp = azTest[i*nCol+1]; 6022 const char *zSql = azTest[i*nCol+2]; 6023 const char *zAns = azTest[i*nCol+3]; 6024 6025 if( bVerbose>0 ){ 6026 char *zQuote = sqlite3_mprintf("%q", zSql); 6027 printf("%d: %s %s\n", tno, zOp, zSql); 6028 sqlite3_free(zQuote); 6029 } 6030 if( strcmp(zOp,"memo")==0 ){ 6031 utf8_printf(p->out, "%s\n", zSql); 6032 }else 6033 if( strcmp(zOp,"run")==0 ){ 6034 char *zErrMsg = 0; 6035 str.n = 0; 6036 str.z[0] = 0; 6037 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 6038 nTest++; 6039 if( bVerbose ){ 6040 utf8_printf(p->out, "Result: %s\n", str.z); 6041 } 6042 if( rc || zErrMsg ){ 6043 nErr++; 6044 rc = 1; 6045 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 6046 sqlite3_free(zErrMsg); 6047 }else if( strcmp(zAns,str.z)!=0 ){ 6048 nErr++; 6049 rc = 1; 6050 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 6051 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 6052 } 6053 }else 6054 { 6055 utf8_printf(stderr, 6056 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 6057 rc = 1; 6058 break; 6059 } 6060 } 6061 freeText(&str); 6062 if( azTest!=azDefaultTest ) sqlite3_free_table(azTest); 6063 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 6064 }else 6065 6066 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 6067 if( nArg<2 || nArg>3 ){ 6068 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 6069 rc = 1; 6070 } 6071 if( nArg>=2 ){ 6072 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 6073 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 6074 } 6075 if( nArg>=3 ){ 6076 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 6077 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 6078 } 6079 }else 6080 6081 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 6082 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 6083 int i; /* Loop counter */ 6084 int bSchema = 0; /* Also hash the schema */ 6085 int bSeparate = 0; /* Hash each table separately */ 6086 int iSize = 224; /* Hash algorithm to use */ 6087 int bDebug = 0; /* Only show the query that would have run */ 6088 sqlite3_stmt *pStmt; /* For querying tables names */ 6089 char *zSql; /* SQL to be run */ 6090 char *zSep; /* Separator */ 6091 ShellText sSql; /* Complete SQL for the query to run the hash */ 6092 ShellText sQuery; /* Set of queries used to read all content */ 6093 open_db(p, 0); 6094 for(i=1; i<nArg; i++){ 6095 const char *z = azArg[i]; 6096 if( z[0]=='-' ){ 6097 z++; 6098 if( z[0]=='-' ) z++; 6099 if( strcmp(z,"schema")==0 ){ 6100 bSchema = 1; 6101 }else 6102 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 6103 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 6104 ){ 6105 iSize = atoi(&z[5]); 6106 }else 6107 if( strcmp(z,"debug")==0 ){ 6108 bDebug = 1; 6109 }else 6110 { 6111 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 6112 azArg[i], azArg[0]); 6113 raw_printf(stderr, "Should be one of: --schema" 6114 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n"); 6115 rc = 1; 6116 goto meta_command_exit; 6117 } 6118 }else if( zLike ){ 6119 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 6120 rc = 1; 6121 goto meta_command_exit; 6122 }else{ 6123 zLike = z; 6124 bSeparate = 1; 6125 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1; 6126 } 6127 } 6128 if( bSchema ){ 6129 zSql = "SELECT lower(name) FROM sqlite_master" 6130 " WHERE type='table' AND coalesce(rootpage,0)>1" 6131 " UNION ALL SELECT 'sqlite_master'" 6132 " ORDER BY 1 collate nocase"; 6133 }else{ 6134 zSql = "SELECT lower(name) FROM sqlite_master" 6135 " WHERE type='table' AND coalesce(rootpage,0)>1" 6136 " AND name NOT LIKE 'sqlite_%'" 6137 " ORDER BY 1 collate nocase"; 6138 } 6139 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6140 initText(&sQuery); 6141 initText(&sSql); 6142 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 6143 zSep = "VALUES("; 6144 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 6145 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 6146 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 6147 if( strncmp(zTab, "sqlite_",7)!=0 ){ 6148 appendText(&sQuery,"SELECT * FROM ", 0); 6149 appendText(&sQuery,zTab,'"'); 6150 appendText(&sQuery," NOT INDEXED;", 0); 6151 }else if( strcmp(zTab, "sqlite_master")==0 ){ 6152 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master" 6153 " ORDER BY name;", 0); 6154 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 6155 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 6156 " ORDER BY name;", 0); 6157 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 6158 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 6159 " ORDER BY tbl,idx;", 0); 6160 }else if( strcmp(zTab, "sqlite_stat3")==0 6161 || strcmp(zTab, "sqlite_stat4")==0 ){ 6162 appendText(&sQuery, "SELECT * FROM ", 0); 6163 appendText(&sQuery, zTab, 0); 6164 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 6165 } 6166 appendText(&sSql, zSep, 0); 6167 appendText(&sSql, sQuery.z, '\''); 6168 sQuery.n = 0; 6169 appendText(&sSql, ",", 0); 6170 appendText(&sSql, zTab, '\''); 6171 zSep = "),("; 6172 } 6173 sqlite3_finalize(pStmt); 6174 if( bSeparate ){ 6175 zSql = sqlite3_mprintf( 6176 "%s))" 6177 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 6178 " FROM [sha3sum$query]", 6179 sSql.z, iSize); 6180 }else{ 6181 zSql = sqlite3_mprintf( 6182 "%s))" 6183 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 6184 " FROM [sha3sum$query]", 6185 sSql.z, iSize); 6186 } 6187 freeText(&sQuery); 6188 freeText(&sSql); 6189 if( bDebug ){ 6190 utf8_printf(p->out, "%s\n", zSql); 6191 }else{ 6192 shell_exec(p->db, zSql, shell_callback, p, 0); 6193 } 6194 sqlite3_free(zSql); 6195 }else 6196 6197 if( c=='s' 6198 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 6199 ){ 6200 char *zCmd; 6201 int i, x; 6202 if( nArg<2 ){ 6203 raw_printf(stderr, "Usage: .system COMMAND\n"); 6204 rc = 1; 6205 goto meta_command_exit; 6206 } 6207 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 6208 for(i=2; i<nArg; i++){ 6209 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 6210 zCmd, azArg[i]); 6211 } 6212 x = system(zCmd); 6213 sqlite3_free(zCmd); 6214 if( x ) raw_printf(stderr, "System command returns %d\n", x); 6215 }else 6216 6217 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 6218 static const char *azBool[] = { "off", "on", "full", "unk" }; 6219 int i; 6220 if( nArg!=1 ){ 6221 raw_printf(stderr, "Usage: .show\n"); 6222 rc = 1; 6223 goto meta_command_exit; 6224 } 6225 utf8_printf(p->out, "%12.12s: %s\n","echo", 6226 azBool[ShellHasFlag(p, SHFLG_Echo)]); 6227 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 6228 utf8_printf(p->out, "%12.12s: %s\n","explain", 6229 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 6230 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 6231 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 6232 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 6233 output_c_string(p->out, p->nullValue); 6234 raw_printf(p->out, "\n"); 6235 utf8_printf(p->out,"%12.12s: %s\n","output", 6236 strlen30(p->outfile) ? p->outfile : "stdout"); 6237 utf8_printf(p->out,"%12.12s: ", "colseparator"); 6238 output_c_string(p->out, p->colSeparator); 6239 raw_printf(p->out, "\n"); 6240 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 6241 output_c_string(p->out, p->rowSeparator); 6242 raw_printf(p->out, "\n"); 6243 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); 6244 utf8_printf(p->out, "%12.12s: ", "width"); 6245 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { 6246 raw_printf(p->out, "%d ", p->colWidth[i]); 6247 } 6248 raw_printf(p->out, "\n"); 6249 utf8_printf(p->out, "%12.12s: %s\n", "filename", 6250 p->zDbFilename ? p->zDbFilename : ""); 6251 }else 6252 6253 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 6254 if( nArg==2 ){ 6255 p->statsOn = booleanValue(azArg[1]); 6256 }else if( nArg==1 ){ 6257 display_stats(p->db, p, 0); 6258 }else{ 6259 raw_printf(stderr, "Usage: .stats ?on|off?\n"); 6260 rc = 1; 6261 } 6262 }else 6263 6264 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 6265 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 6266 || strncmp(azArg[0], "indexes", n)==0) ) 6267 ){ 6268 sqlite3_stmt *pStmt; 6269 char **azResult; 6270 int nRow, nAlloc; 6271 char *zSql = 0; 6272 int ii; 6273 open_db(p, 0); 6274 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 6275 if( rc ) return shellDatabaseError(p->db); 6276 6277 /* Create an SQL statement to query for the list of tables in the 6278 ** main and all attached databases where the table name matches the 6279 ** LIKE pattern bound to variable "?1". */ 6280 if( c=='t' ){ 6281 zSql = sqlite3_mprintf( 6282 "SELECT name FROM sqlite_master" 6283 " WHERE type IN ('table','view')" 6284 " AND name NOT LIKE 'sqlite_%%'" 6285 " AND name LIKE ?1"); 6286 }else if( nArg>2 ){ 6287 /* It is an historical accident that the .indexes command shows an error 6288 ** when called with the wrong number of arguments whereas the .tables 6289 ** command does not. */ 6290 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 6291 rc = 1; 6292 goto meta_command_exit; 6293 }else{ 6294 zSql = sqlite3_mprintf( 6295 "SELECT name FROM sqlite_master" 6296 " WHERE type='index'" 6297 " AND tbl_name LIKE ?1"); 6298 } 6299 for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 6300 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 6301 if( zDbName==0 || ii==0 ) continue; 6302 if( c=='t' ){ 6303 zSql = sqlite3_mprintf( 6304 "%z UNION ALL " 6305 "SELECT '%q.' || name FROM \"%w\".sqlite_master" 6306 " WHERE type IN ('table','view')" 6307 " AND name NOT LIKE 'sqlite_%%'" 6308 " AND name LIKE ?1", zSql, zDbName, zDbName); 6309 }else{ 6310 zSql = sqlite3_mprintf( 6311 "%z UNION ALL " 6312 "SELECT '%q.' || name FROM \"%w\".sqlite_master" 6313 " WHERE type='index'" 6314 " AND tbl_name LIKE ?1", zSql, zDbName, zDbName); 6315 } 6316 } 6317 rc = sqlite3_finalize(pStmt); 6318 if( zSql && rc==SQLITE_OK ){ 6319 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql); 6320 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6321 } 6322 sqlite3_free(zSql); 6323 if( !zSql ) return shellNomemError(); 6324 if( rc ) return shellDatabaseError(p->db); 6325 6326 /* Run the SQL statement prepared by the above block. Store the results 6327 ** as an array of nul-terminated strings in azResult[]. */ 6328 nRow = nAlloc = 0; 6329 azResult = 0; 6330 if( nArg>1 ){ 6331 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 6332 }else{ 6333 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 6334 } 6335 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 6336 if( nRow>=nAlloc ){ 6337 char **azNew; 6338 int n2 = nAlloc*2 + 10; 6339 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 6340 if( azNew==0 ){ 6341 rc = shellNomemError(); 6342 break; 6343 } 6344 nAlloc = n2; 6345 azResult = azNew; 6346 } 6347 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 6348 if( 0==azResult[nRow] ){ 6349 rc = shellNomemError(); 6350 break; 6351 } 6352 nRow++; 6353 } 6354 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 6355 rc = shellDatabaseError(p->db); 6356 } 6357 6358 /* Pretty-print the contents of array azResult[] to the output */ 6359 if( rc==0 && nRow>0 ){ 6360 int len, maxlen = 0; 6361 int i, j; 6362 int nPrintCol, nPrintRow; 6363 for(i=0; i<nRow; i++){ 6364 len = strlen30(azResult[i]); 6365 if( len>maxlen ) maxlen = len; 6366 } 6367 nPrintCol = 80/(maxlen+2); 6368 if( nPrintCol<1 ) nPrintCol = 1; 6369 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 6370 for(i=0; i<nPrintRow; i++){ 6371 for(j=i; j<nRow; j+=nPrintRow){ 6372 char *zSp = j<nPrintRow ? "" : " "; 6373 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 6374 azResult[j] ? azResult[j]:""); 6375 } 6376 raw_printf(p->out, "\n"); 6377 } 6378 } 6379 6380 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 6381 sqlite3_free(azResult); 6382 }else 6383 6384 /* Begin redirecting output to the file "testcase-out.txt" */ 6385 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 6386 output_reset(p); 6387 p->out = output_file_open("testcase-out.txt"); 6388 if( p->out==0 ){ 6389 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 6390 } 6391 if( nArg>=2 ){ 6392 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 6393 }else{ 6394 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 6395 } 6396 }else 6397 6398 #ifndef SQLITE_UNTESTABLE 6399 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){ 6400 static const struct { 6401 const char *zCtrlName; /* Name of a test-control option */ 6402 int ctrlCode; /* Integer code for that option */ 6403 } aCtrl[] = { 6404 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE }, 6405 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE }, 6406 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET }, 6407 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST }, 6408 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL }, 6409 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS }, 6410 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE }, 6411 { "assert", SQLITE_TESTCTRL_ASSERT }, 6412 { "always", SQLITE_TESTCTRL_ALWAYS }, 6413 { "reserve", SQLITE_TESTCTRL_RESERVE }, 6414 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, 6415 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, 6416 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, 6417 { "byteorder", SQLITE_TESTCTRL_BYTEORDER }, 6418 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT }, 6419 { "imposter", SQLITE_TESTCTRL_IMPOSTER }, 6420 }; 6421 int testctrl = -1; 6422 int rc2 = 0; 6423 int i, n2; 6424 open_db(p, 0); 6425 6426 /* convert testctrl text option to value. allow any unique prefix 6427 ** of the option name, or a numerical value. */ 6428 n2 = strlen30(azArg[1]); 6429 for(i=0; i<ArraySize(aCtrl); i++){ 6430 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){ 6431 if( testctrl<0 ){ 6432 testctrl = aCtrl[i].ctrlCode; 6433 }else{ 6434 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]); 6435 testctrl = -1; 6436 break; 6437 } 6438 } 6439 } 6440 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]); 6441 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){ 6442 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]); 6443 }else{ 6444 switch(testctrl){ 6445 6446 /* sqlite3_test_control(int, db, int) */ 6447 case SQLITE_TESTCTRL_OPTIMIZATIONS: 6448 case SQLITE_TESTCTRL_RESERVE: 6449 if( nArg==3 ){ 6450 int opt = (int)strtol(azArg[2], 0, 0); 6451 rc2 = sqlite3_test_control(testctrl, p->db, opt); 6452 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6453 } else { 6454 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n", 6455 azArg[1]); 6456 } 6457 break; 6458 6459 /* sqlite3_test_control(int) */ 6460 case SQLITE_TESTCTRL_PRNG_SAVE: 6461 case SQLITE_TESTCTRL_PRNG_RESTORE: 6462 case SQLITE_TESTCTRL_PRNG_RESET: 6463 case SQLITE_TESTCTRL_BYTEORDER: 6464 if( nArg==2 ){ 6465 rc2 = sqlite3_test_control(testctrl); 6466 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6467 } else { 6468 utf8_printf(stderr,"Error: testctrl %s takes no options\n", 6469 azArg[1]); 6470 } 6471 break; 6472 6473 /* sqlite3_test_control(int, uint) */ 6474 case SQLITE_TESTCTRL_PENDING_BYTE: 6475 if( nArg==3 ){ 6476 unsigned int opt = (unsigned int)integerValue(azArg[2]); 6477 rc2 = sqlite3_test_control(testctrl, opt); 6478 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6479 } else { 6480 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned" 6481 " int option\n", azArg[1]); 6482 } 6483 break; 6484 6485 /* sqlite3_test_control(int, int) */ 6486 case SQLITE_TESTCTRL_ASSERT: 6487 case SQLITE_TESTCTRL_ALWAYS: 6488 case SQLITE_TESTCTRL_NEVER_CORRUPT: 6489 if( nArg==3 ){ 6490 int opt = booleanValue(azArg[2]); 6491 rc2 = sqlite3_test_control(testctrl, opt); 6492 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6493 } else { 6494 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n", 6495 azArg[1]); 6496 } 6497 break; 6498 6499 /* sqlite3_test_control(int, char *) */ 6500 #ifdef SQLITE_N_KEYWORD 6501 case SQLITE_TESTCTRL_ISKEYWORD: 6502 if( nArg==3 ){ 6503 const char *opt = azArg[2]; 6504 rc2 = sqlite3_test_control(testctrl, opt); 6505 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6506 } else { 6507 utf8_printf(stderr, 6508 "Error: testctrl %s takes a single char * option\n", 6509 azArg[1]); 6510 } 6511 break; 6512 #endif 6513 6514 case SQLITE_TESTCTRL_IMPOSTER: 6515 if( nArg==5 ){ 6516 rc2 = sqlite3_test_control(testctrl, p->db, 6517 azArg[2], 6518 integerValue(azArg[3]), 6519 integerValue(azArg[4])); 6520 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2); 6521 }else{ 6522 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n"); 6523 } 6524 break; 6525 6526 case SQLITE_TESTCTRL_BITVEC_TEST: 6527 case SQLITE_TESTCTRL_FAULT_INSTALL: 6528 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: 6529 case SQLITE_TESTCTRL_SCRATCHMALLOC: 6530 default: 6531 utf8_printf(stderr, 6532 "Error: CLI support for testctrl %s not implemented\n", 6533 azArg[1]); 6534 break; 6535 } 6536 } 6537 }else 6538 #endif /* !defined(SQLITE_UNTESTABLE) */ 6539 6540 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 6541 open_db(p, 0); 6542 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 6543 }else 6544 6545 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 6546 if( nArg==2 ){ 6547 enableTimer = booleanValue(azArg[1]); 6548 if( enableTimer && !HAS_TIMER ){ 6549 raw_printf(stderr, "Error: timer not available on this system.\n"); 6550 enableTimer = 0; 6551 } 6552 }else{ 6553 raw_printf(stderr, "Usage: .timer on|off\n"); 6554 rc = 1; 6555 } 6556 }else 6557 6558 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 6559 open_db(p, 0); 6560 if( nArg!=2 ){ 6561 raw_printf(stderr, "Usage: .trace FILE|off\n"); 6562 rc = 1; 6563 goto meta_command_exit; 6564 } 6565 output_file_close(p->traceOut); 6566 p->traceOut = output_file_open(azArg[1]); 6567 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) 6568 if( p->traceOut==0 ){ 6569 sqlite3_trace_v2(p->db, 0, 0, 0); 6570 }else{ 6571 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut); 6572 } 6573 #endif 6574 }else 6575 6576 #if SQLITE_USER_AUTHENTICATION 6577 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 6578 if( nArg<2 ){ 6579 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 6580 rc = 1; 6581 goto meta_command_exit; 6582 } 6583 open_db(p, 0); 6584 if( strcmp(azArg[1],"login")==0 ){ 6585 if( nArg!=4 ){ 6586 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 6587 rc = 1; 6588 goto meta_command_exit; 6589 } 6590 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 6591 (int)strlen(azArg[3])); 6592 if( rc ){ 6593 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 6594 rc = 1; 6595 } 6596 }else if( strcmp(azArg[1],"add")==0 ){ 6597 if( nArg!=5 ){ 6598 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 6599 rc = 1; 6600 goto meta_command_exit; 6601 } 6602 rc = sqlite3_user_add(p->db, azArg[2], 6603 azArg[3], (int)strlen(azArg[3]), 6604 booleanValue(azArg[4])); 6605 if( rc ){ 6606 raw_printf(stderr, "User-Add failed: %d\n", rc); 6607 rc = 1; 6608 } 6609 }else if( strcmp(azArg[1],"edit")==0 ){ 6610 if( nArg!=5 ){ 6611 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 6612 rc = 1; 6613 goto meta_command_exit; 6614 } 6615 rc = sqlite3_user_change(p->db, azArg[2], 6616 azArg[3], (int)strlen(azArg[3]), 6617 booleanValue(azArg[4])); 6618 if( rc ){ 6619 raw_printf(stderr, "User-Edit failed: %d\n", rc); 6620 rc = 1; 6621 } 6622 }else if( strcmp(azArg[1],"delete")==0 ){ 6623 if( nArg!=3 ){ 6624 raw_printf(stderr, "Usage: .user delete USER\n"); 6625 rc = 1; 6626 goto meta_command_exit; 6627 } 6628 rc = sqlite3_user_delete(p->db, azArg[2]); 6629 if( rc ){ 6630 raw_printf(stderr, "User-Delete failed: %d\n", rc); 6631 rc = 1; 6632 } 6633 }else{ 6634 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 6635 rc = 1; 6636 goto meta_command_exit; 6637 } 6638 }else 6639 #endif /* SQLITE_USER_AUTHENTICATION */ 6640 6641 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 6642 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 6643 sqlite3_libversion(), sqlite3_sourceid()); 6644 }else 6645 6646 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 6647 const char *zDbName = nArg==2 ? azArg[1] : "main"; 6648 sqlite3_vfs *pVfs = 0; 6649 if( p->db ){ 6650 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 6651 if( pVfs ){ 6652 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 6653 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 6654 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 6655 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 6656 } 6657 } 6658 }else 6659 6660 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 6661 sqlite3_vfs *pVfs; 6662 sqlite3_vfs *pCurrent = 0; 6663 if( p->db ){ 6664 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 6665 } 6666 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 6667 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 6668 pVfs==pCurrent ? " <--- CURRENT" : ""); 6669 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 6670 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 6671 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 6672 if( pVfs->pNext ){ 6673 raw_printf(p->out, "-----------------------------------\n"); 6674 } 6675 } 6676 }else 6677 6678 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 6679 const char *zDbName = nArg==2 ? azArg[1] : "main"; 6680 char *zVfsName = 0; 6681 if( p->db ){ 6682 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 6683 if( zVfsName ){ 6684 utf8_printf(p->out, "%s\n", zVfsName); 6685 sqlite3_free(zVfsName); 6686 } 6687 } 6688 }else 6689 6690 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 6691 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 6692 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; 6693 }else 6694 #endif 6695 6696 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 6697 int j; 6698 assert( nArg<=ArraySize(azArg) ); 6699 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ 6700 p->colWidth[j-1] = (int)integerValue(azArg[j]); 6701 } 6702 }else 6703 6704 { 6705 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 6706 " \"%s\". Enter \".help\" for help\n", azArg[0]); 6707 rc = 1; 6708 } 6709 6710 meta_command_exit: 6711 if( p->outCount ){ 6712 p->outCount--; 6713 if( p->outCount==0 ) output_reset(p); 6714 } 6715 return rc; 6716 } 6717 6718 /* 6719 ** Return TRUE if a semicolon occurs anywhere in the first N characters 6720 ** of string z[]. 6721 */ 6722 static int line_contains_semicolon(const char *z, int N){ 6723 int i; 6724 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; } 6725 return 0; 6726 } 6727 6728 /* 6729 ** Test to see if a line consists entirely of whitespace. 6730 */ 6731 static int _all_whitespace(const char *z){ 6732 for(; *z; z++){ 6733 if( IsSpace(z[0]) ) continue; 6734 if( *z=='/' && z[1]=='*' ){ 6735 z += 2; 6736 while( *z && (*z!='*' || z[1]!='/') ){ z++; } 6737 if( *z==0 ) return 0; 6738 z++; 6739 continue; 6740 } 6741 if( *z=='-' && z[1]=='-' ){ 6742 z += 2; 6743 while( *z && *z!='\n' ){ z++; } 6744 if( *z==0 ) return 1; 6745 continue; 6746 } 6747 return 0; 6748 } 6749 return 1; 6750 } 6751 6752 /* 6753 ** Return TRUE if the line typed in is an SQL command terminator other 6754 ** than a semi-colon. The SQL Server style "go" command is understood 6755 ** as is the Oracle "/". 6756 */ 6757 static int line_is_command_terminator(const char *zLine){ 6758 while( IsSpace(zLine[0]) ){ zLine++; }; 6759 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){ 6760 return 1; /* Oracle */ 6761 } 6762 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' 6763 && _all_whitespace(&zLine[2]) ){ 6764 return 1; /* SQL Server */ 6765 } 6766 return 0; 6767 } 6768 6769 /* 6770 ** Return true if zSql is a complete SQL statement. Return false if it 6771 ** ends in the middle of a string literal or C-style comment. 6772 */ 6773 static int line_is_complete(char *zSql, int nSql){ 6774 int rc; 6775 if( zSql==0 ) return 1; 6776 zSql[nSql] = ';'; 6777 zSql[nSql+1] = 0; 6778 rc = sqlite3_complete(zSql); 6779 zSql[nSql] = 0; 6780 return rc; 6781 } 6782 6783 /* 6784 ** Run a single line of SQL 6785 */ 6786 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 6787 int rc; 6788 char *zErrMsg = 0; 6789 6790 open_db(p, 0); 6791 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 6792 BEGIN_TIMER; 6793 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); 6794 END_TIMER; 6795 if( rc || zErrMsg ){ 6796 char zPrefix[100]; 6797 if( in!=0 || !stdin_is_interactive ){ 6798 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 6799 "Error: near line %d:", startline); 6800 }else{ 6801 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 6802 } 6803 if( zErrMsg!=0 ){ 6804 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 6805 sqlite3_free(zErrMsg); 6806 zErrMsg = 0; 6807 }else{ 6808 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 6809 } 6810 return 1; 6811 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 6812 raw_printf(p->out, "changes: %3d total_changes: %d\n", 6813 sqlite3_changes(p->db), sqlite3_total_changes(p->db)); 6814 } 6815 return 0; 6816 } 6817 6818 6819 /* 6820 ** Read input from *in and process it. If *in==0 then input 6821 ** is interactive - the user is typing it it. Otherwise, input 6822 ** is coming from a file or device. A prompt is issued and history 6823 ** is saved only if input is interactive. An interrupt signal will 6824 ** cause this routine to exit immediately, unless input is interactive. 6825 ** 6826 ** Return the number of errors. 6827 */ 6828 static int process_input(ShellState *p, FILE *in){ 6829 char *zLine = 0; /* A single input line */ 6830 char *zSql = 0; /* Accumulated SQL text */ 6831 int nLine; /* Length of current line */ 6832 int nSql = 0; /* Bytes of zSql[] used */ 6833 int nAlloc = 0; /* Allocated zSql[] space */ 6834 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ 6835 int rc; /* Error code */ 6836 int errCnt = 0; /* Number of errors seen */ 6837 int lineno = 0; /* Current line number */ 6838 int startline = 0; /* Line number for start of current input */ 6839 6840 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){ 6841 fflush(p->out); 6842 zLine = one_input_line(in, zLine, nSql>0); 6843 if( zLine==0 ){ 6844 /* End of input */ 6845 if( in==0 && stdin_is_interactive ) printf("\n"); 6846 break; 6847 } 6848 if( seenInterrupt ){ 6849 if( in!=0 ) break; 6850 seenInterrupt = 0; 6851 } 6852 lineno++; 6853 if( nSql==0 && _all_whitespace(zLine) ){ 6854 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 6855 continue; 6856 } 6857 if( zLine && zLine[0]=='.' && nSql==0 ){ 6858 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 6859 rc = do_meta_command(zLine, p); 6860 if( rc==2 ){ /* exit requested */ 6861 break; 6862 }else if( rc ){ 6863 errCnt++; 6864 } 6865 continue; 6866 } 6867 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ 6868 memcpy(zLine,";",2); 6869 } 6870 nLine = strlen30(zLine); 6871 if( nSql+nLine+2>=nAlloc ){ 6872 nAlloc = nSql+nLine+100; 6873 zSql = realloc(zSql, nAlloc); 6874 if( zSql==0 ){ 6875 raw_printf(stderr, "Error: out of memory\n"); 6876 exit(1); 6877 } 6878 } 6879 nSqlPrior = nSql; 6880 if( nSql==0 ){ 6881 int i; 6882 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 6883 assert( nAlloc>0 && zSql!=0 ); 6884 memcpy(zSql, zLine+i, nLine+1-i); 6885 startline = lineno; 6886 nSql = nLine-i; 6887 }else{ 6888 zSql[nSql++] = '\n'; 6889 memcpy(zSql+nSql, zLine, nLine+1); 6890 nSql += nLine; 6891 } 6892 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 6893 && sqlite3_complete(zSql) ){ 6894 errCnt += runOneSqlLine(p, zSql, in, startline); 6895 nSql = 0; 6896 if( p->outCount ){ 6897 output_reset(p); 6898 p->outCount = 0; 6899 } 6900 }else if( nSql && _all_whitespace(zSql) ){ 6901 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 6902 nSql = 0; 6903 } 6904 } 6905 if( nSql && !_all_whitespace(zSql) ){ 6906 runOneSqlLine(p, zSql, in, startline); 6907 } 6908 free(zSql); 6909 free(zLine); 6910 return errCnt>0; 6911 } 6912 6913 /* 6914 ** Return a pathname which is the user's home directory. A 6915 ** 0 return indicates an error of some kind. 6916 */ 6917 static char *find_home_dir(int clearFlag){ 6918 static char *home_dir = NULL; 6919 if( clearFlag ){ 6920 free(home_dir); 6921 home_dir = 0; 6922 return 0; 6923 } 6924 if( home_dir ) return home_dir; 6925 6926 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 6927 && !defined(__RTP__) && !defined(_WRS_KERNEL) 6928 { 6929 struct passwd *pwent; 6930 uid_t uid = getuid(); 6931 if( (pwent=getpwuid(uid)) != NULL) { 6932 home_dir = pwent->pw_dir; 6933 } 6934 } 6935 #endif 6936 6937 #if defined(_WIN32_WCE) 6938 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 6939 */ 6940 home_dir = "/"; 6941 #else 6942 6943 #if defined(_WIN32) || defined(WIN32) 6944 if (!home_dir) { 6945 home_dir = getenv("USERPROFILE"); 6946 } 6947 #endif 6948 6949 if (!home_dir) { 6950 home_dir = getenv("HOME"); 6951 } 6952 6953 #if defined(_WIN32) || defined(WIN32) 6954 if (!home_dir) { 6955 char *zDrive, *zPath; 6956 int n; 6957 zDrive = getenv("HOMEDRIVE"); 6958 zPath = getenv("HOMEPATH"); 6959 if( zDrive && zPath ){ 6960 n = strlen30(zDrive) + strlen30(zPath) + 1; 6961 home_dir = malloc( n ); 6962 if( home_dir==0 ) return 0; 6963 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 6964 return home_dir; 6965 } 6966 home_dir = "c:\\"; 6967 } 6968 #endif 6969 6970 #endif /* !_WIN32_WCE */ 6971 6972 if( home_dir ){ 6973 int n = strlen30(home_dir) + 1; 6974 char *z = malloc( n ); 6975 if( z ) memcpy(z, home_dir, n); 6976 home_dir = z; 6977 } 6978 6979 return home_dir; 6980 } 6981 6982 /* 6983 ** Read input from the file given by sqliterc_override. Or if that 6984 ** parameter is NULL, take input from ~/.sqliterc 6985 ** 6986 ** Returns the number of errors. 6987 */ 6988 static void process_sqliterc( 6989 ShellState *p, /* Configuration data */ 6990 const char *sqliterc_override /* Name of config file. NULL to use default */ 6991 ){ 6992 char *home_dir = NULL; 6993 const char *sqliterc = sqliterc_override; 6994 char *zBuf = 0; 6995 FILE *in = NULL; 6996 6997 if (sqliterc == NULL) { 6998 home_dir = find_home_dir(0); 6999 if( home_dir==0 ){ 7000 raw_printf(stderr, "-- warning: cannot find home directory;" 7001 " cannot read ~/.sqliterc\n"); 7002 return; 7003 } 7004 sqlite3_initialize(); 7005 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 7006 sqliterc = zBuf; 7007 } 7008 in = fopen(sqliterc,"rb"); 7009 if( in ){ 7010 if( stdin_is_interactive ){ 7011 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 7012 } 7013 process_input(p,in); 7014 fclose(in); 7015 } 7016 sqlite3_free(zBuf); 7017 } 7018 7019 /* 7020 ** Show available command line options 7021 */ 7022 static const char zOptions[] = 7023 " -ascii set output mode to 'ascii'\n" 7024 " -bail stop after hitting an error\n" 7025 " -batch force batch I/O\n" 7026 " -column set output mode to 'column'\n" 7027 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 7028 " -csv set output mode to 'csv'\n" 7029 " -echo print commands before execution\n" 7030 " -init FILENAME read/process named file\n" 7031 " -[no]header turn headers on or off\n" 7032 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 7033 " -heap SIZE Size of heap for memsys3 or memsys5\n" 7034 #endif 7035 " -help show this message\n" 7036 " -html set output mode to HTML\n" 7037 " -interactive force interactive I/O\n" 7038 " -line set output mode to 'line'\n" 7039 " -list set output mode to 'list'\n" 7040 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 7041 " -mmap N default mmap size set to N\n" 7042 #ifdef SQLITE_ENABLE_MULTIPLEX 7043 " -multiplex enable the multiplexor VFS\n" 7044 #endif 7045 " -newline SEP set output row separator. Default: '\\n'\n" 7046 " -nullvalue TEXT set text string for NULL values. Default ''\n" 7047 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 7048 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n" 7049 " -separator SEP set output column separator. Default: '|'\n" 7050 " -stats print memory stats before each finalize\n" 7051 " -version show SQLite version\n" 7052 " -vfs NAME use NAME as the default VFS\n" 7053 #ifdef SQLITE_ENABLE_VFSTRACE 7054 " -vfstrace enable tracing of all VFS calls\n" 7055 #endif 7056 ; 7057 static void usage(int showDetail){ 7058 utf8_printf(stderr, 7059 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 7060 "FILENAME is the name of an SQLite database. A new database is created\n" 7061 "if the file does not previously exist.\n", Argv0); 7062 if( showDetail ){ 7063 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 7064 }else{ 7065 raw_printf(stderr, "Use the -help option for additional information\n"); 7066 } 7067 exit(1); 7068 } 7069 7070 /* 7071 ** Initialize the state information in data 7072 */ 7073 static void main_init(ShellState *data) { 7074 memset(data, 0, sizeof(*data)); 7075 data->normalMode = data->cMode = data->mode = MODE_List; 7076 data->autoExplain = 1; 7077 memcpy(data->colSeparator,SEP_Column, 2); 7078 memcpy(data->rowSeparator,SEP_Row, 2); 7079 data->showHeader = 0; 7080 data->shellFlgs = SHFLG_Lookaside; 7081 sqlite3_config(SQLITE_CONFIG_URI, 1); 7082 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 7083 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 7084 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 7085 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 7086 } 7087 7088 /* 7089 ** Output text to the console in a font that attracts extra attention. 7090 */ 7091 #ifdef _WIN32 7092 static void printBold(const char *zText){ 7093 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 7094 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 7095 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 7096 SetConsoleTextAttribute(out, 7097 FOREGROUND_RED|FOREGROUND_INTENSITY 7098 ); 7099 printf("%s", zText); 7100 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 7101 } 7102 #else 7103 static void printBold(const char *zText){ 7104 printf("\033[1m%s\033[0m", zText); 7105 } 7106 #endif 7107 7108 /* 7109 ** Get the argument to an --option. Throw an error and die if no argument 7110 ** is available. 7111 */ 7112 static char *cmdline_option_value(int argc, char **argv, int i){ 7113 if( i==argc ){ 7114 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 7115 argv[0], argv[argc-1]); 7116 exit(1); 7117 } 7118 return argv[i]; 7119 } 7120 7121 #ifndef SQLITE_SHELL_IS_UTF8 7122 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) 7123 # define SQLITE_SHELL_IS_UTF8 (0) 7124 # else 7125 # define SQLITE_SHELL_IS_UTF8 (1) 7126 # endif 7127 #endif 7128 7129 #if SQLITE_SHELL_IS_UTF8 7130 int SQLITE_CDECL main(int argc, char **argv){ 7131 #else 7132 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 7133 char **argv; 7134 #endif 7135 char *zErrMsg = 0; 7136 ShellState data; 7137 const char *zInitFile = 0; 7138 int i; 7139 int rc = 0; 7140 int warnInmemoryDb = 0; 7141 int readStdin = 1; 7142 int nCmd = 0; 7143 char **azCmd = 0; 7144 7145 setBinaryMode(stdin, 0); 7146 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 7147 stdin_is_interactive = isatty(0); 7148 stdout_is_console = isatty(1); 7149 7150 #if USE_SYSTEM_SQLITE+0!=1 7151 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ 7152 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 7153 sqlite3_sourceid(), SQLITE_SOURCE_ID); 7154 exit(1); 7155 } 7156 #endif 7157 main_init(&data); 7158 #if !SQLITE_SHELL_IS_UTF8 7159 sqlite3_initialize(); 7160 argv = sqlite3_malloc64(sizeof(argv[0])*argc); 7161 if( argv==0 ){ 7162 raw_printf(stderr, "out of memory\n"); 7163 exit(1); 7164 } 7165 for(i=0; i<argc; i++){ 7166 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]); 7167 if( argv[i]==0 ){ 7168 raw_printf(stderr, "out of memory\n"); 7169 exit(1); 7170 } 7171 } 7172 #endif 7173 assert( argc>=1 && argv && argv[0] ); 7174 Argv0 = argv[0]; 7175 7176 /* Make sure we have a valid signal handler early, before anything 7177 ** else is done. 7178 */ 7179 #ifdef SIGINT 7180 signal(SIGINT, interrupt_handler); 7181 #endif 7182 7183 #ifdef SQLITE_SHELL_DBNAME_PROC 7184 { 7185 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 7186 ** of a C-function that will provide the name of the database file. Use 7187 ** this compile-time option to embed this shell program in larger 7188 ** applications. */ 7189 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 7190 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); 7191 warnInmemoryDb = 0; 7192 } 7193 #endif 7194 7195 /* Do an initial pass through the command-line argument to locate 7196 ** the name of the database file, the name of the initialization file, 7197 ** the size of the alternative malloc heap, 7198 ** and the first command to execute. 7199 */ 7200 for(i=1; i<argc; i++){ 7201 char *z; 7202 z = argv[i]; 7203 if( z[0]!='-' ){ 7204 if( data.zDbFilename==0 ){ 7205 data.zDbFilename = z; 7206 }else{ 7207 /* Excesss arguments are interpreted as SQL (or dot-commands) and 7208 ** mean that nothing is read from stdin */ 7209 readStdin = 0; 7210 nCmd++; 7211 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 7212 if( azCmd==0 ){ 7213 raw_printf(stderr, "out of memory\n"); 7214 exit(1); 7215 } 7216 azCmd[nCmd-1] = z; 7217 } 7218 } 7219 if( z[1]=='-' ) z++; 7220 if( strcmp(z,"-separator")==0 7221 || strcmp(z,"-nullvalue")==0 7222 || strcmp(z,"-newline")==0 7223 || strcmp(z,"-cmd")==0 7224 ){ 7225 (void)cmdline_option_value(argc, argv, ++i); 7226 }else if( strcmp(z,"-init")==0 ){ 7227 zInitFile = cmdline_option_value(argc, argv, ++i); 7228 }else if( strcmp(z,"-batch")==0 ){ 7229 /* Need to check for batch mode here to so we can avoid printing 7230 ** informational messages (like from process_sqliterc) before 7231 ** we do the actual processing of arguments later in a second pass. 7232 */ 7233 stdin_is_interactive = 0; 7234 }else if( strcmp(z,"-heap")==0 ){ 7235 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 7236 const char *zSize; 7237 sqlite3_int64 szHeap; 7238 7239 zSize = cmdline_option_value(argc, argv, ++i); 7240 szHeap = integerValue(zSize); 7241 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 7242 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 7243 #else 7244 (void)cmdline_option_value(argc, argv, ++i); 7245 #endif 7246 }else if( strcmp(z,"-scratch")==0 ){ 7247 int n, sz; 7248 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7249 if( sz>400000 ) sz = 400000; 7250 if( sz<2500 ) sz = 2500; 7251 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7252 if( n>10 ) n = 10; 7253 if( n<1 ) n = 1; 7254 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n); 7255 data.shellFlgs |= SHFLG_Scratch; 7256 }else if( strcmp(z,"-pagecache")==0 ){ 7257 int n, sz; 7258 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7259 if( sz>70000 ) sz = 70000; 7260 if( sz<0 ) sz = 0; 7261 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7262 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 7263 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 7264 data.shellFlgs |= SHFLG_Pagecache; 7265 }else if( strcmp(z,"-lookaside")==0 ){ 7266 int n, sz; 7267 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7268 if( sz<0 ) sz = 0; 7269 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 7270 if( n<0 ) n = 0; 7271 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 7272 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 7273 #ifdef SQLITE_ENABLE_VFSTRACE 7274 }else if( strcmp(z,"-vfstrace")==0 ){ 7275 extern int vfstrace_register( 7276 const char *zTraceName, 7277 const char *zOldVfsName, 7278 int (*xOut)(const char*,void*), 7279 void *pOutArg, 7280 int makeDefault 7281 ); 7282 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 7283 #endif 7284 #ifdef SQLITE_ENABLE_MULTIPLEX 7285 }else if( strcmp(z,"-multiplex")==0 ){ 7286 extern int sqlite3_multiple_initialize(const char*,int); 7287 sqlite3_multiplex_initialize(0, 1); 7288 #endif 7289 }else if( strcmp(z,"-mmap")==0 ){ 7290 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 7291 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 7292 }else if( strcmp(z,"-vfs")==0 ){ 7293 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i)); 7294 if( pVfs ){ 7295 sqlite3_vfs_register(pVfs, 1); 7296 }else{ 7297 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 7298 exit(1); 7299 } 7300 } 7301 } 7302 if( data.zDbFilename==0 ){ 7303 #ifndef SQLITE_OMIT_MEMORYDB 7304 data.zDbFilename = ":memory:"; 7305 warnInmemoryDb = argc==1; 7306 #else 7307 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 7308 return 1; 7309 #endif 7310 } 7311 data.out = stdout; 7312 7313 /* Go ahead and open the database file if it already exists. If the 7314 ** file does not exist, delay opening it. This prevents empty database 7315 ** files from being created if a user mistypes the database name argument 7316 ** to the sqlite command-line tool. 7317 */ 7318 if( access(data.zDbFilename, 0)==0 ){ 7319 open_db(&data, 0); 7320 } 7321 7322 /* Process the initialization file if there is one. If no -init option 7323 ** is given on the command line, look for a file named ~/.sqliterc and 7324 ** try to process it. 7325 */ 7326 process_sqliterc(&data,zInitFile); 7327 7328 /* Make a second pass through the command-line argument and set 7329 ** options. This second pass is delayed until after the initialization 7330 ** file is processed so that the command-line arguments will override 7331 ** settings in the initialization file. 7332 */ 7333 for(i=1; i<argc; i++){ 7334 char *z = argv[i]; 7335 if( z[0]!='-' ) continue; 7336 if( z[1]=='-' ){ z++; } 7337 if( strcmp(z,"-init")==0 ){ 7338 i++; 7339 }else if( strcmp(z,"-html")==0 ){ 7340 data.mode = MODE_Html; 7341 }else if( strcmp(z,"-list")==0 ){ 7342 data.mode = MODE_List; 7343 }else if( strcmp(z,"-line")==0 ){ 7344 data.mode = MODE_Line; 7345 }else if( strcmp(z,"-column")==0 ){ 7346 data.mode = MODE_Column; 7347 }else if( strcmp(z,"-csv")==0 ){ 7348 data.mode = MODE_Csv; 7349 memcpy(data.colSeparator,",",2); 7350 }else if( strcmp(z,"-ascii")==0 ){ 7351 data.mode = MODE_Ascii; 7352 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 7353 SEP_Unit); 7354 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 7355 SEP_Record); 7356 }else if( strcmp(z,"-separator")==0 ){ 7357 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 7358 "%s",cmdline_option_value(argc,argv,++i)); 7359 }else if( strcmp(z,"-newline")==0 ){ 7360 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 7361 "%s",cmdline_option_value(argc,argv,++i)); 7362 }else if( strcmp(z,"-nullvalue")==0 ){ 7363 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 7364 "%s",cmdline_option_value(argc,argv,++i)); 7365 }else if( strcmp(z,"-header")==0 ){ 7366 data.showHeader = 1; 7367 }else if( strcmp(z,"-noheader")==0 ){ 7368 data.showHeader = 0; 7369 }else if( strcmp(z,"-echo")==0 ){ 7370 ShellSetFlag(&data, SHFLG_Echo); 7371 }else if( strcmp(z,"-eqp")==0 ){ 7372 data.autoEQP = 1; 7373 }else if( strcmp(z,"-eqpfull")==0 ){ 7374 data.autoEQP = 2; 7375 }else if( strcmp(z,"-stats")==0 ){ 7376 data.statsOn = 1; 7377 }else if( strcmp(z,"-scanstats")==0 ){ 7378 data.scanstatsOn = 1; 7379 }else if( strcmp(z,"-backslash")==0 ){ 7380 /* Undocumented command-line option: -backslash 7381 ** Causes C-style backslash escapes to be evaluated in SQL statements 7382 ** prior to sending the SQL into SQLite. Useful for injecting 7383 ** crazy bytes in the middle of SQL statements for testing and debugging. 7384 */ 7385 ShellSetFlag(&data, SHFLG_Backslash); 7386 }else if( strcmp(z,"-bail")==0 ){ 7387 bail_on_error = 1; 7388 }else if( strcmp(z,"-version")==0 ){ 7389 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 7390 return 0; 7391 }else if( strcmp(z,"-interactive")==0 ){ 7392 stdin_is_interactive = 1; 7393 }else if( strcmp(z,"-batch")==0 ){ 7394 stdin_is_interactive = 0; 7395 }else if( strcmp(z,"-heap")==0 ){ 7396 i++; 7397 }else if( strcmp(z,"-scratch")==0 ){ 7398 i+=2; 7399 }else if( strcmp(z,"-pagecache")==0 ){ 7400 i+=2; 7401 }else if( strcmp(z,"-lookaside")==0 ){ 7402 i+=2; 7403 }else if( strcmp(z,"-mmap")==0 ){ 7404 i++; 7405 }else if( strcmp(z,"-vfs")==0 ){ 7406 i++; 7407 #ifdef SQLITE_ENABLE_VFSTRACE 7408 }else if( strcmp(z,"-vfstrace")==0 ){ 7409 i++; 7410 #endif 7411 #ifdef SQLITE_ENABLE_MULTIPLEX 7412 }else if( strcmp(z,"-multiplex")==0 ){ 7413 i++; 7414 #endif 7415 }else if( strcmp(z,"-help")==0 ){ 7416 usage(1); 7417 }else if( strcmp(z,"-cmd")==0 ){ 7418 /* Run commands that follow -cmd first and separately from commands 7419 ** that simply appear on the command-line. This seems goofy. It would 7420 ** be better if all commands ran in the order that they appear. But 7421 ** we retain the goofy behavior for historical compatibility. */ 7422 if( i==argc-1 ) break; 7423 z = cmdline_option_value(argc,argv,++i); 7424 if( z[0]=='.' ){ 7425 rc = do_meta_command(z, &data); 7426 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 7427 }else{ 7428 open_db(&data, 0); 7429 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg); 7430 if( zErrMsg!=0 ){ 7431 utf8_printf(stderr,"Error: %s\n", zErrMsg); 7432 if( bail_on_error ) return rc!=0 ? rc : 1; 7433 }else if( rc!=0 ){ 7434 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 7435 if( bail_on_error ) return rc; 7436 } 7437 } 7438 }else{ 7439 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 7440 raw_printf(stderr,"Use -help for a list of options.\n"); 7441 return 1; 7442 } 7443 data.cMode = data.mode; 7444 } 7445 7446 if( !readStdin ){ 7447 /* Run all arguments that do not begin with '-' as if they were separate 7448 ** command-line inputs, except for the argToSkip argument which contains 7449 ** the database filename. 7450 */ 7451 for(i=0; i<nCmd; i++){ 7452 if( azCmd[i][0]=='.' ){ 7453 rc = do_meta_command(azCmd[i], &data); 7454 if( rc ) return rc==2 ? 0 : rc; 7455 }else{ 7456 open_db(&data, 0); 7457 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg); 7458 if( zErrMsg!=0 ){ 7459 utf8_printf(stderr,"Error: %s\n", zErrMsg); 7460 return rc!=0 ? rc : 1; 7461 }else if( rc!=0 ){ 7462 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 7463 return rc; 7464 } 7465 } 7466 } 7467 free(azCmd); 7468 }else{ 7469 /* Run commands received from standard input 7470 */ 7471 if( stdin_is_interactive ){ 7472 char *zHome; 7473 char *zHistory = 0; 7474 int nHistory; 7475 printf( 7476 "SQLite version %s %.19s\n" /*extra-version-info*/ 7477 "Enter \".help\" for usage hints.\n", 7478 sqlite3_libversion(), sqlite3_sourceid() 7479 ); 7480 if( warnInmemoryDb ){ 7481 printf("Connected to a "); 7482 printBold("transient in-memory database"); 7483 printf(".\nUse \".open FILENAME\" to reopen on a " 7484 "persistent database.\n"); 7485 } 7486 zHome = find_home_dir(0); 7487 if( zHome ){ 7488 nHistory = strlen30(zHome) + 20; 7489 if( (zHistory = malloc(nHistory))!=0 ){ 7490 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 7491 } 7492 } 7493 if( zHistory ){ shell_read_history(zHistory); } 7494 rc = process_input(&data, 0); 7495 if( zHistory ){ 7496 shell_stifle_history(100); 7497 shell_write_history(zHistory); 7498 free(zHistory); 7499 } 7500 }else{ 7501 rc = process_input(&data, stdin); 7502 } 7503 } 7504 set_table_name(&data, 0); 7505 if( data.db ){ 7506 session_close_all(&data); 7507 sqlite3_close(data.db); 7508 } 7509 sqlite3_free(data.zFreeOnClose); 7510 find_home_dir(1); 7511 #if !SQLITE_SHELL_IS_UTF8 7512 for(i=0; i<argc; i++) sqlite3_free(argv[i]); 7513 sqlite3_free(argv); 7514 #endif 7515 return rc; 7516 } 7517