| Index: third_party/sqlite/src/src/test2.c | 
| diff --git a/third_party/sqlite/src/src/test2.c b/third_party/sqlite/src/src/test2.c | 
| index fa7dd76ce4a3620bc7f414633f03960174899128..58f271ff27ad8fef64522f416fd53367db663072 100644 | 
| --- a/third_party/sqlite/src/src/test2.c | 
| +++ b/third_party/sqlite/src/src/test2.c | 
| @@ -19,35 +19,7 @@ | 
| #include <string.h> | 
| #include <ctype.h> | 
|  | 
| -/* | 
| -** Interpret an SQLite error number | 
| -*/ | 
| -static char *errorName(int rc){ | 
| -  char *zName; | 
| -  switch( rc ){ | 
| -    case SQLITE_OK:         zName = "SQLITE_OK";          break; | 
| -    case SQLITE_ERROR:      zName = "SQLITE_ERROR";       break; | 
| -    case SQLITE_PERM:       zName = "SQLITE_PERM";        break; | 
| -    case SQLITE_ABORT:      zName = "SQLITE_ABORT";       break; | 
| -    case SQLITE_BUSY:       zName = "SQLITE_BUSY";        break; | 
| -    case SQLITE_NOMEM:      zName = "SQLITE_NOMEM";       break; | 
| -    case SQLITE_READONLY:   zName = "SQLITE_READONLY";    break; | 
| -    case SQLITE_INTERRUPT:  zName = "SQLITE_INTERRUPT";   break; | 
| -    case SQLITE_IOERR:      zName = "SQLITE_IOERR";       break; | 
| -    case SQLITE_CORRUPT:    zName = "SQLITE_CORRUPT";     break; | 
| -    case SQLITE_FULL:       zName = "SQLITE_FULL";        break; | 
| -    case SQLITE_CANTOPEN:   zName = "SQLITE_CANTOPEN";    break; | 
| -    case SQLITE_PROTOCOL:   zName = "SQLITE_PROTOCOL";    break; | 
| -    case SQLITE_EMPTY:      zName = "SQLITE_EMPTY";       break; | 
| -    case SQLITE_SCHEMA:     zName = "SQLITE_SCHEMA";      break; | 
| -    case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT";  break; | 
| -    case SQLITE_MISMATCH:   zName = "SQLITE_MISMATCH";    break; | 
| -    case SQLITE_MISUSE:     zName = "SQLITE_MISUSE";      break; | 
| -    case SQLITE_NOLFS:      zName = "SQLITE_NOLFS";       break; | 
| -    default:                zName = "SQLITE_Unknown";     break; | 
| -  } | 
| -  return zName; | 
| -} | 
| +extern const char *sqlite3ErrName(int); | 
|  | 
| /* | 
| ** Page size and reserved size used for testing. | 
| @@ -87,7 +59,7 @@ static int pager_open( | 
| SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB, | 
| pager_test_reiniter); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| sqlite3PagerSetCachesize(pPager, nPage); | 
| @@ -119,7 +91,7 @@ static int pager_close( | 
| pPager = sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerClose(pPager); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -146,7 +118,7 @@ static int pager_rollback( | 
| pPager = sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerRollback(pPager); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -173,12 +145,12 @@ static int pager_commit( | 
| pPager = sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerCommitPhaseOne(pPager, 0, 0); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| rc = sqlite3PagerCommitPhaseTwo(pPager); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -205,7 +177,7 @@ static int pager_stmt_begin( | 
| pPager = sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerOpenSavepoint(pPager, 1); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -233,7 +205,7 @@ static int pager_stmt_rollback( | 
| rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, 0); | 
| sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -260,7 +232,7 @@ static int pager_stmt_commit( | 
| pPager = sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_RELEASE, 0); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -353,7 +325,7 @@ static int page_get( | 
| rc = sqlite3PagerGet(pPager, pgno, &pPage); | 
| } | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| sqlite3_snprintf(sizeof(zBuf),zBuf,"%p",pPage); | 
| @@ -507,7 +479,7 @@ static int page_write( | 
| pPage = (DbPage *)sqlite3TestTextToPtr(argv[1]); | 
| rc = sqlite3PagerWrite(pPage); | 
| if( rc!=SQLITE_OK ){ | 
| -    Tcl_AppendResult(interp, errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| pData = sqlite3PagerGetData(pPage); | 
| @@ -537,6 +509,8 @@ static int fake_big_file( | 
| int rc; | 
| int n; | 
| i64 offset; | 
| +  char *zFile; | 
| +  int nFile; | 
| if( argc!=3 ){ | 
| Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 
| " N-MEGABYTES FILE\"", 0); | 
| @@ -545,19 +519,26 @@ static int fake_big_file( | 
| if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR; | 
|  | 
| pVfs = sqlite3_vfs_find(0); | 
| -  rc = sqlite3OsOpenMalloc(pVfs, argv[2], &fd, | 
| +  nFile = (int)strlen(argv[2]); | 
| +  zFile = sqlite3_malloc( nFile+2 ); | 
| +  if( zFile==0 ) return TCL_ERROR; | 
| +  memcpy(zFile, argv[2], nFile+1); | 
| +  zFile[nFile+1] = 0; | 
| +  rc = sqlite3OsOpenMalloc(pVfs, zFile, &fd, | 
| (SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB), 0 | 
| ); | 
| if( rc ){ | 
| -    Tcl_AppendResult(interp, "open failed: ", errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, "open failed: ", sqlite3ErrName(rc), 0); | 
| +    sqlite3_free(zFile); | 
| return TCL_ERROR; | 
| } | 
| offset = n; | 
| offset *= 1024*1024; | 
| rc = sqlite3OsWrite(fd, "Hello, World!", 14, offset); | 
| sqlite3OsCloseFree(fd); | 
| +  sqlite3_free(zFile); | 
| if( rc ){ | 
| -    Tcl_AppendResult(interp, "write failed: ", errorName(rc), 0); | 
| +    Tcl_AppendResult(interp, "write failed: ", sqlite3ErrName(rc), 0); | 
| return TCL_ERROR; | 
| } | 
| return TCL_OK; | 
| @@ -587,7 +568,90 @@ static int testPendingByte( | 
| rc = sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, pbyte); | 
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | 
| return TCL_OK; | 
| -} | 
| +} | 
| + | 
| +/* | 
| +** The sqlite3FaultSim() callback: | 
| +*/ | 
| +static Tcl_Interp *faultSimInterp = 0; | 
| +static int faultSimScriptSize = 0; | 
| +static char *faultSimScript; | 
| +static int faultSimCallback(int x){ | 
| +  char zInt[30]; | 
| +  int i; | 
| +  int isNeg; | 
| +  int rc; | 
| +  if( x==0 ){ | 
| +    memcpy(faultSimScript+faultSimScriptSize, "0", 2); | 
| +  }else{ | 
| +    /* Convert x to text without using any sqlite3 routines */ | 
| +    if( x<0 ){ | 
| +      isNeg = 1; | 
| +      x = -x; | 
| +    }else{ | 
| +      isNeg = 0; | 
| +    } | 
| +    zInt[sizeof(zInt)-1] = 0; | 
| +    for(i=sizeof(zInt)-2; i>0 && x>0; i--, x /= 10){ | 
| +      zInt[i] = (x%10) + '0'; | 
| +    } | 
| +    if( isNeg ) zInt[i--] = '-'; | 
| +    memcpy(faultSimScript+faultSimScriptSize, zInt+i+1, sizeof(zInt)-i); | 
| +  } | 
| +  rc = Tcl_Eval(faultSimInterp, faultSimScript); | 
| +  if( rc ){ | 
| +    fprintf(stderr, "fault simulator script failed: [%s]", faultSimScript); | 
| +    rc = SQLITE_ERROR; | 
| +  }else{ | 
| +    rc = atoi(Tcl_GetStringResult(faultSimInterp)); | 
| +  } | 
| +  Tcl_ResetResult(faultSimInterp); | 
| +  return rc; | 
| +} | 
| + | 
| +/* | 
| +** sqlite3_test_control_fault_install SCRIPT | 
| +** | 
| +** Arrange to invoke SCRIPT with the integer argument to sqlite3FaultSim() | 
| +** appended, whenever sqlite3FaultSim() is called.  Or, if SCRIPT is the | 
| +** empty string, cancel the sqlite3FaultSim() callback. | 
| +*/ | 
| +static int faultInstallCmd( | 
| +  void *NotUsed, | 
| +  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */ | 
| +  int argc,              /* Number of arguments */ | 
| +  const char **argv      /* Text of each argument */ | 
| +){ | 
| +  const char *zScript; | 
| +  int nScript; | 
| +  int rc; | 
| +  if( argc!=1 && argc!=2 ){ | 
| +    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], | 
| +                     " SCRIPT\"", (void*)0); | 
| +  } | 
| +  zScript = argc==2 ? argv[1] : ""; | 
| +  nScript = (int)strlen(zScript); | 
| +  if( faultSimScript ){ | 
| +    free(faultSimScript); | 
| +    faultSimScript = 0; | 
| +  } | 
| +  if( nScript==0 ){ | 
| +    rc = sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL, 0); | 
| +  }else{ | 
| +    faultSimScript = malloc( nScript+100 ); | 
| +    if( faultSimScript==0 ){ | 
| +      Tcl_AppendResult(interp, "out of memory", (void*)0); | 
| +      return SQLITE_ERROR; | 
| +    } | 
| +    memcpy(faultSimScript, zScript, nScript); | 
| +    faultSimScript[nScript] = ' '; | 
| +    faultSimScriptSize = nScript+1; | 
| +    faultSimInterp = interp; | 
| +    rc = sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL, faultSimCallback); | 
| +  } | 
| +  Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | 
| +  return SQLITE_OK; | 
| +} | 
|  | 
| /* | 
| ** sqlite3BitvecBuiltinTest SIZE PROGRAM | 
| @@ -657,7 +721,8 @@ int Sqlitetest2_Init(Tcl_Interp *interp){ | 
| { "fake_big_file",           (Tcl_CmdProc*)fake_big_file       }, | 
| #endif | 
| { "sqlite3BitvecBuiltinTest",(Tcl_CmdProc*)testBitvecBuiltinTest     }, | 
| -    { "sqlite3_test_control_pending_byte", (Tcl_CmdProc*)testPendingByte }, | 
| +    { "sqlite3_test_control_pending_byte",  (Tcl_CmdProc*)testPendingByte }, | 
| +    { "sqlite3_test_control_fault_install", (Tcl_CmdProc*)faultInstallCmd }, | 
| }; | 
| int i; | 
| for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ | 
|  |