aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2020-10-31 16:33:01 +0000
committerdan <dan@noemail.net>2020-10-31 16:33:01 +0000
commit7a39faecc2e49395e4c70338e96d9e304734e9a0 (patch)
tree5d2f173588abfce0cf151789cf8abdcf9b1fdd18 /src
parented7974dee54cbd608de2fd6303924aaf7bfa8b91 (diff)
downloadsqlite-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.c24
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);
+ }
+ }
}
}