diff options
-rw-r--r-- | manifest | 14 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | src/alter.c | 68 | ||||
-rw-r--r-- | test/altercol.test | 57 |
4 files changed, 108 insertions, 33 deletions
@@ -1,5 +1,5 @@ -C (no\scomment) -D 2018-08-15T20:28:39.044 +C Further\sprogress\son\supdating\strigger\sprograms\sas\spart\sof\sALTER\sTABLE\sRENAME\nCOLUMN. +D 2018-08-16T19:49:16.440 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6 @@ -432,7 +432,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 1452a35d1660b0c9786f93d6e5e6db3fe28ef6ec5bbeb1f51d116ac984f65cab +F src/alter.c c16b42be9a598c48d6869082f74c8391641dc31a4ba85811997b8b80c0e3ce4c F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114 @@ -599,7 +599,7 @@ F test/alter.test b820ab9dcf85f8e3a65bc8326accb2f0c7be64ef F test/alter2.test 7ea05c7d92ac99349a802ef7ada17294dd647060 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test b6d7b86860111864f6cddb54af313f5862dda23b -F test/altercol.test c57633752895b10b2ca488de648b415e95c45272f37e05e4ad110f7b787c83eb +F test/altercol.test c60161856f21a447220643c9c7cb447cf766d0c6a115247a58628c2355b66716 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test b3a9c67d00e1df7588a5b7be9a0292899f94fe8cac1f94a017277474ca2e59df @@ -1756,7 +1756,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6e6a2bfdbbfd4ffc14be88962ff97bf3c626fef9d1a337715d2a4be1a657fb0d -R 50934f42996c56e5e11553d2ba6b9958 +P e272dc2b1c0edab59a40f32c77c81a3e636937280524161eff5669cb0046ad84 +R a4f7901353039cfd23087ece73e91338 U dan -Z 5c4bbda1010d90157de824a7c5d29ecd +Z edd8747b185ed4a97732b3af8e23ffdd diff --git a/manifest.uuid b/manifest.uuid index 98b330ff9..d26f00346 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e272dc2b1c0edab59a40f32c77c81a3e636937280524161eff5669cb0046ad84
\ No newline at end of file +3f47222b6e20e1c1ef41c0f7391c8b5c7648e2a2d6013303d155ad59ce27143a
\ No newline at end of file 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); + } } } diff --git a/test/altercol.test b/test/altercol.test index d5fc8f150..cf6e75f7f 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -133,7 +133,6 @@ do_execsql_test 3.0 { INSERT INTO t4 VALUES(3, 2, 1); } -breakpoint do_execsql_test 3.1 { ALTER TABLE t4 RENAME y TO abc; SELECT sql FROM sqlite_master WHERE name='t4'; @@ -331,5 +330,61 @@ do_execsql_test 8.4.5 { SELECT sql FROM sqlite_master WHERE name = 'zzz' } {{CREATE VIEW zzz AS SELECT george, ringo FROM b1}} +#------------------------------------------------------------------------- +# More triggers. +# +foreach {tn old new lSchema} { + 1 _x_ _xxx_ { + { CREATE TABLE t1(a, b, _x_) } + { CREATE TRIGGER AFTER INSERT ON t1 BEGIN + SELECT _x_ FROM t1; + END } + } + + 2 _x_ _xxx_ { + { CREATE TABLE t1(a, b, _x_) } + { CREATE TABLE t2(c, d, e) } + { CREATE TRIGGER ttt AFTER INSERT ON t2 BEGIN + SELECT _x_ FROM t1; + END } + } + + 3 _x_ _xxx_ { + { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } + { CREATE TABLE t2(c, d, e) } + { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN + INSERT INTO t2 VALUES(new.a, new.b, new._x_); + END } + } + + 4 _x_ _xxx_ { + { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } + { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN + INSERT INTO t1 VALUES(new.a, new.b, new._x_) + ON CONFLICT (_x_) WHERE _x_>10 DO UPDATE SET _x_ = _x_+1; + END } + } +} { + reset_db + set lSorted [list] + foreach sql $lSchema { + execsql $sql + lappend lSorted [string trim $sql] + } + set lSorted [lsort $lSorted] + + do_execsql_test 9.$tn.1 { + SELECT sql FROM sqlite_master WHERE sql!='' ORDER BY 1 + } $lSorted + +if { $tn==3 } breakpoint + do_execsql_test 9.$tn.2 "ALTER TABLE t1 RENAME $old TO $new" + + do_execsql_test 9.$tn.1 { + SELECT sql FROM sqlite_master ORDER BY 1 + } [string map [list $old $new] $lSorted] +} + +reset_db finish_test |