aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <Dan Kennedy>2022-05-26 19:10:11 +0000
committerdan <Dan Kennedy>2022-05-26 19:10:11 +0000
commitb8bbe3e2db8b0cd12a955de6c10a441301b60e55 (patch)
tree49eb134d8e09e998bfd74c73ca872694d1167c62 /src
parent26c4df0fb0da9baa37b797cdbaefd35df0a24693 (diff)
downloadsqlite-b8bbe3e2db8b0cd12a955de6c10a441301b60e55.tar.gz
sqlite-b8bbe3e2db8b0cd12a955de6c10a441301b60e55.zip
Fix issues with ALTER TABLE and triggers containing "UPDATE...FROM" statements.
FossilOrigin-Name: 2fba0d41b781d226915fa2bf888a7bc640c046ce22670ceb53f62a09f3975259
Diffstat (limited to 'src')
-rw-r--r--src/alter.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/alter.c b/src/alter.c
index 538ba7d9f..8e19c0ace 100644
--- a/src/alter.c
+++ b/src/alter.c
@@ -1318,6 +1318,8 @@ static int renameResolveTrigger(Parse *pParse){
SrcList *pSrc = sqlite3TriggerStepSrc(pParse, pStep);
if( pSrc ){
int i;
+ assert( pSrc->nSrc==1 || pSrc->nSrc==2 );
+ assert( pSrc->a[0].pSelect==0 );
for(i=0; i<pSrc->nSrc && rc==SQLITE_OK; i++){
SrcItem *p = &pSrc->a[i];
p->iCursor = pParse->nTab++;
@@ -1325,8 +1327,6 @@ static int renameResolveTrigger(Parse *pParse){
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 = sqlite3LocateTableItem(pParse, 0, p);
if( p->pTab==0 ){
@@ -1337,6 +1337,15 @@ static int renameResolveTrigger(Parse *pParse){
}
}
}
+ if( pStep->pFrom ){
+ for(i=0; i<pStep->pFrom->nSrc && rc==SQLITE_OK; i++){
+ SrcItem *p = &pStep->pFrom->a[i];
+ if( p->pSelect ){
+ sqlite3SelectPrep(pParse, p->pSelect, 0);
+ }
+ }
+ }
+
if( rc==SQLITE_OK && db->mallocFailed ){
rc = SQLITE_NOMEM;
}
@@ -1789,6 +1798,15 @@ static void renameTableFunc(
if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){
renameTokenFind(&sParse, &sCtx, pStep->zTarget);
}
+ if( pStep->pFrom ){
+ int i;
+ for(i=0; i<pStep->pFrom->nSrc; i++){
+ SrcItem *pItem = &pStep->pFrom->a[i];
+ if( pItem->zName && 0==sqlite3_stricmp(pItem->zName, zOld) ){
+ renameTokenFind(&sParse, &sCtx, pItem->zName);
+ }
+ }
+ }
}
}
}