diff options
author | drh <drh@noemail.net> | 2020-01-02 21:41:59 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-01-02 21:41:59 +0000 |
commit | 378ca1eab3792af721d894922f68fe2b6998e090 (patch) | |
tree | f4f3417a9ce940d6ed918e7a31383ee6da472ba7 /src/wherecode.c | |
parent | cf014f6cbd2452abb29b3bef2b3b4e63e59c09f8 (diff) | |
parent | 0c4f82051c7ff301ea78cf1d279005d2dc26ad19 (diff) | |
download | sqlite-378ca1eab3792af721d894922f68fe2b6998e090.tar.gz sqlite-378ca1eab3792af721d894922f68fe2b6998e090.zip |
Merge the latest enhancements from trunk.
FossilOrigin-Name: bd57e6d923d3b04f0a07aaf18bf389d2b2b7efc7c57e8cb37e6ef910662d8397
Diffstat (limited to 'src/wherecode.c')
-rw-r--r-- | src/wherecode.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wherecode.c b/src/wherecode.c index 96c2971a5..beb23e0c1 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1113,8 +1113,23 @@ typedef struct IdxExprTrans { int iIdxCur; /* The cursor for the index */ int iIdxCol; /* The column for the index */ int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ } IdxExprTrans; +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + /* The walker node callback used to transform matching expressions into ** a reference to an index column for an index on an expression. ** @@ -1124,6 +1139,7 @@ typedef struct IdxExprTrans { static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; @@ -1147,6 +1163,7 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ assert( pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; @@ -1188,6 +1205,8 @@ static void whereIndexExprTrans( w.u.pIdxTrans = &x; x.iTabCur = iTabCur; x.iIdxCur = iIdxCur; + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; for(iIdxCol=0; iIdxCol<pIdx->nColumn; iIdxCol++){ i16 iRef = pIdx->aiColumn[iIdxCol]; if( iRef==XN_EXPR ){ |