]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with the DROP TABLE command on this branch.
authordan <dan@noemail.net>
Wed, 9 Dec 2015 16:08:22 +0000 (16:08 +0000)
committerdan <dan@noemail.net>
Wed, 9 Dec 2015 16:08:22 +0000 (16:08 +0000)
FossilOrigin-Name: c80bbf14b365d2131210a849f26a69a5ea15101d

manifest
manifest.uuid
src/trigger.c
test/delete4.test
test/table.test

index 1fba7de89f6ce1ab3511a89768dd36feddaf32be..278918a42b1bf7d25be9c8b79a457bed46f56efe 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssimple\stests\sand\sbugfixes\sfor\sDELETE\sstatements\sthat\squalify\sfor\sthe\sOR-optimization.
-D 2015-12-09T10:06:24.300
+C Fix\sa\sproblem\swith\sthe\sDROP\sTABLE\scommand\son\sthis\sbranch.
+D 2015-12-09T16:08:22.445
 F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc e8fdca1cb89a1b58b5f4d3a130ea9a3d28cb314d
@@ -399,7 +399,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0
 F src/tokenize.c 5606871a377f390af7040ec3c12e0d183512d785
 F src/treeview.c 78842e90c1f71269e7a73a1d4221b6fe360bab66
-F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f
+F src/trigger.c de3ed31ad3218a20d7d7e18bf1b3b734e78bda66
 F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3
 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
 F src/util.c e802e8e311a0d6c48cd1b3e89db164f6f0248d70
@@ -576,7 +576,7 @@ F test/default.test 0cb49b1c315a0d81c81d775e407f66906a2a604d
 F test/delete.test e1bcdf8926234e27aac24b346ad83d3329ec8b6f
 F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa
 F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab
-F test/delete4.test 3ac0b8d23689ba764c2e8b78c1b56b8f1b942fa2
+F test/delete4.test 174f0a46aeceae3fd96d5a52ecd1db63cebc6c56
 F test/descidx1.test 6d03b44c8538fe0eb4924e19fba10cdd8f3c9240
 F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d
 F test/descidx3.test 09ddbe3f5295f482d2f8b687cf6db8bad7acd9a2
@@ -1056,7 +1056,7 @@ F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85
 F test/syscall.test 2aa9e111b79fb385681ff8940124def6f8faab87
 F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04
 F test/tabfunc01.test cc33684f9480fcf1fd5ce287ac28d22971cad1cc
-F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f
+F test/table.test f85f8694f94ac1275cee81f84bdea66cdcc494c5
 F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
 F test/tclsqlite.test 7fb866443c7deceed22b63948ccd6f76b52ad054
@@ -1408,7 +1408,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P dc236f11181e235ddfe58a7943a462686679bf94
-R de0ef9c8056887209ad87620155e0e85
+P 10ca7357b27d0657127d553738be3ae6d715b74a
+R 735093e69dd7362edf05f8837215e3f4
 U dan
-Z 30ab9b4c4efed643a26b238b5eccdd20
+Z 4c802a239f2e7bc26c443feae4434d58
index 978fb4c1ceabddbc3bb51bce395ee3bec69d3bf4..05e5ed69478164c44cd491527e6a46cd5d584c39 100644 (file)
@@ -1 +1 @@
-10ca7357b27d0657127d553738be3ae6d715b74a
\ No newline at end of file
+c80bbf14b365d2131210a849f26a69a5ea15101d
\ No newline at end of file
index 2eba0cf92cdcacba41089330fcd2140bb0edbfd3..be490e923a323c8ffaba7b4eb8b01ea4c9e31feb 100644 (file)
@@ -559,31 +559,12 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
   */
   assert( pTable!=0 );
   if( (v = sqlite3GetVdbe(pParse))!=0 ){
-    int base;
-    static const int iLn = VDBE_OFFSET_LINENO(2);
-    static const VdbeOpList dropTrigger[] = {
-      { OP_Rewind,     0, ADDR(9),  0},
-      { OP_String8,    0, 1,        0}, /* 1 */
-      { OP_Column,     0, 1,        2},
-      { OP_Ne,         2, ADDR(8),  1},
-      { OP_String8,    0, 1,        0}, /* 4: "trigger" */
-      { OP_Column,     0, 0,        2},
-      { OP_Ne,         2, ADDR(8),  1},
-      { OP_Delete,     0, 0,        0},
-      { OP_Next,       0, ADDR(1),  0}, /* 8 */
-    };
-
-    sqlite3BeginWriteOperation(pParse, 0, iDb);
-    sqlite3OpenMasterTable(pParse, iDb);
-    base = sqlite3VdbeAddOpList(v,  ArraySize(dropTrigger), dropTrigger, iLn);
-    sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT);
-    sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC);
+    sqlite3NestedParse(pParse,
+       "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'",
+       db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pTrigger->zName
+    );
     sqlite3ChangeCookie(pParse, iDb);
-    sqlite3VdbeAddOp2(v, OP_Close, 0, 0);
     sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0);
-    if( pParse->nMem<3 ){
-      pParse->nMem = 3;
-    }
   }
 }
 
index f3598a9496bd8a4a972453c03219b4f4539619e8..901b4886fdb4b89ee48995dbbab08e383d210a85 100644 (file)
@@ -139,7 +139,55 @@ do_execsql_test 4.12 {
   PRAGMA integrity_check;
 } {ok}
 
+#-------------------------------------------------------------------------
+# Further tests for DELETE statements that use the OR optimization.
+#
+array unset -nocomplain res
+foreach {tn tbl} {
+  0 { CREATE TABLE t5(i INTEGER, a, b, c) }
+  1 { 
+    CREATE TABLE t5(i INTEGER PRIMARY KEY, a, b, c);
+    CREATE INDEX t5a ON t5(a);
+    CREATE INDEX t5bc ON t5(b, c);
+    CREATE INDEX t5c ON t5(c);
+  }
+  2 { 
+    CREATE TABLE t5(i INT PRIMARY KEY, a, b, c) WITHOUT ROWID;
+    CREATE INDEX t5a ON t5(a);
+    CREATE INDEX t5bc ON t5(b, c);
+    CREATE INDEX t5c ON t5(c);
+  }
+} {
+  do_test 5.$tn.0 {
+    execsql { DROP TABLE IF EXISTS t5 }
+    execsql $tbl
+
 
+    for {set i 1} {$i <= 100} {incr i} {
+      set a [expr $i*2]
+      set b [expr ($i*7 % 100)]
+      set c [expr 100-$i]
+      execsql { INSERT INTO t5 VALUES($i, $a, $b, $c) }
+    }
+  } {}
 
+  foreach {tn2 sql} {
+    1 { DELETE FROM t5 WHERE a=4 OR b=10 OR c=17 }
+    2 { DELETE FROM t5 WHERE (a=4 OR b=22) AND c=98 }
+  } {
+    execsql BEGIN
+    execsql $sql
+    do_execsql_test 5.$tn.$tn2.1 { PRAGMA integrity_check } ok
+    if {$tn==0} { 
+      set res($tn2) [db eval { SELECT count(*), md5sum(i, a, b, c) FROM t5 }]
+    }
+
+    do_execsql_test 5.$tn.$tn2.2 { 
+      SELECT count(*), md5sum(i, a, b, c) FROM t5 
+    } $res($tn2)
+     
+    execsql ROLLBACK
+  }
+}
 
 finish_test
index e24e3b9ed4045ecde79a04b48078d95e117c66a8..9f4a0959faa696a1dc5fe5f00d0e26d7e5f5ef57 100644 (file)
@@ -834,6 +834,16 @@ do_execsql_test table-19.1 {
   SELECT name FROM t19 ORDER BY name;
 } {{} savepoint t10 t11 t12 t13 t16 t2 t3 t3\"xyz t4\"abc t7 t8 t9 tablet8 test1 weird}
 
+# At one point the DROP TABLE in the following was causing problems on an
+# experimental branch.
+#
+do_execsql_test 20.0 {
+  CREATE TABLE t20(a PRIMARY KEY, b, c);
+  CREATE TRIGGER tr6 AFTER INSERT ON t20 BEGIN SELECT 1+1+1; END;
+  ANALYZE;
+  DROP TABLE t20;
+  SELECT name FROM sqlite_master
+} {sqlite_stat1 sqlite_stat4}
 
 
 finish_test