aboutsummaryrefslogtreecommitdiff
path: root/src/whereexpr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-12-31 14:49:10 +0000
committerdrh <drh@noemail.net>2019-12-31 14:49:10 +0000
commit5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b (patch)
tree0a8359d1c5b0829d9a6292e85665979bf364e076 /src/whereexpr.c
parentd335bc40a6576d8759466d8efaaaf82b04667aaa (diff)
parent02ff747bc0a6039cddf6108719426d247026fa18 (diff)
downloadsqlite-5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b.tar.gz
sqlite-5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b.zip
Merge recent enhancements from trunk.
FossilOrigin-Name: 39d55579376906f212271ce9b2d367e3ad029fb173f22c7253312b467970208a
Diffstat (limited to 'src/whereexpr.c')
-rw-r--r--src/whereexpr.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/whereexpr.c b/src/whereexpr.c
index 16bbf4468..cec0aefd8 100644
--- a/src/whereexpr.c
+++ b/src/whereexpr.c
@@ -1298,6 +1298,7 @@ static void exprAnalyze(
0, sqlite3ExprDup(db, pRight, 0));
if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){
ExprSetProperty(pNewExpr, EP_FromJoin);
+ pNewExpr->iRightJoinTable = pExpr->iRightJoinTable;
}
idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
testcase( idxNew==0 );
@@ -1354,11 +1355,15 @@ static void exprAnalyze(
** expression). The WhereTerm.iField variable identifies the index within
** the vector on the LHS that the virtual term represents.
**
- ** This only works if the RHS is a simple SELECT, not a compound
+ ** This only works if the RHS is a simple SELECT (not a compound) that does
+ ** not use window functions.
*/
if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0
&& pExpr->pLeft->op==TK_VECTOR
&& pExpr->x.pSelect->pPrior==0
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ && pExpr->x.pSelect->pWin==0
+#endif
){
int i;
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
@@ -1516,9 +1521,10 @@ Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){
mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList);
}
#ifndef SQLITE_OMIT_WINDOWFUNC
- if( p->op==TK_FUNCTION && p->y.pWin ){
+ if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){
mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition);
mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy);
+ mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter);
}
#endif
return mask;