diff options
author | dan <dan@noemail.net> | 2020-10-31 16:33:01 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2020-10-31 16:33:01 +0000 |
commit | 7a39faecc2e49395e4c70338e96d9e304734e9a0 (patch) | |
tree | 5d2f173588abfce0cf151789cf8abdcf9b1fdd18 /src | |
parent | ed7974dee54cbd608de2fd6303924aaf7bfa8b91 (diff) | |
download | sqlite-7a39faecc2e49395e4c70338e96d9e304734e9a0.tar.gz sqlite-7a39faecc2e49395e4c70338e96d9e304734e9a0.zip |
Update the ALTER TABLE command to correctly handle UPDATE ... FROM statements within trigger programs.
FossilOrigin-Name: 3e6af890406b58da1c4aebec4d483be7ab0fdb589ef7a4c4e987d6bde18d6b97
Diffstat (limited to 'src')
-rw-r--r-- | src/alter.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/alter.c b/src/alter.c index c146c2ff9..f4098863d 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1196,13 +1196,21 @@ static int renameResolveTrigger(Parse *pParse){ int i; for(i=0; i<pSrc->nSrc && rc==SQLITE_OK; i++){ struct SrcList_item *p = &pSrc->a[i]; - p->pTab = sqlite3LocateTableItem(pParse, 0, p); p->iCursor = pParse->nTab++; - if( p->pTab==0 ){ - rc = SQLITE_ERROR; + if( p->pSelect ){ + sqlite3SelectPrep(pParse, p->pSelect, 0); + sqlite3ExpandSubquery(pParse, p); + assert( i>0 ); + assert( pStep->pFrom->a[i-1].pSelect ); + sqlite3SelectPrep(pParse, pStep->pFrom->a[i-1].pSelect, 0); }else{ - p->pTab->nTabRef++; - rc = sqlite3ViewGetColumnNames(pParse, p->pTab); + p->pTab = sqlite3LocateTableItem(pParse, 0, p); + if( p->pTab==0 ){ + rc = SQLITE_ERROR; + }else{ + p->pTab->nTabRef++; + rc = sqlite3ViewGetColumnNames(pParse, p->pTab); + } } } sNC.pSrcList = pSrc; @@ -1264,6 +1272,12 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ sqlite3WalkExpr(pWalker, pUpsert->pUpsertWhere); sqlite3WalkExpr(pWalker, pUpsert->pUpsertTargetWhere); } + if( pStep->pFrom ){ + int i; + for(i=0; i<pStep->pFrom->nSrc; i++){ + sqlite3WalkSelect(pWalker, pStep->pFrom->a[i].pSelect); + } + } } } |