aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expr.c13
-rw-r--r--src/fkey.c7
-rw-r--r--src/resolve.c1
-rw-r--r--src/select.c1
-rw-r--r--src/where.c2
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;