The case_sensitive_like pragma added.
Test cases added for the LIKE optimization. (CVS 2592)

FossilOrigin-Name: 72ee21c05e618b6f46f5460f8c85779c72fe32d7
diff --git a/src/where.c b/src/where.c
index c340626..e98363d 100644
--- a/src/where.c
+++ b/src/where.c
@@ -16,7 +16,7 @@
 ** so is applicable.  Because this module is responsible for selecting
 ** indices, you might also think of this module as the "query optimizer".
 **
-** $Id: where.c,v 1.161 2005/08/13 16:13:05 drh Exp $
+** $Id: where.c,v 1.162 2005/08/14 01:20:39 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -467,54 +467,35 @@
 ** literal that does not begin with a wildcard.  
 */
 static int isLikeOrGlob(
+  sqlite3 *db,      /* The database */
   Expr *pExpr,      /* Test this expression */
   int *pnPattern,   /* Number of non-wildcard prefix characters */
   int *pisComplete  /* True if the only wildcard is % in the last character */
 ){
   const char *z;
   Expr *pRight, *pLeft;
+  ExprList *pList;
   int c, cnt;
-  char wc1, wc2, wc3;
-  if( pExpr->op!=TK_FUNCTION ){
+  char wc[3];
+  if( !sqlite3IsLikeFunction(db, pExpr, wc) ){
     return 0;
   }
-  if( pExpr->pList->nExpr!=2 ){
-    return 0;
-  }
-  if( pExpr->token.n!=4 ){
-    return 0;
-  }
-  z = pExpr->token.z;
-  if( sqlite3StrNICmp(z, "glob", 4)==0 ){
-    wc1 = '*';
-    wc2 = '?';
-    wc3 = '[';
-  }
-#ifdef SQLITE_CASE_SENSITIVE_LIKE
-  else if( sqlite3StrNICmp(z, "like", 4)==0 ){
-    wc1 = '%';
-    wc2 = '_';
-    wc3 = '_';
-  }
-#endif
-  else{
-    return 0;
-  }
-  pRight = pExpr->pList->a[0].pExpr;
+  pList = pExpr->pList;
+  pRight = pList->a[0].pExpr;
   if( pRight->op!=TK_STRING ){
     return 0;
   }
-  pLeft = pExpr->pList->a[1].pExpr;
+  pLeft = pList->a[1].pExpr;
   if( pLeft->op!=TK_COLUMN ){
     return 0;
   }
   sqlite3DequoteExpr(pRight);
   z = pRight->token.z;
-  for(cnt=0; (c=z[cnt])!=0 && c!=wc1 && c!=wc2 && c!=wc3; cnt++){}
+  for(cnt=0; (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2]; cnt++){}
   if( cnt==0 || 255==(u8)z[cnt] ){
     return 0;
   }
-  *pisComplete = z[cnt]==wc1 && z[cnt+1]==0;
+  *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
   *pnPattern = cnt;
   return 1;
 }
@@ -671,7 +652,7 @@
   /* Add constraints to reduce the search space on a LIKE or GLOB
   ** operator.
   */
-  if( isLikeOrGlob(pExpr, &nPattern, &isComplete) ){
+  if( isLikeOrGlob(pTerm->pWC->pParse->db, pExpr, &nPattern, &isComplete) ){
     Expr *pLeft, *pRight;
     Expr *pStr1, *pStr2;
     Expr *pNewExpr1, *pNewExpr2;