Index: src/where.c ================================================================== --- src/where.c +++ src/where.c @@ -3860,10 +3860,13 @@ if( iColumn==XN_ROWID ){ testcase( distinctColumns==0 ); distinctColumns = 1; } obSat |= MASKBIT(i); + if( (wctrlFlags & WHERE_ORDERBY_MIN) && j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_MIN_ORDERED; + } }else{ /* No match found */ if( j==0 || jpOrderBy==0 - || pWInfo->pOrderBy->nExpr==1 + assert( (pWInfo->pOrderBy!=0 && pWInfo->pOrderBy->nExpr==1) || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 - && pWInfo->nOBSat>0 - && (pIdx->nKeyCol>nEq) - ){ + if( pLoop->wsFlags & WHERE_MIN_ORDERED ){ + assert( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN) ); + assert( pWInfo->nOBSat ); + assert( pIdx->nColumn>nEq ); assert( pLoop->nSkip==0 ); bSeekPastNull = 1; nExtraReg = 1; } Index: test/minmax4.test ================================================================== --- test/minmax4.test +++ test/minmax4.test @@ -175,7 +175,30 @@ } {2 2} do_execsql_test 3.$tn.5 { SELECT min(a), b FROM t1 WHERE a<50; } {2 2} } + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE t0 (c0, c1); + CREATE INDEX i0 ON t0(c1, c1 + 1 DESC); + INSERT INTO t0(c0) VALUES (1); +} +do_execsql_test 4.1 { + SELECT MIN(t0.c1), t0.c0 FROM t0 WHERE t0.c1 ISNULL; +} {{} 1} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 5.0 { + CREATE TABLE t1 (a, b); + INSERT INTO t1 VALUES(123, NULL); + CREATE INDEX i1 ON t1(a, b DESC); +} +do_execsql_test 5.1 { + SELECT MIN(a) FROM t1 WHERE a=123; +} {123} finish_test +