-C Merge\slatest\strunk\swith\sthis\sbranch.
-D 2025-11-11T14:57:12.131
+C Add\sfurther\stest\scases\sfor\stemp\striggers\sto\sthis\sbranch.
+D 2025-11-11T16:50:31.785
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d1631311a16
F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
-F test/temptrigger.test 62c0d29ff3fb7fa40c136dcfac3d992c5a6d3b1699459e65a4c1d0feb1258120
+F test/temptrigfault.tes fc5918e64f3867156fefe7cfca9d8e1f495134a5229b2b511b0dc11c07f2eab4
+F test/temptrigger.test a00f258ed8d21a0e8fd4f322f15e8cfb5cef2e43655670e07a753e3fb4769d61
F test/tester.tcl 463ae33b8bf75ac77451df19bd65e7c415c2e9891227c7c9e657d0a2d8e1074a
F test/testloadext.c 862b848783eaed9985fbce46c65cd214664376b549fae252b364d5d1ef350a27
F test/testrunner.tcl 86179a8e78997e9257cb8f738c5624cb23897da5297855578ba74715e64f1602 x
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 0b849623f855ae6a8150a85249b25aa43109ae063f7b4a42a9c77b2838bf5708 2c31176607f02a73cf2626cda2dd0711ae74bdf0b4520d4c84ff299c860e419e
-R a56a99e779d31aeb932a4de2782e2a61
+P 68c8d04c39ce4a9f3534807fa75c6245628b8c69f57a22c5e17906134d5509e9
+R d67008a2285b4d7f4d4aaaac8c56cde1
U dan
-Z a367ae9c9f59cf57d85093da50a77a81
+Z 8e8813a92e96126540886525585fa739
# Remove this line to create a well-formed Fossil manifest.
-68c8d04c39ce4a9f3534807fa75c6245628b8c69f57a22c5e17906134d5509e9
+c33899c09b7c998b95230678b0c71342b2a270557b8631788eb56c389ece2849
--- /dev/null
+# 2025 November 11
+#
+# 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 temptrigfault
+
+forcedelete test.db2
+do_execsql_test 1.0 {
+ CREATE TABLE t1(x, y);
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE aux.t1(x, y);
+}
+
+do_faultsim_test 1.1 -faults oom* -prep {
+} -body {
+ execsql {
+ CREATE TEMP TRIGGER tmptrig AFTER INSERT ON t1 BEGIN
+ INSERT INTO aux.t1 VALUES(new.x, new.y);
+ END;
+ }
+} -test {
+ faultsim_test_result {0 {}}
+ catchsql { DROP TRIGGER tmptrig }
+}
+
+do_execsql_test 2.0 {
+ CREATE TEMP TRIGGER tmptrig AFTER INSERT ON t1 BEGIN
+ INSERT INTO aux.t1 VALUES(new.x, new.y);
+ END;
+}
+
+do_faultsim_test 2 -faults oom* -prep {
+} -body {
+ execsql {
+ INSERT INTO t1 VALUES('x', 'y');
+ }
+} -test {
+ faultsim_test_result {0 {}}
+}
+
+do_execsql_test 3.0.1 {
+ SELECT * FROM t1;
+ DELETE FROM t1;
+ DELETE FROM aux.t1;
+} [db eval {SELECT * FROM aux.t1}]
+
+do_execsql_test 3.0.2 {
+ CREATE TEMP TRIGGER tmptrig2 AFTER INSERT ON aux.t1 BEGIN
+ INSERT INTO t1 VALUES(new.x||'2', new.y||'2');
+ END;
+}
+
+do_faultsim_test 3 -faults oom* -prep {
+} -body {
+ execsql {
+ INSERT INTO aux.t1 VALUES('aaa', 'bbb');
+ }
+} -test {
+ faultsim_test_result {0 {}}
+}
+
+proc repeatlist {list n} {
+ set ret [list]
+ for {set i 0} {$i < $n} {incr i} {
+ set ret [concat $ret $list]
+ }
+ set ret
+}
+
+do_execsql_test 3.x.1 {
+ SELECT * FROM main.t1;
+} [repeatlist {aaa2 bbb2} 5]
+
+do_execsql_test 3.x.2 {
+ SELECT * FROM aux.t1;
+} [repeatlist {aaa bbb aaa2 bbb2} 5]
+
+faultsim_save_and_close
+do_faultsim_test 4 -faults oom* -prep {
+ faultsim_restore_and_reopen
+ execsql { ATTACH 'test.db2' AS aux; }
+} -body {
+ execsql {
+ CREATE TEMP TRIGGER xyz AFTER DELETE ON main.t1 BEGIN
+ DELETE FROM aux.t1 WHERE rowid=old.rowid;
+ END;
+
+ DELETE FROM t1 WHERE rowid=2;
+ }
+} -test {
+ faultsim_test_result {0 {}} {1 {unable to open a temporary database file for storing temporary tables}}
+}
+
+faultsim_save_and_close
+do_faultsim_test 5 -faults oom* -prep {
+ faultsim_restore_and_reopen
+ execsql { ATTACH 'test.db2' AS aux; }
+} -body {
+ execsql {
+ CREATE TEMP TRIGGER xyz AFTER UPDATE ON aux.t1 BEGIN
+ UPDATE main.t1 SET x=new.x, y=new.y WHERE rowid=new.rowid;
+ END;
+ UPDATE aux.t1 SET x=x||x WHERE rowid=1+abs(random() % 5);
+ }
+} -test {
+ faultsim_test_result {0 {}} {1 {unable to open a temporary database file for storing temporary tables}}
+}
+
+
+finish_test
# Check that temp triggers may INSERT/UPDATE/DELETE to fully qualified
# table names.
reset_db
+forcedelete {*}[glob -nocomplain *mj*]
forcedelete test.db2
do_execsql_test 8.0 {
ATTACH 'test.db2' AS aux;
do_execsql_test 8.3.3 { SELECT * FROM t1 } {a b}
+#-------------------------------------------------------------------------
+reset_db
+set nDb 8
+do_test 9.0 {
+ for {set ii 0} {$ii < $nDb} {incr ii} {
+ db eval "ATTACH ':memory:' AS db$ii"
+ db eval "CREATE TABLE db$ii.tbl(a, b, c)"
+ }
+
+ for {set ii 0} {$ii < ($nDb-1)} {incr ii} {
+ set jj [expr $ii+1]
+ db eval "
+ CREATE TEMP TRIGGER tr$ii AFTER INSERT ON db$ii.tbl BEGIN
+ INSERT INTO db$jj.tbl VALUES(new.b, new.c, new.a);
+ END;
+ "
+ }
+} {}
+
+do_execsql_test 9.1 { INSERT INTO db0.tbl VALUES('a', 'b', 'c'); }
+do_execsql_test 9.1.1 { SELECT * FROM db0.tbl } {a b c}
+do_execsql_test 9.1.2 { SELECT * FROM db1.tbl } {b c a}
+do_execsql_test 9.1.3 { SELECT * FROM db2.tbl } {c a b}
+do_execsql_test 9.1.1 { SELECT * FROM db3.tbl } {a b c}
+do_execsql_test 9.1.2 { SELECT * FROM db4.tbl } {b c a}
+do_execsql_test 9.1.3 { SELECT * FROM db5.tbl } {c a b}
+do_execsql_test 9.1.1 { SELECT * FROM db6.tbl } {a b c}
+do_execsql_test 9.1.2 { SELECT * FROM db7.tbl } {b c a}
+
+do_test 9.2 {
+ for {set ii 0} {$ii < ($nDb-1)} {incr ii} {
+ set jj [expr $ii+1]
+ db eval "
+ CREATE TEMP TRIGGER tru$ii AFTER UPDATE ON db$ii.tbl BEGIN
+ UPDATE db$jj.tbl SET a=new.b, b=new.c, c=new.a;
+ END;
+ "
+ }
+} {}
+
+do_execsql_test 9.3 { UPDATE db0.tbl SET a=1, b=2, c=3 }
+do_execsql_test 9.3.1 { SELECT * FROM db0.tbl } {1 2 3}
+do_execsql_test 9.3.2 { SELECT * FROM db1.tbl } {2 3 1}
+do_execsql_test 9.3.3 { SELECT * FROM db2.tbl } {3 1 2}
+do_execsql_test 9.3.1 { SELECT * FROM db3.tbl } {1 2 3}
+do_execsql_test 9.3.2 { SELECT * FROM db4.tbl } {2 3 1}
+do_execsql_test 9.3.3 { SELECT * FROM db5.tbl } {3 1 2}
+do_execsql_test 9.3.1 { SELECT * FROM db6.tbl } {1 2 3}
+do_execsql_test 9.3.2 { SELECT * FROM db7.tbl } {2 3 1}
+
+do_test 9.4 {
+ for {set ii 0} {$ii < ($nDb-1)} {incr ii} {
+ set jj [expr $ii+1]
+ db eval "
+ CREATE TEMP TRIGGER trd$ii BEFORE DELETE ON db$ii.tbl BEGIN
+ DELETE FROM db$jj.tbl;
+ END;
+ "
+ }
+} {}
+
+do_execsql_test 9.5 { DELETE FROM db0.tbl }
+do_execsql_test 9.5.1 { SELECT * FROM db0.tbl } {}
+do_execsql_test 9.5.2 { SELECT * FROM db1.tbl } {}
+do_execsql_test 9.5.3 { SELECT * FROM db2.tbl } {}
+do_execsql_test 9.5.1 { SELECT * FROM db3.tbl } {}
+do_execsql_test 9.5.2 { SELECT * FROM db4.tbl } {}
+do_execsql_test 9.5.3 { SELECT * FROM db5.tbl } {}
+do_execsql_test 9.5.1 { SELECT * FROM db6.tbl } {}
+do_execsql_test 9.5.2 { SELECT * FROM db7.tbl } {}
+
finish_test