diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/alter.c | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/src/alter.c b/src/alter.c index c0696400f..5b36a4b10 100644 --- a/src/alter.c +++ b/src/alter.c @@ -845,10 +845,7 @@ void sqlite3AlterRenameColumn( sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_column(sql, %Q, %Q, %d, %Q, %d) " - "WHERE name NOT LIKE 'sqlite_%%' AND (" - " type IN ('table', 'view') " - " OR (type IN ('index', 'trigger') AND tbl_name = %Q)" - ")", + "WHERE name NOT LIKE 'sqlite_%%' AND (type != 'index' OR tbl_name = %Q)", zDb, MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote, pTab->zName @@ -982,23 +979,14 @@ static int renameColumnSelectCb(Walker *pWalker, Select *p){ */ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; - if( pExpr->op==TK_TRIGGER && pExpr->iColumn==p->iCol ){ + if( pExpr->op==TK_TRIGGER + && pExpr->iColumn==p->iCol + && pWalker->pParse->pTriggerTab==p->pTab + ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); - }else - - if( p->zOld && pExpr->op==TK_DOT ){ - Expr *pLeft = pExpr->pLeft; - Expr *pRight = pExpr->pRight; - assert( pLeft->op==TK_ID && pRight->op==TK_ID ); - if( 0==sqlite3_stricmp(pLeft->u.zToken, "old") - || 0==sqlite3_stricmp(pLeft->u.zToken, "new") - ){ - if( 0==sqlite3_stricmp(pRight->u.zToken, p->zOld) ){ - renameTokenFind(pWalker->pParse, p, (void*)pRight); - } - } - }else if( pExpr->op==TK_COLUMN && pExpr->iColumn==p->iCol - && (p->pTab==0 || p->pTab==pExpr->pTab) + }else if( pExpr->op==TK_COLUMN + && pExpr->iColumn==p->iCol + && p->pTab==pExpr->pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); } @@ -1138,11 +1126,11 @@ static void renameColumnFunc( sWalker.xSelectCallback = renameColumnSelectCb; sWalker.u.pRename = &sCtx; + sCtx.pTab = pTab; if( rc!=SQLITE_OK ) goto renameColumnFunc_done; if( sParse.pNewTable ){ Select *pSelect = sParse.pNewTable->pSelect; if( pSelect ){ - sCtx.pTab = pTab; sParse.rc = SQLITE_OK; sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, 0); rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc); @@ -1161,6 +1149,7 @@ static void renameColumnFunc( int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName); FKey *pFKey; assert( sParse.pNewTable->pSelect==0 ); + sCtx.pTab = sParse.pNewTable; if( bFKOnly==0 ){ renameTokenFind( &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName @@ -1196,11 +1185,11 @@ static void renameColumnFunc( NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = &sParse; - sParse.pTriggerTab = pTab; + sParse.pTriggerTab = sqlite3FindTable(db, sParse.pNewTrigger->table, zDb); sParse.eTriggerOp = sParse.pNewTrigger->op; - /* Resolve symbols in WHEN clause */ - if( sParse.pTriggerTab==pTab && sParse.pNewTrigger->pWhen ){ + /* Resolve symbols in WHEN clause */ + if( sParse.pNewTrigger->pWhen ){ rc = sqlite3ResolveExprNames(&sNC, sParse.pNewTrigger->pWhen); } @@ -1226,6 +1215,30 @@ static void renameColumnFunc( if( rc==SQLITE_OK ){ rc = sqlite3ResolveExprListNames(&sNC, pStep->pExprList); } + if( pStep->pUpsert ){ + Upsert *pUpsert = pStep->pUpsert; + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + } + if( rc==SQLITE_OK && pUpsert->pUpsertSet){ + ExprList *pUpsertSet = pUpsert->pUpsertSet; + rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); + if( rc==SQLITE_OK && pTarget==pTab ){ + for(i=0; i<pUpsertSet->nExpr; i++){ + char *zName = pUpsertSet->a[i].zName; + if( 0==sqlite3_stricmp(zName, zOld) ){ + renameTokenFind(&sParse, &sCtx, (void*)zName); + } + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + } + } if( rc==SQLITE_OK && pTarget==pTab ){ if( pStep->pIdList ){ @@ -1270,6 +1283,13 @@ static void renameColumnFunc( sqlite3WalkSelect(&sWalker, pStep->pSelect); sqlite3WalkExpr(&sWalker, pStep->pWhere); sqlite3WalkExprList(&sWalker, pStep->pExprList); + if( pStep->pUpsert ){ + Upsert *pUpsert = pStep->pUpsert; + sqlite3WalkExprList(&sWalker, pUpsert->pUpsertTarget); + sqlite3WalkExprList(&sWalker, pUpsert->pUpsertSet); + sqlite3WalkExpr(&sWalker, pUpsert->pUpsertWhere); + sqlite3WalkExpr(&sWalker, pUpsert->pUpsertTargetWhere); + } } } |