我的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的bug,因为sqlite的内置标记化器没有问题。是ICU还是sqlite bug,或者我做错了什么?我已经在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获取空指针而不是字符串并将其传递下来。我现在无法一步一步地调试它(我正在使用amalgamation而VS 2010无法调试超过65535行代码)。
答案 0 :(得分:0)
地址00000000当然是空指针。听起来像是一个sqlite3错误(至少在fts4 / icu粘合剂中),如果它试图将null传递给ICU tokenizer。你能在调试模式下构建所有内容并找出谁正在获得访问冲突吗?