diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.c | 13 | ||||
-rw-r--r-- | src/fkey.c | 7 | ||||
-rw-r--r-- | src/resolve.c | 1 | ||||
-rw-r--r-- | src/select.c | 1 | ||||
-rw-r--r-- | src/where.c | 2 |
5 files changed, 12 insertions, 12 deletions
diff --git a/src/expr.c b/src/expr.c index 11feaa216..34be87114 100644 --- a/src/expr.c +++ b/src/expr.c @@ -106,7 +106,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ break; } if( p->flags & EP_Collate ){ - if( p->pLeft->flags & EP_Collate ){ + if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ p = p->pLeft; }else{ p = p->pRight; @@ -114,14 +114,6 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ }else{ break; } -#if 0 - else if( p->flags & EP_TokenOnly ){ - break; - }else{ - pColl = sqlite3ExprCollSeq(pParse, p->pLeft); - p = p->pRight; - } -#endif } if( sqlite3CheckCollSeq(pParse, pColl) ){ pColl = 0; @@ -3355,7 +3347,7 @@ static int evalConstExpr(Walker *pWalker, Expr *pExpr){ int r1 = ++pParse->nMem; int r2; r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); - if( NEVER(r1!=r2) ) sqlite3ReleaseTempReg(pParse, r1); + if( r1!=r2 ) sqlite3ReleaseTempReg(pParse, r1); pExpr->op2 = pExpr->op; pExpr->op = TK_REGISTER; pExpr->iTable = r2; @@ -3795,6 +3787,7 @@ int sqlite3ExprCompare(Expr *pA, Expr *pB){ return pA->op==TK_COLLATE ? 1 : 2; } } + if( (pA->flags&EP_Collate)!=(pB->flags&EP_Collate) ) return 1; return 0; } diff --git a/src/fkey.c b/src/fkey.c index a120b7b2b..f9401ae6c 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -511,12 +511,17 @@ static void fkScanChildren( ** expression to the parent key column defaults. */ if( pIdx ){ Column *pCol; + Expr *pNew; + Token s; iCol = pIdx->aiColumn[i]; pCol = &pTab->aCol[iCol]; if( pTab->iPKey==iCol ) iCol = -1; pLeft->iTable = regData+iCol+1; pLeft->affinity = pCol->affinity; - // fix me. pLeft->pColl = sqlite3LocateCollSeq(pParse, pCol->zColl); + s.z = pCol->zColl; + s.n = sqlite3Strlen30(s.z); + pNew = sqlite3ExprSetCollByToken(pParse, pLeft, &s); + if( pNew ) pLeft = pNew; }else{ pLeft->iTable = regData; pLeft->affinity = SQLITE_AFF_INTEGER; diff --git a/src/resolve.c b/src/resolve.c index c2b0523f0..8ae170ab4 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -114,6 +114,7 @@ static void resolveAlias( pDup->flags2 |= EP2_MallocedToken; pDup->u.zToken = sqlite3DbStrDup(db, zToken); } + pDup->flags |= EP_Collate & pExpr->flags; /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, diff --git a/src/select.c b/src/select.c index ee1755dbd..4582d2bc1 100644 --- a/src/select.c +++ b/src/select.c @@ -2337,6 +2337,7 @@ static int multiSelectOrderBy( pColl = sqlite3ExprCollSeq(pParse, pTerm); }else{ pColl = multiSelectCollSeq(pParse, p, aPermute[i]); + pTerm->flags |= EP_Collate; } pKeyMerge->aColl[i] = pColl; pKeyMerge->aSortOrder[i] = pOrderBy->a[i].sortOrder; diff --git a/src/where.c b/src/where.c index 02fb72207..459081e3e 100644 --- a/src/where.c +++ b/src/where.c @@ -665,7 +665,7 @@ static WhereTerm *findTerm( */ assert(pX->pLeft); pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); - assert(pColl || pParse->nErr); + if( pColl==0 ) pColl = pParse->db->pDfltColl; for(j=0; pIdx->aiColumn[j]!=iColumn; j++){ if( NEVER(j>=pIdx->nColumn) ) return 0; |