]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not allow shadow tables to be dropped in defensive mode.
authordrh <drh@noemail.net>
Sat, 16 Nov 2019 12:04:38 +0000 (12:04 +0000)
committerdrh <drh@noemail.net>
Sat, 16 Nov 2019 12:04:38 +0000 (12:04 +0000)
FossilOrigin-Name: 70390bbca49e706649ca5b7c031f0baf416fc38798c17e5f3b73746b3e66e3b5

manifest
manifest.uuid
src/build.c
test/altertab.test

index ac188b51dd9d4ee5828c044ae3753a4f5cf596c0..cc225c4e7ca331854f200e8fd2ede4e182b0641e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\spotential\sNULL\spointer\sdereference\son\sa\sRENAME\sTABLE\sthat\sreferences\na\sVIEW\swith\sa\slogic\serror\sin\sa\swindow\sfunction\sin\sthe\sORDER\sBY\sclause.
-D 2019-11-16T11:33:39.324
+C Do\snot\sallow\sshadow\stables\sto\sbe\sdropped\sin\sdefensive\smode.
+D 2019-11-16T12:04:38.775
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22
 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484
 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437
-F src/build.c 572d85d338189e48904b059d28cfc2f9099abfdc4f746142286fa1c0f1778a71
+F src/build.c 8d83d05a04c66efd365cc304dd0c2c64b5103999c8c2b6f4eac1542ace37c13e
 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
@@ -634,7 +634,7 @@ F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1
 F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b
 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
-F test/altertab.test b2004ac589207fed7e19877bc3f1ad65142be482f269c176ee407e3b4a65f1a0
+F test/altertab.test 8069e5a8cbd3cb35732d3ec680dcc5273c2587ebd8e6a5d51084fa8059e468e5
 F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272
 F test/altertab3.test f40013d333e273da57e329fac6c2268a58aa09d17c3575936b343eeb2fa09180
 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
@@ -1849,7 +1849,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 8f4a3750b7d272daf96831655ffee80d457875ee121fc4537008046b9a00d0e7
-R 383755df3f3f1cd4ca570f1c560cd1a6
+P 0adb273f7e7671efb0e0a1619887e369500dfd2db7ef1b1e125c2414ea96e96f
+R f9348babad4bba5f0891285050f4d37d
 U drh
-Z 409cd14f4eb3f55f82c878e2e6adf71b
+Z 77855e9dccc751997936b3fa7ba32932
index 0a86a19526dde4dd04d086740155fd849337863a..2851b6bec31dd048fdd77915f9b51f2f5ae03c17 100644 (file)
@@ -1 +1 @@
-0adb273f7e7671efb0e0a1619887e369500dfd2db7ef1b1e125c2414ea96e96f
\ No newline at end of file
+70390bbca49e706649ca5b7c031f0baf416fc38798c17e5f3b73746b3e66e3b5
\ No newline at end of file
index ecec4a37412f38f6f4fc8fcd7a0a996b7c5e1472..2cc00d9d8598f89e8ffcd7b9204d43fe94b29e94 100644 (file)
@@ -2894,6 +2894,22 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){
   sqliteViewResetAll(db, iDb);
 }
 
+/*
+** Return true if it is not allowed to drop the given table
+*/
+static int tableMayNotBeDropped(Parse *pParse, Table *pTab){
+  if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
+    if( sqlite3StrNICmp(pTab->zName+7, "stat", 4)==0 ) return 0;
+    if( sqlite3StrNICmp(pTab->zName+7, "parameters", 10)==0 ) return 0;
+    return 1;
+  }
+  if( pTab->tabFlags & TF_Shadow ){
+    sqlite3 *db = pParse->db;
+    if( (db->flags & SQLITE_Defensive)!=0 && db->nVdbeExec==0 ) return 1;
+  }
+  return 0;
+}
+
 /*
 ** This routine is called to do the work of a DROP TABLE statement.
 ** pName is the name of the table to be dropped.
@@ -2963,9 +2979,7 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
     }
   }
 #endif
-  if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 
-    && sqlite3StrNICmp(pTab->zName+7, "stat", 4)!=0
-    && sqlite3StrNICmp(pTab->zName+7, "parameters", 10)!=0 ){
+  if( tableMayNotBeDropped(pParse, pTab) ){
     sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
     goto exit_drop_table;
   }
index 2eed636e0d0aa90b11e3be408167592c05f7f06b..79b54272a0e1043d4f90368a431f82f25ccfbcbd 100644 (file)
@@ -542,19 +542,23 @@ ifcapable fts3 {
     CREATE VIRTUAL TABLE y1 USING fts3;
   }
 
-  do_catchsql_test 16.1 {
+  do_catchsql_test 16.10 {
     INSERT INTO y1_segments VALUES(1, X'1234567890');
   } {1 {table y1_segments may not be modified}}
 
-  do_catchsql_test 16.2 {
+  do_catchsql_test 16.20 {
     ALTER TABLE y1_segments RENAME TO abc;
   } {1 {table y1_segments may not be altered}}
 
-  do_execsql_test 16.3 {
+  do_catchsql_test 16.21 {
+    DROP TABLE y1_segments;
+  } {1 {table y1_segments may not be dropped}}
+
+  do_execsql_test 16.30 {
     ALTER TABLE y1 RENAME TO z1;
   }
 
-  do_execsql_test 16.4 {
+  do_execsql_test 16.40 {
     SELECT * FROM z1_segments;
   }
 }