| 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{
|
|
|