From 66dbfda34c413bc5d71ed98bf7b942496d85ea8d Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 18 Aug 2026 10:14:28 +0000 Subject: [PATCH] Limit the number of nested RIGHT JOINs (or FULL JOINs) that can occur in a single query. FossilOrigin-Name: 81561e928514b27f2c4dd3a8b174b02b936cdd3ac73746c1066e822a5cedd278 --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/wherecode.c | 10 +++++++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 0a9653975b..1bb239a0eb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Limit\sthe\snumber\sof\sstatements\sin\sa\strigger\sto\s65000. -D 2026-08-18T09:23:44.292 +C Limit\sthe\snumber\sof\snested\sRIGHT\sJOINs\s(or\sFULL\sJOINs)\sthat\scan\soccur\nin\sa\ssingle\squery. +D 2026-08-18T10:14:28.860 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -824,7 +824,7 @@ F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c a1caeb656f74e58de7e7310ee91c6dfb40e975c7dd9b18e61a965aea46a610f2 F src/whereInt.h 8d94cb116c9e06205c3d5ac87af065fc044f8cf08bfdccd94b6ea1c1308e65da -F src/wherecode.c bc39ccbe3648f01157038b16cc55bdbff128590972b7185521b5526dc2815765 +F src/wherecode.c 989a7f1c7a5b441e215ae7b18de8dd20fd0cb66199dafe0dd5f62003f1a0cf57 F src/whereexpr.c a1e22cf9f6cb59770d9652c757dcf1924078ad2d48a9da89e254be9327677465 F src/window.c 0d7dacdf2e84c6ee8ff498d5cc881dd245fcb2f14f6c5976e97e112ce96e90dc F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -2206,8 +2206,9 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 14be580d240496f1615dad42c5442443c0629f3aff6ba8ac77485992d5e8d625 -R 545810402ddce0dd033c371b0fa28b76 +P ed8d4fd91e6db4da342ac77282a15a95977e91db81f5a3fd204e6733d1eb262c +Q +003ed951d85416da97f5cabf96d89b974279bd8ef2433ae1987bdedad38a4b90 +R 035cff872fb437e512f839575530c1de U drh -Z 71813247949fb2820f27e78535db2809 +Z 2e2cb7e4eafe7a338100dddfe8bd930c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 77da872102..c87cc3f3ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed8d4fd91e6db4da342ac77282a15a95977e91db81f5a3fd204e6733d1eb262c +81561e928514b27f2c4dd3a8b174b02b936cdd3ac73746c1066e822a5cedd278 diff --git a/src/wherecode.c b/src/wherecode.c index 8a1a593c70..5c2fe215cf 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2914,7 +2914,15 @@ SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( pFrom->nAlloc = 1; memcpy(&pFrom->a[0], pTabItem, sizeof(SrcItem)); pFrom->a[0].fg.jointype = 0; - assert( pParse->withinRJSubrtn < 100 ); + if( pParse->withinRJSubrtn >= 100 ){ + /* This limit --------------^^^ + ** is based on an historical assert(). It is not compile-time or + ** run-time configurable. It could perhaps be raised as high as 254, + ** but only an attack robot would ever do even 100 RIGHT JOINS within + ** a single query, so we'll just leave it as it is. */ + sqlite3ErrorMsg(pParse, "too many RIGHT JOINs"); + return; + } pParse->withinRJSubrtn++; pSubWInfo = sqlite3WhereBegin(pParse, pFrom, pSubWhere, 0, 0, 0, WHERE_RIGHT_JOIN, 0);