diff options
author | dan <Dan Kennedy> | 2022-05-26 19:10:11 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2022-05-26 19:10:11 +0000 |
commit | b8bbe3e2db8b0cd12a955de6c10a441301b60e55 (patch) | |
tree | 49eb134d8e09e998bfd74c73ca872694d1167c62 /src | |
parent | 26c4df0fb0da9baa37b797cdbaefd35df0a24693 (diff) | |
download | sqlite-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.c | 22 |
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); + } + } + } } } } |