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