Index: src/alter.c ================================================================== --- src/alter.c +++ src/alter.c @@ -1077,10 +1077,55 @@ zErr = sqlite3_mprintf("error processing %s %s: %s", zT, zN, pParse->zErrMsg); sqlite3_result_error(pCtx, zErr, -1); sqlite3_free(zErr); } + +/* +** For each name in the the expression-list pEList (i.e. each +** pEList->a[i].zName) that matches the string in zOld, extract the +** corresponding rename-token from Parse object pParse and add it +** to the RenameCtx pCtx. +*/ +static void renameColumnElistNames( + Parse *pParse, + RenameCtx *pCtx, + ExprList *pEList, + const char *zOld +){ + if( pEList ){ + int i; + for(i=0; inExpr; i++){ + char *zName = pEList->a[i].zName; + if( 0==sqlite3_stricmp(zName, zOld) ){ + renameTokenFind(pParse, pCtx, (void*)zName); + } + } + } +} + +/* +** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName) +** that matches the string in zOld, extract the corresponding rename-token +** from Parse object pParse and add it to the RenameCtx pCtx. +*/ +static void renameColumnIdlistNames( + Parse *pParse, + RenameCtx *pCtx, + IdList *pIdList, + const char *zOld +){ + if( pIdList ){ + int i; + for(i=0; inId; i++){ + char *zName = pIdList->a[i].zName; + if( 0==sqlite3_stricmp(zName, zOld) ){ + renameTokenFind(pParse, pCtx, (void*)zName); + } + } + } +} /* ** SQL function: ** ** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld) @@ -1273,11 +1318,11 @@ if( pStep->pSelect ){ sqlite3SelectPrep(&sParse, pStep->pSelect, &sNC); if( sParse.nErr ) rc = sParse.rc; } if( rc==SQLITE_OK && pStep->zTarget ){ - Table *pTarget = sqlite3FindTable(db, pStep->zTarget, zDb); + Table *pTarget = sqlite3LocateTable(&sParse, 0, pStep->zTarget, zDb); if( pTarget==0 ){ rc = SQLITE_ERROR; }else{ SrcList sSrc; memset(&sSrc, 0, sizeof(sSrc)); @@ -1294,21 +1339,16 @@ assert( !pStep->pUpsert || (!pStep->pWhere && !pStep->pExprList) ); if( pStep->pUpsert ){ Upsert *pUpsert = pStep->pUpsert; assert( rc==SQLITE_OK ); rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); - if( rc==SQLITE_OK && pUpsert->pUpsertSet){ + if( rc==SQLITE_OK ){ ExprList *pUpsertSet = pUpsert->pUpsertSet; - rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); - if( rc==SQLITE_OK && pTarget==pTab ){ - for(i=0; inExpr; i++){ - char *zName = pUpsertSet->a[i].zName; - if( 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(&sParse, &sCtx, (void*)zName); - } - } - } + if( pTarget==pTab ){ + renameColumnElistNames(&sParse, &sCtx, pUpsertSet, zOld); + } + rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); } if( rc==SQLITE_OK ){ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere); } if( rc==SQLITE_OK ){ @@ -1315,42 +1355,22 @@ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); } } if( rc==SQLITE_OK && pTarget==pTab ){ - if( pStep->pIdList ){ - for(i=0; ipIdList->nId; i++){ - char *zName = pStep->pIdList->a[i].zName; - if( 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(&sParse, &sCtx, (void*)zName); - } - } - } - if( pStep->op==TK_UPDATE ){ - assert( pStep->pExprList ); - for(i=0; ipExprList->nExpr; i++){ - char *zName = pStep->pExprList->a[i].zName; - if( 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(&sParse, &sCtx, (void*)zName); - } - } - } + renameColumnIdlistNames(&sParse, &sCtx, pStep->pIdList, zOld); + renameColumnElistNames(&sParse, &sCtx, pStep->pExprList, zOld); } } } } if( rc!=SQLITE_OK ) goto renameColumnFunc_done; /* Find tokens to edit in UPDATE OF clause */ - if( sParse.pTriggerTab==pTab && sParse.pNewTrigger->pColumns ){ - for(i=0; ipColumns->nId; i++){ - char *zName = sParse.pNewTrigger->pColumns->a[i].zName; - if( 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(&sParse, &sCtx, (void*)zName); - } - } + if( sParse.pTriggerTab==pTab ){ + renameColumnIdlistNames(&sParse, &sCtx,sParse.pNewTrigger->pColumns,zOld); } /* Find tokens to edit in WHEN clause */ sqlite3WalkExpr(&sWalker, sParse.pNewTrigger->pWhen); @@ -1437,11 +1457,11 @@ ** Register built-in functions used to help implement ALTER TABLE */ void sqlite3AlterFunctions(void){ static FuncDef aAlterTableFuncs[] = { FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc), - FUNCTION(sqlite_rename_column, 8, 0, 0, renameColumnFunc), + FUNCTION(sqlite_rename_column, 8, 0, 0, renameColumnFunc), #ifndef SQLITE_OMIT_TRIGGER FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc), #endif #ifndef SQLITE_OMIT_FOREIGN_KEY FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc), Index: test/altercol.test ================================================================== --- test/altercol.test +++ test/altercol.test @@ -592,11 +592,15 @@ INSERT INTO x1(i, t) VALUES(new.i+1, new.t||'1') ON CONFLICT (tttttt) DO UPDATE SET t=i+1; END; } {no such column: tttttt} - + 4 { + CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN + INSERT INTO nosuchtable VALUES(new.i, new.t); + END; + } {no such table: main.nosuchtable} } { do_execsql_test 13.2.$tn.1 " DROP TRIGGER IF EXISTS tr1; $trigger "