I¹m having problems to return results from a FTS4 table using ICU.
I¹m doing the usual routine to load an ICU collation:
1) Directly after opening the DB:
SELECT icu_load_collation('de_DE', 'LOCALIZED');
2) Creating some table
CREATE VIRTUAL TABLE ¹sometable' USING fts4 (tokenize='icu' 'LOCALIZED',
status, firstName, lastName)
3) Then inserting some Date via prepared statement and binding params
4) List all entries
SELECT * FROM sometable
So far, so good. The collation loads ok, and all entries in the table are
listed.
5) But when I use a MATCH statement, I just get no results back from the
table:
SELECT * FROM sometable WHERE sometable MATCH '(lastname:a*) OR
(firstname:a*)' ORDER BY lastname, firstname COLLATE LOCALIZED
It is definitely related to the CREATE table with "tokenize='icu'
LOCALIZEDŒ³. When I create the table without this, I get the expected
results from the very same query. But I¹m completely stuck here, because I
just get an empty result set and don¹t see any errors at all.
I should mention that I target iOS and compile in ICU with my build of
SQLite. There is one place in SQLite which I changed like to enable
loading an ICU data file on the iPhone like so:
SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
struct IcuScalar {
const char *zName; /* Function name */
int nArg; /* Number of arguments */
int enc; /* Optimal text encoding */
void *pContext; /* sqlite3_user_data()
context */
void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
} scalars[] = {
{"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc},
{"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16},
{"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16},
{"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16},
{"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16},
{"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16},
{"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16},
{"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16},
{"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16},
{"like", 2, SQLITE_UTF8, 0, icuLikeFunc},
{"like", 3, SQLITE_UTF8, 0, icuLikeFunc},
{"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation},
};
// begin custom ICU lib stuff
// app dir is specified here because i'll avoid to have any calls to
system icu data dir,
// which i think would happen otherwise
(http://userguide.icu-project.org/icudata)
const char *icuDatPath = getPathForICU();
u_setDataDirectory(icuDatPath);
const char *icuBuf = icuData();
if (icuBuf != NULL) {
UErrorCode err = U_ZERO_ERROR;
udata_setAppData_53(getPathForICUCommonDataFile(), &icuBuf, &err);
}
// end custom ICU stuff
int rc = SQLITE_OK;
int i;
for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0]));
i++){
struct IcuScalar *p = &scalars[i];
rc = sqlite3_create_function(
db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0
);
}
return rc;
}
Any pointers greatly appreciated.
Regards
Ben
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users