dan | 8b023cf | 2020-04-30 18:28:40 +0000 | [diff] [blame] | 1 | # 2020 April 29 |
| 2 | # |
| 3 | # The author disclaims copyright to this source code. In place of |
| 4 | # a legal notice, here is a blessing: |
| 5 | # |
| 6 | # May you do good and not evil. |
| 7 | # May you find forgiveness for yourself and forgive others. |
| 8 | # May you share freely, never taking more than you give. |
| 9 | # |
| 10 | #*********************************************************************** |
| 11 | # |
| 12 | |
| 13 | set testdir [file dirname $argv0] |
| 14 | source $testdir/tester.tcl |
| 15 | set testprefix upfromfault |
| 16 | |
| 17 | foreach {tn sql} { |
| 18 | 1 { |
| 19 | CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE); |
| 20 | CREATE INDEX t1y ON t1(y); |
| 21 | } |
| 22 | 2 { |
| 23 | CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE) WITHOUT ROWID; |
| 24 | CREATE INDEX t1y ON t1(y); |
| 25 | } |
| 26 | 3 { |
| 27 | CREATE TABLE t1(x, y, z UNIQUE, PRIMARY KEY(x,y)) WITHOUT ROWID; |
| 28 | } |
| 29 | 4 { |
| 30 | CREATE VIRTUAL TABLE t1 USING fts5(x, y, z); |
| 31 | } |
| 32 | 5 { |
| 33 | CREATE TABLE real(x, y, z); |
| 34 | CREATE VIEW t1 AS SELECT * FROM real; |
| 35 | CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN |
| 36 | INSERT INTO real VALUES(new.x, new.y, new.z); |
| 37 | END; |
| 38 | CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN |
| 39 | INSERT INTO log VALUES(old.z || '->' || new.z); |
| 40 | UPDATE real SET y=new.y, z=new.z WHERE x=old.x; |
| 41 | END; |
| 42 | } |
| 43 | } { |
| 44 | if {$tn<5} continue |
| 45 | reset_db |
| 46 | |
| 47 | ifcapable !fts5 { if {$tn==4} continue } |
| 48 | |
| 49 | execsql $sql |
| 50 | do_execsql_test 1.$tn.0 { |
| 51 | CREATE TABLE log(t TEXT); |
| 52 | |
| 53 | INSERT INTO t1 VALUES(1, 'i', 'one'); |
| 54 | INSERT INTO t1 VALUES(2, 'ii', 'two'); |
| 55 | INSERT INTO t1 VALUES(3, 'iii', 'three'); |
| 56 | INSERT INTO t1 VALUES(4, 'iv', 'four'); |
| 57 | } |
| 58 | if {$tn!=4 && $tn!=5} { |
| 59 | do_execsql_test 1.$tn.0b { |
| 60 | CREATE TRIGGER tr1 BEFORE UPDATE ON t1 BEGIN |
| 61 | INSERT INTO log VALUES(old.z || '->' || new.z); |
| 62 | END; |
| 63 | CREATE TRIGGER tr2 AFTER UPDATE ON t1 BEGIN |
| 64 | INSERT INTO log VALUES(old.y || '->' || new.y); |
| 65 | END; |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | faultsim_save_and_close |
| 70 | |
| 71 | do_faultsim_test 1.$tn -prep { |
| 72 | faultsim_restore_and_reopen |
| 73 | execsql { SELECT * FROM t1 } |
| 74 | } -body { |
| 75 | execsql { |
| 76 | WITH data(k, v) AS ( |
| 77 | VALUES(3, 'thirty'), (1, 'ten') |
| 78 | ) |
| 79 | UPDATE t1 SET z=v FROM data WHERE x=k; |
| 80 | } |
| 81 | } -test { |
| 82 | faultsim_test_result {0 {}} {1 {vtable constructor failed: t1}} |
| 83 | if {$testrc==0} { |
| 84 | set res [execsql { SELECT * FROM t1 }] |
| 85 | if {$res!="1 i ten 2 ii two 3 iii thirty 4 iv four"} { |
| 86 | error "unexpected result: $res" |
| 87 | } |
| 88 | } |
| 89 | } |
| 90 | } |
| 91 | |
dan | 01b2344 | 2020-07-16 10:48:37 +0000 | [diff] [blame] | 92 | reset_db |
| 93 | do_execsql_test 2.0 { |
| 94 | CREATE TABLE t1(a, b, c); |
| 95 | CREATE TABLE t2(x, y, z); |
| 96 | } |
| 97 | faultsim_save_and_close |
| 98 | do_faultsim_test 2.1 -prep { |
| 99 | faultsim_restore_and_reopen |
| 100 | } -body { |
| 101 | execsql { |
| 102 | CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN |
| 103 | UPDATE t2 SET x=a FROM t1 WHERE c=z; |
| 104 | END; |
| 105 | } |
| 106 | } -test { |
| 107 | faultsim_test_result {0 {}} |
| 108 | } |
| 109 | |
| 110 | faultsim_restore_and_reopen |
| 111 | do_execsql_test 2.2 { |
| 112 | CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN |
| 113 | UPDATE t1 SET a=x FROM t2 WHERE c=z; |
| 114 | END; |
| 115 | |
| 116 | INSERT INTO t2 VALUES(1, 1, 1); |
| 117 | INSERT INTO t2 VALUES(2, 2, 2); |
| 118 | INSERT INTO t2 VALUES(3, 3, 3); |
| 119 | } |
| 120 | faultsim_save_and_close |
| 121 | |
| 122 | do_faultsim_test 2.3 -prep { |
| 123 | faultsim_restore_and_reopen |
| 124 | } -body { |
| 125 | execsql { |
| 126 | INSERT INTO t1 VALUES(NULL, NULL, 1), (NULL, NULL, 3); |
| 127 | } |
| 128 | } -test { |
| 129 | faultsim_test_result {0 {}} |
| 130 | if {$testrc==0} { |
| 131 | set res [execsql { SELECT * FROM t1 }] |
| 132 | if {$res!="1 {} 1 3 {} 3"} { |
| 133 | error "unexpected result: $res" |
| 134 | } |
| 135 | } |
| 136 | } |
| 137 | |
dan | 8b023cf | 2020-04-30 18:28:40 +0000 | [diff] [blame] | 138 | |
| 139 | finish_test |