如何解决Sqlite和FTS表是否带有ICU标记生成器错误?
| 我在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行的代码)。
解决方法
地址00000000当然是一个空指针。如果尝试将null传递给ICU令牌生成器,则听起来像sqlite3错误(至少在fts4 / icu胶中)。您可以在调试模式下构建所有内容并找出谁遇到访问冲突吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。