82 sqlite3_context *pCtx,
87 sqlite3_snprintf(128, zBuf,
"ICU error: %s(): %s", zName, u_errorName(e));
89 sqlite3_result_error(pCtx, zBuf, -1);
115 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
116 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
117 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
118 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
119 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
120 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
121 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
122 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00,
147 const uint8_t *zPattern,
148 const uint8_t *zString,
151 static const uint32_t MATCH_ONE = (uint32_t)
'_';
152 static const uint32_t MATCH_ALL = (uint32_t)
'%';
161 if( uPattern==0 )
break;
170 if( uPattern==MATCH_ALL && !prevEscape && uPattern!=(uint32_t)uEsc ){
178 while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){
180 if( *zString==0 )
return 0;
186 if( *zPattern==0 )
return 1;
196 }
else if( uPattern==MATCH_ONE && !prevEscape && uPattern!=(uint32_t)uEsc ){
198 if( *zString==0 )
return 0;
201 }
else if( uPattern==(uint32_t)uEsc && !prevEscape ){
209 uString = (uint32_t)u_foldCase((UChar32)uString, U_FOLD_CASE_DEFAULT);
210 uPattern = (uint32_t)u_foldCase((UChar32)uPattern, U_FOLD_CASE_DEFAULT);
211 if( uString!=uPattern ){
235 sqlite3_context *context,
239 const unsigned char *zA = sqlite3_value_text(argv[0]);
240 const unsigned char *zB = sqlite3_value_text(argv[1]);
247 sqlite3_result_error(context,
"LIKE or GLOB pattern too complex", -1);
256 int nE= sqlite3_value_bytes(argv[2]);
257 const unsigned char *zE = sqlite3_value_text(argv[2]);
260 U8_NEXT(zE,
i, nE, uEsc);
262 sqlite3_result_error(context,
263 "ESCAPE expression must be a single character", -1);
302 UErrorCode status = U_ZERO_ERROR;
303 URegularExpression *pExpr;
305 const UChar *zString = sqlite3_value_text16(apArg[1]);
316 pExpr = sqlite3_get_auxdata(
p, 0);
318 const UChar *zPattern = sqlite3_value_text16(apArg[0]);
322 pExpr = uregex_open(zPattern, -1, 0, 0, &status);
324 if( U_SUCCESS(status) ){
334 uregex_setText(pExpr, zString, -1, &status);
335 if( !U_SUCCESS(status) ){
341 res = uregex_matches(pExpr, 0, &status);
342 if( !U_SUCCESS(status) ){
352 uregex_setText(pExpr, 0, 0, &status);
355 sqlite3_result_int(
p, res ? 1 : 0);
392 const char *zLocale = 0;
394 assert(nArg==1 || nArg==2);
395 bToUpper = (sqlite3_user_data(
p)!=0);
397 zLocale = (
const char *)sqlite3_value_text(apArg[1]);
400 zInput = sqlite3_value_text16(apArg[0]);
404 nOut = nInput = sqlite3_value_bytes16(apArg[0]);
406 sqlite3_result_text16(
p,
"", 0, SQLITE_STATIC);
410 for(cnt=0; cnt<2; cnt++){
411 UChar *zNew = sqlite3_realloc(zOutput, nOut);
413 sqlite3_free(zOutput);
414 sqlite3_result_error_nomem(
p);
418 status = U_ZERO_ERROR;
420 nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
422 nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status);
425 if( U_SUCCESS(status) ){
426 sqlite3_result_text16(
p, zOutput, nOut,
xFree);
427 }
else if( status==U_BUFFER_OVERFLOW_ERROR ){
488 sqlite3_value **apArg
490 sqlite3 *db = (sqlite3 *)sqlite3_user_data(
p);
491 UErrorCode status = U_ZERO_ERROR;
494 UCollator *pUCollator;
499 zLocale = (
const char *)sqlite3_value_text(apArg[0]);
500 zName = (
const char *)sqlite3_value_text(apArg[1]);
506 pUCollator = ucol_open(zLocale, &status);
507 if( !U_SUCCESS(status) ){
513 rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (
void *)pUCollator,
517 ucol_close(pUCollator);
518 sqlite3_result_error(
p,
"Error registering collation function", -1);