mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-16 23:02:26 +03:00
More fixes and comment updates.
FossilOrigin-Name: 38a9327bad1a01e3d7a47fad44ece2f6c7e88643
This commit is contained in:
62
src/build.c
62
src/build.c
@@ -64,35 +64,32 @@ void sqlite3TableLock(
|
||||
u8 isWriteLock, /* True for a write lock */
|
||||
const char *zName /* Name of the table to be locked */
|
||||
){
|
||||
Parse *pToplevel = sqlite3ParseToplevel(pParse);
|
||||
int i;
|
||||
int nBytes;
|
||||
TableLock *p;
|
||||
|
||||
assert( iDb>=0 );
|
||||
|
||||
if( pParse->pRoot ){
|
||||
pParse = pParse->pRoot;
|
||||
}
|
||||
for(i=0; i<pParse->nTableLock; i++){
|
||||
p = &pParse->aTableLock[i];
|
||||
for(i=0; i<pToplevel->nTableLock; i++){
|
||||
p = &pToplevel->aTableLock[i];
|
||||
if( p->iDb==iDb && p->iTab==iTab ){
|
||||
p->isWriteLock = (p->isWriteLock || isWriteLock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
nBytes = sizeof(TableLock) * (pParse->nTableLock+1);
|
||||
pParse->aTableLock =
|
||||
sqlite3DbReallocOrFree(pParse->db, pParse->aTableLock, nBytes);
|
||||
if( pParse->aTableLock ){
|
||||
p = &pParse->aTableLock[pParse->nTableLock++];
|
||||
nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
|
||||
pToplevel->aTableLock =
|
||||
sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
|
||||
if( pToplevel->aTableLock ){
|
||||
p = &pToplevel->aTableLock[pToplevel->nTableLock++];
|
||||
p->iDb = iDb;
|
||||
p->iTab = iTab;
|
||||
p->isWriteLock = isWriteLock;
|
||||
p->zName = zName;
|
||||
}else{
|
||||
pParse->nTableLock = 0;
|
||||
pParse->db->mallocFailed = 1;
|
||||
pToplevel->nTableLock = 0;
|
||||
pToplevel->db->mallocFailed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,7 +195,7 @@ void sqlite3FinishCoding(Parse *pParse){
|
||||
#endif
|
||||
assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */
|
||||
sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem,
|
||||
pParse->nTab, pParse->nArg, pParse->explain);
|
||||
pParse->nTab, pParse->nMaxArg, pParse->explain);
|
||||
pParse->rc = SQLITE_DONE;
|
||||
pParse->colNamesSet = 0;
|
||||
}else if( pParse->rc==SQLITE_OK ){
|
||||
@@ -3426,30 +3423,26 @@ int sqlite3OpenTempDatabase(Parse *pParse){
|
||||
** early in the code, before we know if any database tables will be used.
|
||||
*/
|
||||
void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
|
||||
sqlite3 *db;
|
||||
Vdbe *v;
|
||||
int mask;
|
||||
Parse *pRoot = pParse->pRoot; /* Root parse structure */
|
||||
Parse *pToplevel = sqlite3ParseToplevel(pParse);
|
||||
|
||||
v = sqlite3GetVdbe(pParse);
|
||||
if( v==0 ) return; /* This only happens if there was a prior error */
|
||||
db = pParse->db;
|
||||
if( pParse->cookieGoto==0 && pRoot==0 ){
|
||||
pParse->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
|
||||
if( pToplevel->cookieGoto==0 ){
|
||||
Vdbe *v = sqlite3GetVdbe(pToplevel);
|
||||
if( v==0 ) return; /* This only happens if there was a prior error */
|
||||
pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
|
||||
}
|
||||
if( iDb>=0 ){
|
||||
if( pRoot==0 ){
|
||||
pRoot = pParse;
|
||||
}
|
||||
sqlite3 *db = pToplevel->db;
|
||||
int mask;
|
||||
|
||||
assert( iDb<db->nDb );
|
||||
assert( db->aDb[iDb].pBt!=0 || iDb==1 );
|
||||
assert( iDb<SQLITE_MAX_ATTACHED+2 );
|
||||
mask = 1<<iDb;
|
||||
if( (pRoot->cookieMask & mask)==0 ){
|
||||
pRoot->cookieMask |= mask;
|
||||
pRoot->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
|
||||
if( (pToplevel->cookieMask & mask)==0 ){
|
||||
pToplevel->cookieMask |= mask;
|
||||
pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
|
||||
if( !OMIT_TEMPDB && iDb==1 ){
|
||||
sqlite3OpenTempDatabase(pRoot);
|
||||
sqlite3OpenTempDatabase(pToplevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3469,13 +3462,10 @@ void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
|
||||
** necessary to undo a write and the checkpoint should not be set.
|
||||
*/
|
||||
void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
|
||||
Parse *pRoot = pParse->pRoot;
|
||||
Parse *pToplevel = sqlite3ParseToplevel(pParse);
|
||||
sqlite3CodeVerifySchema(pParse, iDb);
|
||||
if( pRoot==0 ){
|
||||
pRoot = pParse;
|
||||
}
|
||||
pRoot->writeMask |= 1<<iDb;
|
||||
if( setStatement && pParse->nested==0 && pParse->pRoot==0 ){
|
||||
pToplevel->writeMask |= 1<<iDb;
|
||||
if( setStatement && pParse->nested==0 && pParse==pToplevel ){
|
||||
/* Every place where this routine is called with setStatement!=0 has
|
||||
** already successfully created a VDBE. */
|
||||
assert( pParse->pVdbe );
|
||||
|
||||
Reference in New Issue
Block a user