Add the sqlite3_collation_needed() API and fix some error handling cases
involving unknown collation sequences. (CVS 1563)

FossilOrigin-Name: 518d82d3b1ab996d675f45c94d740c98578a04a6
diff --git a/src/where.c b/src/where.c
index 7d33af4..eddb24e 100644
--- a/src/where.c
+++ b/src/where.c
@@ -12,7 +12,7 @@
 ** This module contains C code that generates VDBE code used to process
 ** the WHERE clause of SQL statements.
 **
-** $Id: where.c,v 1.103 2004/06/09 09:55:20 danielk1977 Exp $
+** $Id: where.c,v 1.104 2004/06/10 10:51:48 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -208,7 +208,7 @@
 ** set to 0 if the ORDER BY clause is all ASC.
 */
 static Index *findSortingIndex(
-  sqlite *db,
+  Parse *pParse,
   Table *pTab,            /* The table to be sorted */
   int base,               /* Cursor number for pTab */
   ExprList *pOrderBy,     /* The ORDER BY clause */
@@ -220,6 +220,7 @@
   Index *pMatch;
   Index *pIdx;
   int sortOrder;
+  sqlite *db = pParse->db;
 
   assert( pOrderBy!=0 );
   assert( pOrderBy->nExpr>0 );
@@ -248,7 +249,7 @@
     int nExpr = pOrderBy->nExpr;
     if( pIdx->nColumn < nEqCol || pIdx->nColumn < nExpr ) continue;
     for(i=j=0; i<nEqCol; i++){
-      CollSeq *pColl = sqlite3ExprCollSeq(pOrderBy->a[j].pExpr);
+      CollSeq *pColl = sqlite3ExprCollSeq(pParse, pOrderBy->a[j].pExpr);
       if( !pColl ) pColl = db->pDfltColl;
       if( pPreferredIdx->aiColumn[i]!=pIdx->aiColumn[i] ) break;
       if( pPreferredIdx->keyInfo.aColl[i]!=pIdx->keyInfo.aColl[i] ) break;
@@ -261,7 +262,7 @@
     }
     if( i<nEqCol ) continue;
     for(i=0; i+j<nExpr; i++){
-      CollSeq *pColl = sqlite3ExprCollSeq(pOrderBy->a[i+j].pExpr);
+      CollSeq *pColl = sqlite3ExprCollSeq(pParse, pOrderBy->a[i+j].pExpr);
       if( !pColl ) pColl = db->pDfltColl;
       if( pOrderBy->a[i+j].pExpr->iColumn!=pIdx->aiColumn[i+nEqCol] ||
           pColl!=pIdx->keyInfo.aColl[i+nEqCol] ) break;
@@ -540,9 +541,9 @@
 
       if( pIdx->nColumn>32 ) continue;  /* Ignore indices too many columns */
       for(j=0; j<nExpr; j++){
-        CollSeq *pColl = sqlite3ExprCollSeq(aExpr[j].p->pLeft);
+        CollSeq *pColl = sqlite3ExprCollSeq(pParse, aExpr[j].p->pLeft);
         if( !pColl && aExpr[j].p->pRight ){
-          pColl = sqlite3ExprCollSeq(aExpr[j].p->pRight);
+          pColl = sqlite3ExprCollSeq(pParse, aExpr[j].p->pRight);
         }
         if( !pColl ){
           pColl = pParse->db->pDfltColl;
@@ -676,7 +677,7 @@
        pSortIdx = 0;
      }else{
        int nEqCol = (pWInfo->a[0].score+4)/8;
-       pSortIdx = findSortingIndex(pParse->db, pTab, pTabList->a[0].iCursor, 
+       pSortIdx = findSortingIndex(pParse, pTab, pTabList->a[0].iCursor, 
                                    *ppOrderBy, pIdx, nEqCol, &bRev);
      }
      if( pSortIdx && (pIdx==0 || pIdx==pSortIdx) ){