Working with version 3.9.2 on IBM z/OS case insensitive LIKE queries do not
work if case does not match. The following #if defined(SQLITE_EBCDIC) is
important:



/*

** For LIKE and GLOB matching on EBCDIC machines, assume that every

** character is exactly one byte in size.  Also, provde the Utf8Read()

** macro for fast reading of the next character in the common case where

** the next character is ASCII.

*/

#if defined(SQLITE_EBCDIC)

# define sqlite3Utf8Read(A)        (*((*A)++))

# define Utf8Read(A)               (*(A++))

#else

# define Utf8Read(A)               (A[0]<0x80?*(A++):sqlite3Utf8Read(&A))

#endif



Within patternCompare() there are the following checks:



/* "[...]" immediately follows the "*".  We have to do a slow

** recursive search in this case, but it is an unusual case. */

  assert( matchOther<0x80 );  /* '[' is a single-byte character */

. 

. 

. 

/* At this point variable c contains the first character of the

** pattern string past the "*".  Search in the input string for the

** first matching character and recursively contine the match from

** that point.

**

** For a case-insensitive search, set variable cx to be the same as

** c but in the other case and search the input string for either

** c or cx.

*/

      if( c<=0x80 ){

. 

. 

. 

if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){

     continue;

}



Since EBCDIC character values are mostly >0x80 these checks can produce
invalid results on IBM z/OS.



Thanks for the help.



Roland Martin



Reply via email to