1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Ensure the join flags on the parent are set correctly when flattening UNION ALL sub-queries that include branches with RIGHT joins. Report [bugs:/info/2026-10-08T15:27:33Z | 2026-10-08T15:27:33Z].

FossilOrigin-Name: cfa69ea48a7aa379ee0c30ae81d2802da862d610f829c933e5eb358c23fc2b9d
This commit is contained in:
dan
2026-10-08 19:34:24 +00:00
parent d0fe192fa1
commit bfb858c596
4 changed files with 72 additions and 12 deletions

View File

@@ -1,5 +1,5 @@
C Disable\sthe\s"expr\sIN\s(const)"\sto\s"expr=const"\soptimization\sof\s"const"\shas\na\sCOLLATE\sclause,\sas\susing\sthe\scollating\son\s"="\swould\sgive\sthe\swrong\sanswer.\n[bugs:/info/2026-10-08T12:36:41Z|Bugs\s2026-10-08T12:36:41Z]
D 2026-10-08T19:06:55.671
C Ensure\sthe\sjoin\sflags\son\sthe\sparent\sare\sset\scorrectly\swhen\sflattening\sUNION\sALL\ssub-queries\sthat\sinclude\sbranches\swith\sRIGHT\sjoins.\sReport\s[bugs:/info/2026-10-08T15:27:33Z\s|\s2026-10-08T15:27:33Z].
D 2026-10-08T19:34:24.937
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -801,7 +801,7 @@ F src/printf.c 4bd228ed9e9346d558362be562757ee5eef6f9bf483b7f02751ca42cf95174d3
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 0e0990f60c93db38c735d85e5d1741130e72dd0670aec204b5a39118b53c8044
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 8d2e31c0a88c30aabea7acc5a5e1e20ae24481d55e9fb187d53313d3080e3fcf
F src/select.c f6ad8bbf82f21a32c68ce3d885f1a960469d48efde93f432f5ba680869ae64f6
F src/shell.c.in fbcaa24ae9fccd177e0fe5e19f9161babb47b8a0b27a9b7fd3df18b855abd3bb
F src/sqlite.h.in 884996e07cfb7681efc76661b79d56a93f9edaea7f6fc4a3c82636dc84783486
F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
@@ -1995,7 +1995,7 @@ F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac
F test/types3.test c60e89c4d6babe44b23a2ea0090f3044e549403b20648b1c6bb65a69fea5f1ed
F test/unhex.test b7f1b806207cb77fa31c3e434fe92fba524464e3e9356809bfcc28f15af1a8b7
F test/unionall.test 04d30726c5056f84f92b3a12bf8d8a1dbbe807d1ddc8af95def09e6ef2dd91e3
F test/unionall2.test 71e8fa08d5699d50dc9f9dc0c9799c2e7a6bb7931a330d369307a4df7f157fa1
F test/unionall2.test 144d4ba2da748e798eba64f109be3c69bbf35a74454c6d4db3176a4967df29a8
F test/unionallfault.test 652bfbb630e6c43135965dc1e8f0a9a791da83aec885d626a632fe1909c56f73
F test/unionvtab.test bc8f1d5807583dfc9b715da0d570766528fb5a878b0620e23af32a6b55cb437e
F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06
@@ -2281,8 +2281,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P 028a92f9c353d3b400551954de2e09c1723076491f79ff767dd24b452654fda8
R 01bba7e315445b9e0a0e452f1c130807
U drh
Z de0d1b2577c59af484e25d183db4f870
P 53a73aa03d05350ebee81c3d2aef85744c8ebeda72f565083dc4b472b57c5499
R fe57bd6c375f6e4dbf22be18e69cde3c
U dan
Z 6d721ddda04882419ca5fd3bd8136924
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
53a73aa03d05350ebee81c3d2aef85744c8ebeda72f565083dc4b472b57c5499
cfa69ea48a7aa379ee0c30ae81d2802da862d610f829c933e5eb358c23fc2b9d

View File

@@ -4671,7 +4671,7 @@ static int flattenSubquery(
pSub = pSub1;
for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
int nSubSrc;
u8 jointype = pSubitem->fg.jointype;
u8 jointype = pParent->pSrc->a[iFrom].fg.jointype;
assert( pSub!=0 );
pSubSrc = pSub->pSrc; /* FROM clause of subquery */
nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */
@@ -4696,7 +4696,6 @@ static int flattenSubquery(
pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1);
if( pSrc==0 ) break;
pParent->pSrc = pSrc;
pSubitem = &pSrc->a[iFrom];
}
/* Transfer the FROM clause terms from the subquery into the
@@ -4714,7 +4713,7 @@ static int flattenSubquery(
pItem->fg.jointype |= (jointype & JT_LTORJ);
memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
}
pSubitem->fg.jointype |= jointype;
pSrc->a[iFrom].fg.jointype |= jointype;
/* Begin substituting subquery result set expressions for
** references to the iParent in the outer query.

View File

@@ -53,6 +53,67 @@ do_execsql_test 2.2 {
)
}
#-------------------------------------------------------------------------
# https://sqlite.org/bugs/forumpost/b6e0cf3df3
#
reset_db
do_execsql_test 3.0 {
CREATE TABLE t0(c0);
CREATE TABLE t1(c0);
INSERT INTO t0 VALUES (NULL);
}
do_execsql_test 3.1 {
SELECT 5 FROM t0 WHERE (SELECT 0)
UNION ALL
SELECT 7 FROM t1 RIGHT JOIN t0 ON 0
} 7
do_execsql_test 3.2 {
SELECT * FROM (
SELECT 5 FROM t0 WHERE (SELECT 0)
UNION ALL
SELECT 7 FROM t1 RIGHT JOIN t0 ON 0
);
} {7}
do_execsql_test 3.3 {
SELECT * FROM (
SELECT c0 FROM t0
UNION ALL
SELECT a.c0 FROM t0 AS a RIGHT JOIN t0 AS b ON 0
)
} {{} {}}
do_execsql_test 3.4 {
SELECT * FROM (
SELECT c0 FROM t0
UNION ALL
SELECT a.c0 FROM t0 AS a RIGHT JOIN t0 AS b ON 0
) WHERE abs(c0)
} {}
do_execsql_test 3.5 {
CREATE TABLE t2(a, x); CREATE INDEX t2x ON t2(x);
CREATE TABLE t3(b, y); CREATE INDEX t3y ON t3(y);
CREATE TABLE t4(c, d); CREATE INDEX t4d ON t4(d);
}
do_eqp_test 3.6 {
SELECT * FROM t4 CROSS JOIN (
SELECT a, x FROM t2 UNION ALL SELECT b, y FROM t3
) AS s WHERE s.a=t4.d AND s.x=5;
} {
QUERY PLAN
`--COMPOUND QUERY
|--LEFT-MOST SUBQUERY
| |--SCAN t4
| `--SEARCH t2 USING INDEX t2x (x=?)
`--UNION ALL
|--SCAN t4
`--SEARCH t3 USING INDEX t3y (y=?)
}
finish_test