sqlite データベースの FTS テーブルに奇妙な問題があります。次のようなテーブルを作成しています。
CREATE VIRTUAL TABLE table01 USING fts4(name, content, tokenize=icu ru_RU);
次に、名前とコンテンツを含む行と名前のみを含む行の 2 つの行を挿入します。
INSERT INTO table01(name, content) VALUES('Abc1', 'asdasd');
INSERT INTO table01(name) VALUES('Abc2');
また、名前列のみが入力された行を更新または削除しようとすると、「モジュール 'sqlite3.dll' のアドレス 7244CF96 でアクセス違反が発生しました。アドレス 00000000 の読み取り」というエラーが表示されます。他の行にはすべて問題ありません。通常どおり更新または削除できます。どのロケールを使用するかは問題ではありません。en_US や他の多くのロケールを試しました。また、fts3 と fts4 に違いはありません。sqlite のビルトイン トークナイザーには問題がないため、ICU のバグのようです。ICU または sqlite のバグですか、それとも何か間違っていますか? 私はこれを SQLite Expert と私のプロジェクトで、必要なすべてのコンパイル オプションとすべてのライブラリを含めて試しました。
スタック フレームの最新:
msvcr100d.dll!strlen(unsigned char * buf) Line 81 Asm
my_prog.exe!icuOpen(sqlite3_tokenizer * pTokenizer, const char * zInput, int nInput, sqlite3_tokenizer_cursor * * ppCursor) Line 60276 + 0x9 bytes
my_prog.exe!fts3PendingTermsAdd(Fts3Table * p, const char * zText, int iCol, unsigned int * pnWord) Line 52616 + 0x18 bytes C
my_prog.exe!fts3DeleteTerms(int * pRC, Fts3Table * p, Mem * * apVal, unsigned int * aSz) Line 52828 + 0x1a bytes C
fts3DeleteTerms は文字列の代わりに null ポインターを取得し、それを渡します。現在、段階的にデバッグすることはできません (私は融合を使用しており、VS 2010 は 65535 行を超えるコードをデバッグできません)。