| Index: third_party/sqlite/src/src/attach.c
 | 
| diff --git a/third_party/sqlite/src/src/attach.c b/third_party/sqlite/src/src/attach.c
 | 
| index 2ab55e6ed62ab4acb3bae0de5177e3bc79c703ec..393c46ccb68368cc40abb373f6b981079f79319c 100644
 | 
| --- a/third_party/sqlite/src/src/attach.c
 | 
| +++ b/third_party/sqlite/src/src/attach.c
 | 
| @@ -97,7 +97,7 @@ static void attachFunc(
 | 
|      goto attach_error;
 | 
|    }
 | 
|    for(i=0; i<db->nDb; i++){
 | 
| -    char *z = db->aDb[i].zName;
 | 
| +    char *z = db->aDb[i].zDbSName;
 | 
|      assert( z && zName );
 | 
|      if( sqlite3StrICmp(z, zName)==0 ){
 | 
|        zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
 | 
| @@ -109,7 +109,7 @@ static void attachFunc(
 | 
|    ** hash tables.
 | 
|    */
 | 
|    if( db->aDb==db->aDbStatic ){
 | 
| -    aNew = sqlite3DbMallocRaw(db, sizeof(db->aDb[0])*3 );
 | 
| +    aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );
 | 
|      if( aNew==0 ) return;
 | 
|      memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
 | 
|    }else{
 | 
| @@ -127,7 +127,7 @@ static void attachFunc(
 | 
|    flags = db->openFlags;
 | 
|    rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
 | 
|    if( rc!=SQLITE_OK ){
 | 
| -    if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
 | 
| +    if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
 | 
|      sqlite3_result_error(context, zErr, -1);
 | 
|      sqlite3_free(zErr);
 | 
|      return;
 | 
| @@ -137,6 +137,7 @@ static void attachFunc(
 | 
|    rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags);
 | 
|    sqlite3_free( zPath );
 | 
|    db->nDb++;
 | 
| +  db->skipBtreeMutex = 0;
 | 
|    if( rc==SQLITE_CONSTRAINT ){
 | 
|      rc = SQLITE_ERROR;
 | 
|      zErrDyn = sqlite3MPrintf(db, "database is already attached");
 | 
| @@ -144,7 +145,7 @@ static void attachFunc(
 | 
|      Pager *pPager;
 | 
|      aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt);
 | 
|      if( !aNew->pSchema ){
 | 
| -      rc = SQLITE_NOMEM;
 | 
| +      rc = SQLITE_NOMEM_BKPT;
 | 
|      }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){
 | 
|        zErrDyn = sqlite3MPrintf(db, 
 | 
|          "attached databases must use the same text encoding as main database");
 | 
| @@ -156,14 +157,15 @@ static void attachFunc(
 | 
|      sqlite3BtreeSecureDelete(aNew->pBt,
 | 
|                               sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) );
 | 
|  #ifndef SQLITE_OMIT_PAGER_PRAGMAS
 | 
| -    sqlite3BtreeSetPagerFlags(aNew->pBt, 3 | (db->flags & PAGER_FLAGS_MASK));
 | 
| +    sqlite3BtreeSetPagerFlags(aNew->pBt,
 | 
| +                      PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK));
 | 
|  #endif
 | 
|      sqlite3BtreeLeave(aNew->pBt);
 | 
|    }
 | 
| -  aNew->safety_level = 3;
 | 
| -  aNew->zName = sqlite3DbStrDup(db, zName);
 | 
| -  if( rc==SQLITE_OK && aNew->zName==0 ){
 | 
| -    rc = SQLITE_NOMEM;
 | 
| +  aNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1;
 | 
| +  aNew->zDbSName = sqlite3DbStrDup(db, zName);
 | 
| +  if( rc==SQLITE_OK && aNew->zDbSName==0 ){
 | 
| +    rc = SQLITE_NOMEM_BKPT;
 | 
|    }
 | 
|  
 | 
|  
 | 
| @@ -191,7 +193,7 @@ static void attachFunc(
 | 
|        case SQLITE_NULL:
 | 
|          /* No key specified.  Use the key from the main database */
 | 
|          sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);
 | 
| -        if( nKey>0 || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){
 | 
| +        if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){
 | 
|            rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);
 | 
|          }
 | 
|          break;
 | 
| @@ -229,7 +231,7 @@ static void attachFunc(
 | 
|      sqlite3ResetAllSchemasOfConnection(db);
 | 
|      db->nDb = iDb;
 | 
|      if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
 | 
| -      db->mallocFailed = 1;
 | 
| +      sqlite3OomFault(db);
 | 
|        sqlite3DbFree(db, zErrDyn);
 | 
|        zErrDyn = sqlite3MPrintf(db, "out of memory");
 | 
|      }else if( zErrDyn==0 ){
 | 
| @@ -274,7 +276,7 @@ static void detachFunc(
 | 
|    for(i=0; i<db->nDb; i++){
 | 
|      pDb = &db->aDb[i];
 | 
|      if( pDb->pBt==0 ) continue;
 | 
| -    if( sqlite3StrICmp(pDb->zName, zName)==0 ) break;
 | 
| +    if( sqlite3StrICmp(pDb->zDbSName, zName)==0 ) break;
 | 
|    }
 | 
|  
 | 
|    if( i>=db->nDb ){
 | 
| @@ -324,6 +326,7 @@ static void codeAttach(
 | 
|    sqlite3* db = pParse->db;
 | 
|    int regArgs;
 | 
|  
 | 
| +  if( pParse->nErr ) goto attach_end;
 | 
|    memset(&sName, 0, sizeof(NameContext));
 | 
|    sName.pParse = pParse;
 | 
|  
 | 
| @@ -359,11 +362,11 @@ static void codeAttach(
 | 
|  
 | 
|    assert( v || db->mallocFailed );
 | 
|    if( v ){
 | 
| -    sqlite3VdbeAddOp3(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3);
 | 
| +    sqlite3VdbeAddOp4(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3,
 | 
| +                      (char *)pFunc, P4_FUNCDEF);
 | 
|      assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg );
 | 
|      sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg));
 | 
| -    sqlite3VdbeChangeP4(v, -1, (char *)pFunc, P4_FUNCDEF);
 | 
| -
 | 
| + 
 | 
|      /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this
 | 
|      ** statement only). For DETACH, set it to false (expire all existing
 | 
|      ** statements).
 | 
| @@ -388,12 +391,10 @@ void sqlite3Detach(Parse *pParse, Expr *pDbname){
 | 
|      SQLITE_UTF8,      /* funcFlags */
 | 
|      0,                /* pUserData */
 | 
|      0,                /* pNext */
 | 
| -    detachFunc,       /* xFunc */
 | 
| -    0,                /* xStep */
 | 
| +    detachFunc,       /* xSFunc */
 | 
|      0,                /* xFinalize */
 | 
|      "sqlite_detach",  /* zName */
 | 
| -    0,                /* pHash */
 | 
| -    0                 /* pDestructor */
 | 
| +    {0}
 | 
|    };
 | 
|    codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname);
 | 
|  }
 | 
| @@ -409,12 +410,10 @@ void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){
 | 
|      SQLITE_UTF8,      /* funcFlags */
 | 
|      0,                /* pUserData */
 | 
|      0,                /* pNext */
 | 
| -    attachFunc,       /* xFunc */
 | 
| -    0,                /* xStep */
 | 
| +    attachFunc,       /* xSFunc */
 | 
|      0,                /* xFinalize */
 | 
|      "sqlite_attach",  /* zName */
 | 
| -    0,                /* pHash */
 | 
| -    0                 /* pDestructor */
 | 
| +    {0}
 | 
|    };
 | 
|    codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey);
 | 
|  }
 | 
| @@ -436,7 +435,7 @@ void sqlite3FixInit(
 | 
|    db = pParse->db;
 | 
|    assert( db->nDb>iDb );
 | 
|    pFix->pParse = pParse;
 | 
| -  pFix->zDb = db->aDb[iDb].zName;
 | 
| +  pFix->zDb = db->aDb[iDb].zDbSName;
 | 
|    pFix->pSchema = db->aDb[iDb].pSchema;
 | 
|    pFix->zType = zType;
 | 
|    pFix->pName = pName;
 | 
| @@ -533,7 +532,7 @@ int sqlite3FixExpr(
 | 
|          return 1;
 | 
|        }
 | 
|      }
 | 
| -    if( ExprHasProperty(pExpr, EP_TokenOnly) ) break;
 | 
| +    if( ExprHasProperty(pExpr, EP_TokenOnly|EP_Leaf) ) break;
 | 
|      if( ExprHasProperty(pExpr, EP_xIsSelect) ){
 | 
|        if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1;
 | 
|      }else{
 | 
| 
 |