From: dan Date: Fri, 24 Aug 2018 20:10:22 +0000 (+0000) Subject: Fix a problem with renaming a column that occurs as an "excluded.colname" X-Git-Tag: version-3.25.0~39^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=85a9d508dffa519ab37c02a1702002ad3a8f3d85;p=thirdparty%2Fsqlite.git Fix a problem with renaming a column that occurs as an "excluded.colname" construction in an UPSERT that is part of a trigger program. FossilOrigin-Name: bb2f7234968157b605522dea8e115d8772ab4234147894089d6e48fedf5d6a5d --- diff --git a/manifest b/manifest index bfd9033e26..5aa01b23aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C After\smodifying\sand\sreparsing\sthe\sschema\sas\spart\sof\san\sALTER\sTABLE\sRENAME\nCOLUMN,\scheck\sthat\sno\snew\sschema\serrors\shave\sbeen\sintroduced\s(e.g.\sambiguous\ncolumn\snames\sin\sviews)\sbefore\scommitting\sthe\soperation. -D 2018-08-24T17:55:49.159 +C Fix\sa\sproblem\swith\srenaming\sa\scolumn\sthat\soccurs\sas\san\s"excluded.colname"\nconstruction\sin\san\sUPSERT\sthat\sis\spart\sof\sa\strigger\sprogram. +D 2018-08-24T20:10:22.681 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2729786d5d188974913f07ea63cc84cd42cb9cac5f4aac823c40105e68e22f63 @@ -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 4433a45020f111b317e435e9a23c190ce42859856aa852f3601c25252ec71b36 +F src/alter.c 1e0fc6d05d4b24ee87d62701d753773909beb59c27a7f4e9d0f4b95f45173843 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114 @@ -496,7 +496,7 @@ F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 F src/prepare.c 117e27c6826a83f461986c0cfbb09c31fe004922ce23a61bf78d82a46b0958d9 F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 042909753510d0bb98a036cb99211123c5dbdd758ba5b923cb9cc37c3762450b +F src/resolve.c c27c71e108cee18bda473c5b1a5444cf083b600178f748083a4eb121ac8b80e4 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c ae7396a314cc1bb1d767947cd57094e3a9ffcbb155ebc1b1c391e028c44a9a04 F src/shell.c.in 6e0aad854be738a5d0368940459399be211e9ac43aebe92bb9ed46cfe38d0e1f @@ -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 f83599801f862cb9895f3668bf53938b63768200475264071dce17cd068d2504 +F test/altercol.test b8332aae42a36280226281ab2ab0ef433ca412e80b4feab2242f7853fe06a54d F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc F test/altermalloc2.test 0231398534c494401a70a1d06a63d7849cb5b317fcc14228cbdb53039eba7eae F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -1758,7 +1758,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 ad072a835f97ff418f5919d94f547ce8afb4fc7c7b590deba41f1e62136a79ac -R 50e702b70e1b28f7dff750a067872247 +P a0e06d2c5e3abb3f300491e7651bb177a436899efd4506de9239359096b6a9e7 +R 8666098224e26deb38ef4d702518dc0d U dan -Z 41b7da7875d5ec2dd7c0f2a1bfa5aab4 +Z e46cdf7b55732fad26aab58c827a5776 diff --git a/manifest.uuid b/manifest.uuid index a543c86ea0..272a752b6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0e06d2c5e3abb3f300491e7651bb177a436899efd4506de9239359096b6a9e7 \ No newline at end of file +bb2f7234968157b605522dea8e115d8772ab4234147894089d6e48fedf5d6a5d \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index d2554a6936..035ec0fc56 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1361,6 +1361,11 @@ static void renameColumnFunc( if( pStep->pUpsert ){ Upsert *pUpsert = pStep->pUpsert; assert( rc==SQLITE_OK ); + if( pTarget==pTab ){ + pUpsert->pUpsertSrc = &sSrc; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; + } rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); if( rc==SQLITE_OK ){ ExprList *pUpsertSet = pUpsert->pUpsertSet; @@ -1375,6 +1380,7 @@ static void renameColumnFunc( if( rc==SQLITE_OK ){ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); } + sNC.ncFlags = 0; } if( rc==SQLITE_OK && pTarget==pTab ){ diff --git a/src/resolve.c b/src/resolve.c index 3ac6f5305d..a754ae846f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -349,9 +349,15 @@ static int lookupName( #ifndef SQLITE_OMIT_UPSERT if( pExpr->iTable==2 ){ testcase( iCol==(-1) ); - pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; - eNewExprOp = TK_REGISTER; - ExprSetProperty(pExpr, EP_Alias); + if( IN_RENAME_COLUMN ){ + pExpr->iColumn = iCol; + pExpr->pTab = pTab; + eNewExprOp = TK_COLUMN; + }else{ + pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; + eNewExprOp = TK_REGISTER; + ExprSetProperty(pExpr, EP_Alias); + } }else #endif /* SQLITE_OMIT_UPSERT */ { diff --git a/test/altercol.test b/test/altercol.test index 4f27c247e0..ebede5e681 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -669,6 +669,23 @@ do_execsql_test 16.2 { SELECT * FROM v4; } {1 4} -reset_db +do_execsql_test 16.3 { + CREATE UNIQUE INDEX t2d ON t2(d); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 VALUES(new.a, new.b, new.c) + ON CONFLICT(d) DO UPDATE SET f = excluded.f; + END; +} + +do_execsql_test 16.4 { + INSERT INTO t1 VALUES(4, 8, 456); + SELECT * FROM t2; +} {4 5 456} + +do_execsql_test 16.5 { + ALTER TABLE t2 RENAME COLUMN f TO "big f"; + INSERT INTO t1 VALUES(4, 0, 20456); + SELECT * FROM t2; +} {4 5 20456} finish_test