Fix a fairly obscure problem allowing an "ALTER TABLE RENAME col TO ..." statement to modify the schema in such a way as to break a reference within a trigger program.

FossilOrigin-Name: 64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a
This commit is contained in:
dan 2019-01-18 16:06:18 +00:00
parent 3cb79202f8
commit 0e14e98706
4 changed files with 38 additions and 10 deletions

View File

@ -1,5 +1,5 @@
C Use\sthe\sfull\s64-bit\sinteger\svalue\sin\sthe\sargument\sto\srandomblob().
D 2019-01-18T14:53:15.315
C Fix\sa\sfairly\sobscure\sproblem\sallowing\san\s"ALTER\sTABLE\sRENAME\scol\sTO\s..."\sstatement\sto\smodify\sthe\sschema\sin\ssuch\sa\sway\sas\sto\sbreak\sa\sreference\swithin\sa\strigger\sprogram.
D 2019-01-18T16:06:18.719
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777
@ -447,7 +447,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c 8ac946d83b7888faf1707e4fdc9b37e61ec83325bb3d6b1a6d382d3287d0c8d8
F src/alter.c cb691d6cd330312b7951c9d3bc0bc29804bbe80beac1cdd137d824b119b6f28a
F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644
F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd
F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3
F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a
F test/altertab2.test b80f1b4c1f8346326b9ba35ad741544c1a9610c82187e49b08f84b869d5f01db
F test/altertab2.test 67dd9806e7dafaea26f3b6fcaa4e909f690d6ac71373545577ece7f96a4ea817
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c
F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
@ -1800,7 +1800,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 f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e
R 97498d3c71bde004a7d802e0afc968d0
U drh
Z 04e8cef97e0ba118422a1f7fd8c6430e
P 05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4
R f8fd80d19fb63224c47a5c696f5a7a57
U dan
Z 4f2ee8716e9e64841d044a5ee936a34b

View File

@ -1 +1 @@
05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4
64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a

View File

@ -1081,7 +1081,6 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){
Trigger *pNew = pParse->pNewTrigger;
TriggerStep *pStep;
NameContext sNC;
SrcList sSrc;
int rc = SQLITE_OK;
memset(&sNC, 0, sizeof(sNC));
@ -1112,6 +1111,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){
if( pTarget==0 ){
rc = SQLITE_ERROR;
}else if( SQLITE_OK==(rc = sqlite3ViewGetColumnNames(pParse, pTarget)) ){
SrcList sSrc;
memset(&sSrc, 0, sizeof(sSrc));
sSrc.nSrc = 1;
sSrc.a[0].zName = pStep->zTarget;
@ -1143,6 +1143,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){
}
sNC.ncFlags = 0;
}
sNC.pSrcList = 0;
}
}
}

View File

@ -305,6 +305,33 @@ do_execsql_test 7.3 {
END}
}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 8.0 {
CREATE TABLE t1(a, b, c);
CREATE TABLE t2(a, b, c);
CREATE TABLE t3(d, e, f);
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN
UPDATE t2 SET a = new.d;
SELECT a, b, c FROM v1;
END;
}
do_execsql_test 8.1 {
INSERT INTO t3 VALUES(1, 2, 3);
}
# The following ALTER TABLE fails as if column "t1.a" is renamed the "a"
# in the "SELECT a, b, c FROM v1" within the trigger can no longer be
# resolved. But at one point there was a bug allowing the ALTER TABLE
# succeed. Which meant the subsequent INSERT statement would fail.
do_catchsql_test 8.2 {
ALTER TABLE t1 RENAME a TO aaa;
} {1 {error in trigger tr after rename: no such column: a}}
do_execsql_test 8.3 {
INSERT INTO t3 VALUES(4, 5, 6);
}
finish_test