0

我的 sqlite 数据库中的 FTS 表有一个奇怪的问题。我正在创建一个这样的表:

CREATE VIRTUAL TABLE table01 USING fts4(name, content, tokenize=icu ru_RU);

然后插入两行,一行包含名称和内容,另一行仅包含名称。

INSERT INTO table01(name, content) VALUES('Abc1', 'asdasd');
INSERT INTO table01(name) VALUES('Abc2');

当我尝试更新或删除仅填充名称列的行时,我收到错误“模块'sqlite3.dll'中地址7244CF96的访问冲突。读取地址00000000。”。其他行一切正常,我可以照常更新或删除。我使用什么语言环境并不重要,我尝试过 en_US 和许多其他语言。而且fts3和fts4没有区别。这似乎是 ICU 错误,因为 sqlite 的内置标记器没有问题。是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 正在获取空指针而不是字符串并将其向下传递。我现在无法逐步调试它(我正在使用合并,VS 2010 无法调试超过 65535 行代码)。

4

1 回答 1

0

地址 00000000 当然是一个空指针。如果它试图将 null 传递给 ICU 标记器,这听起来像是一个 sqlite3 错误(至少在 fts4/icu 胶水中)。您可以在调试模式下构建所有内容并找出谁在获取访问冲突吗?

于 2011-06-13T15:23:15.450 回答