]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a fairly obscure problem allowing an "ALTER TABLE RENAME col TO ..." statement...
authordan <dan@noemail.net>
Fri, 18 Jan 2019 16:06:18 +0000 (16:06 +0000)
committerdan <dan@noemail.net>
Fri, 18 Jan 2019 16:06:18 +0000 (16:06 +0000)
FossilOrigin-Name: 64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a

manifest
manifest.uuid
src/alter.c
test/altertab2.test

index 14bcf53acded09ac030c392d199b5263f3d582aa..b33f7910261b4a2a3f533221f67c165872fc40c5 100644 (file)
--- a/manifest
+++ b/manifest
@@ -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
index 99709bda97fc8b79e6bfb65621320bae85a41a01..cfd314bedeca4eebcd51b79beffc2311a8ab812d 100644 (file)
@@ -1 +1 @@
-05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4
\ No newline at end of file
+64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a
\ No newline at end of file
index 07fe6e757a7028757b0f00b47570f29aff859e58..e1863385870f639cdff87621f9acd8b3e39432fd 100644 (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;
       }
     }
   }
index 22995744a440cf38d6426142f2e9912115308c32..7a247d90e9eeff114548b300205b4e2b8ad3126c 100644 (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