]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add OOM tests for the new code on this branch.
authordan <dan@noemail.net>
Thu, 30 Apr 2020 18:28:40 +0000 (18:28 +0000)
committerdan <dan@noemail.net>
Thu, 30 Apr 2020 18:28:40 +0000 (18:28 +0000)
FossilOrigin-Name: e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282

manifest
manifest.uuid
src/build.c
src/update.c
test/upfrom2.test
test/upfromfault.test [new file with mode: 0644]

index f4649ed808b1df54ab74c64e70336846de96d8eb..abb28b264089e4cfc8d0a0a94f9e37175863f2fe 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Report\san\serror\sif\san\sUPDATE...FROM\sstatement\shas\san\sORDER\sBY\sbut\sno\sLIMIT\sclause.\sAdd\stests\sfor\smulti-column\sprimary\skeys.
-D 2020-04-30T15:49:56.938
+C Add\sOOM\stests\sfor\sthe\snew\scode\son\sthis\sbranch.
+D 2020-04-30T18:28:40.716
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -476,7 +476,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 02376eb7d49ccf31b53c2504f045ad74687c142a5c15ca837516e59e737867dc
 F src/btree.h 32672fa1aa74a7e9ab3aae822f94ffc8e732b1eb005988dc2283f91dc7573398
 F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0
-F src/build.c 8debc951e3f7e5152bbb7e6b2f26cad7b00a1db068c69af7db4aab136486e541
+F src/build.c d43ee335c3efc4005b4dcd07aecd1f9e231c10320fe8f65b0bf81f0b4b98eace
 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90
@@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc
 F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742
 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04
-F src/update.c 0f27f4b1128a447df648ba458b08dc119d0974af052a555e038dcce27f7a4bf6
+F src/update.c 2f63f9e13c34e4f9fc238e769d8879697d905e542d2e6f9a7a68ea1a5289c631
 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78
 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7
 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118
@@ -1618,7 +1618,8 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473
 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3
 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e
 F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9
-F test/upfrom2.test cbf5e1cb5066c9c04034ccb7a937f10a752ee7291670a1fdb4218aedcdaa960e
+F test/upfrom2.test 1dded7ed03e8b335b7ac38f9d70b60380df9049ea13076832ab86fd5b78b4926
+F test/upfromfault.test 1e68cc570695a0f8cd16ce09c14210fc43928c7b47b3eda38a99abb0b80c9a65
 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18
 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09
 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c
@@ -1865,7 +1866,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 b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d
-R 8112d214c23c0825cafbe3ae9671b4b5
+P ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65
+R 9834e1157ceceff37925bd1917b38659
 U dan
-Z 00088545d453cb111fa959dd326ff545
+Z 98f1c8c70109f9d7189dd668536b4270
index 4460169f93ff901cc81131185d586b57a25ffb6c..f197462623e3b3ca9fb17fadbb8eb5c0a79ce344 100644 (file)
@@ -1 +1 @@
-ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65
\ No newline at end of file
+e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282
\ No newline at end of file
index f0136cbe800d5b9e8021f976e734722d0fa463e5..c9396708ddb7168aba10691b9b0e4a1375e3dbed 100644 (file)
@@ -4501,15 +4501,15 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
 ** are deleted by this function.
 */ 
 SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2){
-  if( p2 && p1 ){
-    assert( p1->nSrc==1 );
-    p1 = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, p1->nSrc);
-    if( p1 ){
-      assert( p1->nSrc==1+p2->nSrc );
+  assert( p1 && p1->nSrc==1 );
+  if( p2 ){
+    SrcList *pNew = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, 1);
+    if( pNew==0 ){
+      sqlite3SrcListDelete(pParse->db, p2);
+    }else{
+      p1 = pNew;
       memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(struct SrcList_item));
       sqlite3_free(p2);
-    }else{
-      sqlite3SrcListDelete(pParse->db, p2);
     }
   }
   return p1;
index fa80a7da85bab59b6a8eb20842bdbfe902459361..0b98e70174ddd0dab6429d12a312766f9f21c12f 100644 (file)
@@ -229,10 +229,13 @@ static void updatePopulateEphTable(
       );
     }
   }
-  for(i=0; i<pChanges->nExpr; i++){
-    pList = sqlite3ExprListAppend(pParse, pList, 
-        sqlite3ExprDup(db, pChanges->a[i].pExpr, 0)
-    );
+  assert( pChanges || db->mallocFailed );
+  if( pChanges ){
+    for(i=0; i<pChanges->nExpr; i++){
+      pList = sqlite3ExprListAppend(pParse, pList, 
+          sqlite3ExprDup(db, pChanges->a[i].pExpr, 0)
+      );
+    }
   }
   pSelect = sqlite3SelectNew(
       pParse, pList, pSrc, pWhere2, pGroupBy, 0, pOrderBy2, 0, pLimit2
index de9610e6afd0611224009fc8927815425a8bc2d5..e9bf5eb504252ece56da6f6ae5fdb8c774fc80b3 100644 (file)
@@ -289,6 +289,31 @@ eval [string map [list %WO% $wo %TN% $tn] {
 }]
 }}
 
+reset_db
+do_execsql_test 3.0 {
+  CREATE TABLE data(x, y, z);
+  CREATE VIEW t1 AS SELECT * FROM data;
+  CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN
+    INSERT INTO data VALUES(new.x, new.y, new.z);
+  END;
+  CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN
+    INSERT INTO log VALUES(old.z || '->' || new.z);
+  END;
+
+  CREATE TABLE log(t TEXT);
+
+  INSERT INTO t1 VALUES(1, 'i',   'one');
+  INSERT INTO t1 VALUES(2, 'ii',  'two');
+  INSERT INTO t1 VALUES(3, 'iii', 'three');
+  INSERT INTO t1 VALUES(4, 'iv',  'four');
+}
+
+do_execsql_test 3.1 {
+  WITH input(k, v) AS (
+      VALUES(3, 'thirty'), (1, 'ten')
+  )
+  UPDATE t1 SET z=v FROM input WHERE x=k;
+}
 
 finish_test
 
diff --git a/test/upfromfault.test b/test/upfromfault.test
new file mode 100644 (file)
index 0000000..2645857
--- /dev/null
@@ -0,0 +1,94 @@
+# 2020 April 29
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix upfromfault
+
+foreach {tn sql} {
+  1 {
+    CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE);
+    CREATE INDEX t1y ON t1(y);
+  }
+  2 {
+    CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE) WITHOUT ROWID;
+    CREATE INDEX t1y ON t1(y);
+  }
+  3 {
+    CREATE TABLE t1(x, y, z UNIQUE, PRIMARY KEY(x,y)) WITHOUT ROWID;
+  }
+  4 {
+    CREATE VIRTUAL TABLE t1 USING fts5(x, y, z);
+  }
+  5 {
+    CREATE TABLE real(x, y, z);
+    CREATE VIEW t1 AS SELECT * FROM real;
+    CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN
+      INSERT INTO real VALUES(new.x, new.y, new.z);
+    END;
+    CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN
+      INSERT INTO log VALUES(old.z || '->' || new.z);
+      UPDATE real SET y=new.y, z=new.z WHERE x=old.x;
+    END;
+  }
+} {
+if {$tn<5} continue
+  reset_db
+
+  ifcapable !fts5 { if {$tn==4} continue }
+
+  execsql $sql
+  do_execsql_test 1.$tn.0 {
+    CREATE TABLE log(t TEXT);
+
+    INSERT INTO t1 VALUES(1, 'i',   'one');
+    INSERT INTO t1 VALUES(2, 'ii',  'two');
+    INSERT INTO t1 VALUES(3, 'iii', 'three');
+    INSERT INTO t1 VALUES(4, 'iv',  'four');
+  }
+  if {$tn!=4 && $tn!=5} {
+    do_execsql_test 1.$tn.0b {
+      CREATE TRIGGER tr1 BEFORE UPDATE ON t1 BEGIN
+        INSERT INTO log VALUES(old.z || '->' || new.z);
+      END;
+      CREATE TRIGGER tr2 AFTER UPDATE ON t1 BEGIN
+        INSERT INTO log VALUES(old.y || '->' || new.y);
+      END;
+    }
+  }
+  
+  faultsim_save_and_close
+
+  do_faultsim_test 1.$tn -prep {
+    faultsim_restore_and_reopen
+    execsql { SELECT * FROM t1 }
+  } -body {
+    execsql {
+      WITH data(k, v) AS (
+          VALUES(3, 'thirty'), (1, 'ten')
+      )
+      UPDATE t1 SET z=v FROM data WHERE x=k;
+    }
+  } -test {
+    faultsim_test_result {0 {}} {1 {vtable constructor failed: t1}}
+    if {$testrc==0} {
+      set res [execsql { SELECT * FROM t1 }]
+      if {$res!="1 i ten 2 ii two 3 iii thirty 4 iv four"} {
+        error "unexpected result: $res"
+      }
+    }
+  }
+}
+
+
+finish_test
+