]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance SQLITE_LIMIT_TRIGGER_DEPTH so that it also limits a chain of
authordrh <>
Mon, 15 Jun 2026 16:45:35 +0000 (16:45 +0000)
committerdrh <>
Mon, 15 Jun 2026 16:45:35 +0000 (16:45 +0000)
distinct triggers during code generation.
[bugs:/info/2026-06-15T06:44:07Z|Bug 2026-06-15T06:44:07Z].

FossilOrigin-Name: 0b5378678e3d095ef982bb3b5d5ad05dfb15ce4ee12170b8d0a83fa4b75404c0

manifest
manifest.uuid
src/trigger.c
test/triggerC.test

index bdd1c29d7ae08b3c8b896493adad47f523b7c091..0fab9eede13172df5bffec7f8cd63bb4b45652ae 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\sthe\sPACKAGE_BUGREPORT\sconfig\soption\spoint\sto\s/bugs\sinstead\sof\s/forum.
-D 2026-06-15T15:48:40.602
+C Enhance\sSQLITE_LIMIT_TRIGGER_DEPTH\sso\sthat\sit\salso\slimits\sa\schain\sof\ndistinct\striggers\sduring\scode\sgeneration.\n[bugs:/info/2026-06-15T06:44:07Z|Bug\s2026-06-15T06:44:07Z].
+D 2026-06-15T16:45:35.881
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -798,7 +798,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c 85d8b9f05f78211c61e3739ab5db761d7118766d1916ae7f2764735106bc4e13
 F src/tokenize.c e9d52d9f7374d82dadcd11726bea8a597d43709d6672704f3f0375bf1d726912
 F src/treeview.c feaa59f14db4f7b5aacca9c5ad5aeb562c1f98262c1ffd74371f4186ade91fc5
-F src/trigger.c 4bf3bfb3851d165e4404a9f9e69357345f3f7103378c07e07139fdd8aeb7bd20
+F src/trigger.c 5028874dd1f4fd3085bacd55c30114b5ad651525508656f65af09adf227181d5
 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
 F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549
 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
@@ -1906,7 +1906,7 @@ F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4
 F test/trigger9.test 1724b595661da3dd3c8d79f0ebae818132a39e65c241bad2049f66952b1dc29d
 F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d
 F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
-F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51
+F test/triggerC.test 84866f8bd91d2bcecc7c617a42a7fe01338793d9d080171eeb6f68241db357e2
 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
 F test/triggerE.test 612969cb57a4ef792059ad6d01af0117e1ae862c283753ffcc9a6428642b22ee
 F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
@@ -2208,8 +2208,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 71334f7ec95edc91138b51ef6fe455a4a8c1db130484237eb241956bc549aa5c
-R 66eed469c07839a637ca4dc75062fa04
-U stephan
-Z 1b1f6a40dc056c16055a60a05e07899e
+P ca15fedede9873b5f72f29f7cd33cba294cd49593999fc952670e2d5ce7ec86e
+R bf8e6597a6079302c7a35e3e3d1ae4df
+U drh
+Z 9ddbae7a753a72b31a9b42ccf6537064
 # Remove this line to create a well-formed Fossil manifest.
index f519d9b3b72fc6e46fbfebd54716f7569837f04b..7815a4bf533df675c0e7234596725c499ee6ae93 100644 (file)
@@ -1 +1 @@
-ca15fedede9873b5f72f29f7cd33cba294cd49593999fc952670e2d5ce7ec86e
+0b5378678e3d095ef982bb3b5d5ad05dfb15ce4ee12170b8d0a83fa4b75404c0
index 4f9068ad80ac739aba814e785b528b88670f11a8..6ac9c1ffdbf77aade44ee2b54d67563cb7740b92 100644 (file)
@@ -1234,7 +1234,7 @@ static TriggerPrg *codeRowTrigger(
   Table *pTab,         /* The table pTrigger is attached to */
   int orconf           /* ON CONFLICT policy to code trigger program with */
 ){
-  Parse *pTop = sqlite3ParseToplevel(pParse);
+  Parse *pTop;                /* Top level Parse object */
   sqlite3 *db = pParse->db;   /* Database handle */
   TriggerPrg *pPrg;           /* Value to return */
   Expr *pWhen = 0;            /* Duplicate of trigger WHEN expression */
@@ -1243,10 +1243,24 @@ static TriggerPrg *codeRowTrigger(
   SubProgram *pProgram = 0;   /* Sub-vdbe for trigger program */
   int iEndTrigger = 0;        /* Label to jump to if WHEN is false */
   Parse sSubParse;            /* Parse context for sub-vdbe */
+  int nDepth;                 /* Trigger depth */
+
+  /* Ensure that triggers are not chained too deep.  This test is linear
+  ** in the chaining depth, but sensible code ought not be chaining
+  ** triggers excessively, so that shouldn't be a problem.
+  */  
+  pTop = pParse;
+  for(nDepth=0; pTop->pOuterParse; pTop = pTop->pOuterParse, nDepth++){}
+  if( nDepth>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
+    sqlite3ErrorMsg(pParse, "triggers nested too deep");
+    return 0;
+  }
 
+  pTop = sqlite3ParseToplevel(pParse);
   assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
   assert( pTop->pVdbe );
 
+
   /* Allocate the TriggerPrg and SubProgram objects. To ensure that they
   ** are freed if an error occurs, link them into the Parse.pTriggerPrg 
   ** list of the top-level Parse object sooner rather than later.  */
index a2a06038737c0195acad8381dbddb750c41e58ec..56c1e46c3dac8580aef02a9a49e216041bc31337 100644 (file)
@@ -1070,5 +1070,43 @@ do_catchsql_test 17.1 {
   INSERT INTO xyz VALUES('hello', 2, 3);
 } {1 {datatype mismatch}}
 
+# Bug 2026-06-15T06:44:07Z
+#
+reset_db
+execsql { PRAGMA recursive_triggers = on }
+do_execsql_test 18.1 {
+  CREATE TABLE t1(a);
+  CREATE TABLE t2(b);
+  CREATE TABLE t3(c);
+  CREATE TABLE t4(d);
+  CREATE TABLE t5(e);
+  CREATE TABLE t6(f);
+  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
+    INSERT INTO t2 VALUES(new.a);
+  END;
+  CREATE TRIGGER r2 AFTER INSERT ON t2 BEGIN
+    INSERT INTO t3 VALUES(new.b);
+  END;
+  CREATE TRIGGER r3 AFTER INSERT ON t3 BEGIN
+    INSERT INTO t4 VALUES(new.c);
+  END;
+  CREATE TRIGGER r4 AFTER INSERT ON t4 BEGIN
+    INSERT INTO t5 VALUES(new.d);
+  END;
+  CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
+    INSERT INTO t6 VALUES(new.e);
+  END;
+}
+do_execsql_test 18.2 {
+  INSERT INTO t1(a) VALUES(1);
+  SELECT f FROM t6;
+} {1}
+sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 4
+do_catchsql_test 18.3 {
+  INSERT INTO t1(a) VALUES(2);
+} {1 {triggers nested too deep}}
+
+
+
 
 finish_test