如何确保SQLITE3中sinlge VIEW的子查询执行顺序?

问题描述

在使用sqlite3时,我遇到了一个奇怪的情况。

首先,我创建一个像这样的数据库:

$ sqlite3 ./test.db
sqlite> CREATE VIRTUAL TABLE dummy USING fts3(tokenize=simple);
sqlite> CREATE VIEW testview AS SELECT(
   ...>     (SELECT fts3_tokenizer('simple',x'deadbeefdeadbeef')) +
   ...>     (SELECT * FROM dummy)
   ...> );
sqlite> .quit

然后我再次打开它。

$ sqlite3 ./test.db
sqlite> SELECT * FROM dummy;
sqlite> .quit

当然没有什么事了,因为哑人是一个空表。

我在其之前回收了令牌生成器“简单”。

$ sqlite3 ./test.db
sqlite> SELECT fts3_tokenizer('simple',x'deadbeefdeadbeef');
sqlite> SELECT * FROM dummy;
[1]    33079 segmentation fault (core dumped)  ./sqlite3 test.db

它崩溃,因为我更改了令牌生成器'simple'的虚拟表,并且自sqlite启动以来第一次选择SELECT虚拟表时,sqlite将使用fts3 xCREATE函数“重新创建”表。

奇怪的是,我在视图中做这两个事情时就发生了,这只是在开始时创建的-testview。

$ sqlite3 ./test.db
sqlite> SELECT * FROM testview;
sqlite> .quit

什么都没发生。似乎testview中的第一个子查询只是在第二个之后执行,这是违反直觉的。无论我如何更改顺序,“ SELECT * FROM dummy”似乎总是首先执行。

所以我的问题是,为什么要这样执行?如何确保“ SELECT fts3_tokenizer('simple',x'deadbeefdeadbeef');”发生在“ SELECT * FROM dummy;”之前,因此我可以触发崩溃。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...