0

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 行を超えるコードをデバッグできません)。

4

1 に答える 1

0

アドレス 00000000 はもちろんヌル ポインタです。null を ICU トークナイザーに渡そうとしている場合、(少なくとも fts4/icu グルーでは) sqlite3 のバグのように思えます。すべてをデバッグ モードでビルドし、アクセス違反が発生しているユーザーを特定できますか?

于 2011-06-13T15:23:15.450 に答える