Skip to content

Commit fc0d962

Browse files
author
D. Richard Hipp
committed
Check-in [a9657c87c53c1922] is wrong: the IndexedExpr.bMaybeNullRow flag is
required for virtual columns if they are part of an outer join. Add a test case (derived from dbsqlfuzz b9e65e2f110df998f1306571fae7af6c01e4d92b) to prove it.
1 parent eb0665c commit fc0d962

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/where.c

+1-7
Original file line numberDiff line numberDiff line change
@@ -5948,16 +5948,10 @@ static SQLITE_NOINLINE void whereAddIndexedExpr(
59485948
for(i=0; i<pIdx->nColumn; i++){
59495949
Expr *pExpr;
59505950
int j = pIdx->aiColumn[i];
5951-
int bMaybeNullRow;
59525951
if( j==XN_EXPR ){
59535952
pExpr = pIdx->aColExpr->a[i].pExpr;
5954-
testcase( pTabItem->fg.jointype & JT_LEFT );
5955-
testcase( pTabItem->fg.jointype & JT_RIGHT );
5956-
testcase( pTabItem->fg.jointype & JT_LTORJ );
5957-
bMaybeNullRow = (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0;
59585953
}else if( j>=0 && (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL)!=0 ){
59595954
pExpr = sqlite3ColumnExpr(pTab, &pTab->aCol[j]);
5960-
bMaybeNullRow = 0;
59615955
}else{
59625956
continue;
59635957
}
@@ -5989,7 +5983,7 @@ static SQLITE_NOINLINE void whereAddIndexedExpr(
59895983
p->iDataCur = pTabItem->iCursor;
59905984
p->iIdxCur = iIdxCur;
59915985
p->iIdxCol = i;
5992-
p->bMaybeNullRow = bMaybeNullRow;
5986+
p->bMaybeNullRow = (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0;
59935987
if( sqlite3IndexAffinityStr(pParse->db, pIdx) ){
59945988
p->aff = pIdx->zColAff[i];
59955989
}

test/joinH.test

+32
Original file line numberDiff line numberDiff line change
@@ -309,4 +309,36 @@ do_execsql_test 12.3 {
309309
SELECT * FROM t1 LEFT JOIN t2 ON true RIGHT JOIN t3 ON d2=e3 WHERE c2 BETWEEN NULL AND a1;
310310
}
311311

312+
#-------------------------------------------------------------------------
313+
# 2024-04-05 dbsqlfuzz b9e65e2f110df998f1306571fae7af6c01e4d92b
314+
reset_db
315+
do_execsql_test 13.1 {
316+
CREATE TABLE t1(a INT AS (b), b INT);
317+
INSERT INTO t1(b) VALUES(123);
318+
CREATE TABLE t2(a INT, c INT);
319+
SELECT a FROM t2 NATURAL RIGHT JOIN t1;
320+
} {123}
321+
do_execsql_test 13.2 {
322+
CREATE INDEX t1a ON t1(a);
323+
SELECT a FROM t2 NATURAL RIGHT JOIN t1;
324+
} {123}
325+
# Further tests of the same logic (indexes on expressions
326+
# used by RIGHT JOIN) from check-in ffe23af73fcb324d and
327+
# forum post https://sqlite.org/forum/forumpost/9b491e1debf0b67a.
328+
db null NULL
329+
do_execsql_test 13.3 {
330+
CREATE TABLE t3(a INT, b INT);
331+
CREATE UNIQUE INDEX t3x ON t3(a, a+b);
332+
INSERT INTO t3(a,b) VALUES(1,2),(4,8),(16,32),(4,80),(1,-300);
333+
CREATE TABLE t4(x INT, y INT);
334+
INSERT INTO t4(x,y) SELECT a, b FROM t3;
335+
INSERT INTO t4(x,y) VALUES(99,99);
336+
SELECT a1.a, sum( a1.a+a1.b ) FROM t3 AS a1 RIGHT JOIN t4 ON a=x
337+
GROUP BY a1.a ORDER BY 1;
338+
} {NULL NULL 1 -592 4 192 16 48}
339+
do_execsql_test 13.4 {
340+
SELECT sum( a1.a+a1.b ) FROM t3 AS a1 RIGHT JOIN t3 ON true
341+
GROUP BY a1.a ORDER BY 1;
342+
} {-1480 240 480}
343+
312344
finish_test

0 commit comments

Comments
 (0)