1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-16 23:02:26 +03:00

Make a distinction between (1) WHERE clause constraints, (2) ON/USING

constraints on outer joins, and (3) ON/USING clause constraints on inner
joins.  Formerly, there was no distinctionb between 1 and 3, but RIGHT JOIN
needs to know the difference.  Make RIGHT JOIN aware of this difference and
add test cases.

FossilOrigin-Name: 0f6f61c3664cc87209c2a6f9b6df3a750d1510723fcde209c33db8feaf48bcf3
This commit is contained in:
drh
2022-04-11 12:38:06 +00:00
parent b77c07a715
commit 3a6e4c59c4
7 changed files with 53 additions and 31 deletions

View File

@@ -6172,14 +6172,18 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
WhereInfo *pSubWInfo;
SrcList sFrom;
Bitmask mAll = 0;
for(k=0; k<=i; k++){
for(k=0; k<i; k++){
int iIdxCur;
mAll |= pWInfo->a[k].pWLoop->maskSelf;
iIdxCur = pWInfo->a[k].iIdxCur;
if( iIdxCur ) sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur);
}
mAll |= pLoop->maskSelf;
for(k=0; k<pWC->nTerm; k++){
WhereTerm *pTerm = &pWC->a[k];
if( pTerm->wtFlags & TERM_VIRTUAL ) break;
if( pTerm->prereqAll & ~mAll ) continue;
if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue;
if( ExprHasProperty(pTerm->pExpr, EP_FromJoin|EP_InnerJoin) ) continue;
pSubWhere = sqlite3ExprAnd(pParse, pSubWhere,
sqlite3ExprDup(db, pTerm->pExpr, 0));
}