带有致命信号 11 (SIGSEGV) 错误的正则表达式查询
Regex query with fatal signal 11 (SIGSEGV) error
我正在使用 couchbase 精简版 android-ee:2.1.2
。我在本地 couchbase lite 数据库中存储了一些数据。现在,我正在尝试借助正则表达式查询从本地 couchbase lite 数据库查询数据,
Query query = QueryBuilder
.select(SelectResult.property("info"))
.from(DataSource.database(localDatabase))
.where(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));
我的数据库看起来像,
v_1.7.7_1_3
v_1.7.5_1_3
v_4.7.1_2_8
v_4.7.1_1_8
v_4.7.2_2_8
v_4.7.2_2_8
v_4.7.1_1_8
v_4.7.1_2_8
v_4.7.5_1_8
v_4.9.3_1_1
...
...
...
and so on many entries
为了理解数据库结构让我们以v_1.7.7_1_3
为例,这里v
可以定义为一个值,1.7.7
是标签然后1
是parent class(这可以是类型 1,2 和 3)然后 3
是 child class(这可以是类型 1,2,3,4 ,5,6,7 和 8)。
现在用户可以 select 多个标签,parent class 和 child class 作为选择。然后我必须分别根据参数selected从本地couchbase lite查询数据。目前,正如我上面所说,我正在尝试借助正则表达式查询数据,
例如,让用户select编辑标签4.6.2
和1.7.7
,那么parent class就是1,2和3和然后 child classes 1-8。所以我的查询就像,
"^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"
我已经在 https://regex101.com 上尝试过此查询,它运行良好,但不适用于 couchbase lite。
虽然应用程序只是因致命错误而崩溃,
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 25543 (.mains.activity)
这里是一些日志,
V/Query: Query encoded as {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}
I/LiteCore [Query]: {Query#3}==> N8litecore11SQLiteQueryE 0x7f5a2d9098
I/LiteCore [Query]: {Query#3} Compiling JSON query: {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}
I/LiteCore [Query]: {Query#3} Compiled as SELECT fl_result(fl_value(body, 'info')) FROM kv_default WHERE (regexp_like(fl_value(body, 'info'), '^v_(4.6.2|1.7.7)_[123]_[12345678]')) AND (flags & 1) = 0
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 28308 (.mains.activity)
我认为,您的正则表达式查询似乎没问题。您可以使用以下单元测试用例进行验证。
@Test
public void testRegex() throws Exception {
MutableDocument doc1 = new MutableDocument("doc1");
doc1.setValue("version", "v_1.7.7_1_3");
db.save(doc1);
MutableDocument doc2 = new MutableDocument("doc2");
doc2.setValue("version", "v_1.7.5_1_3");
db.save(doc2);
MutableDocument doc3 = new MutableDocument("doc3");
doc3.setValue("version", "v_4.7.1_2_8");
db.save(doc3);
MutableDocument doc4 = new MutableDocument("doc4");
doc4.setValue("version", "v_4.7.1_1_8");
db.save(doc4);
MutableDocument doc5 = new MutableDocument("doc5");
doc5.setValue("version", "v_4.7.2_2_8");
db.save(doc5);
MutableDocument doc6 = new MutableDocument("doc6");
doc6.setValue("version", "v_4.6.2_2_8");
db.save(doc6);
Query q = QueryBuilder
.select(SelectResult.property("version"))
.from(DataSource.database(db))
.where(Expression.property("version").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));
List<Result> results = q.execute().allResults();
// since the doc1 and doc6 passes the regex.
assertEquals(results.size(), 2);
}
在对 couchbase lite 进行了几个小时的工作和研究后,我得到了这个。首先,正则表达式查询没有任何问题,它工作正常。
第二个是在检查我的数据库时,我意识到我正在查询数据的信息字段在某些数据库条目中是 EMPTY 或 NULL。所以我在查询中添加了一个条件,例如
Expression.property("info").notNullOrMissing()
因此,当信息可用时,我将执行我的正则表达式查询,
.where(Expression.property("info").notNullOrMissing().and(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"))))
它工作完美,没有任何致命的信号错误或任何东西。
注意:- 另一件事是我的数据库中的信息字段被定义为索引,所以也许我正在查询索引字段上的数据并且它变得空或空,这就是为什么我收到一个致命的信号错误(我还在搜索,这个逻辑是否正确。)
我正在使用 couchbase 精简版 android-ee:2.1.2
。我在本地 couchbase lite 数据库中存储了一些数据。现在,我正在尝试借助正则表达式查询从本地 couchbase lite 数据库查询数据,
Query query = QueryBuilder
.select(SelectResult.property("info"))
.from(DataSource.database(localDatabase))
.where(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));
我的数据库看起来像,
v_1.7.7_1_3
v_1.7.5_1_3
v_4.7.1_2_8
v_4.7.1_1_8
v_4.7.2_2_8
v_4.7.2_2_8
v_4.7.1_1_8
v_4.7.1_2_8
v_4.7.5_1_8
v_4.9.3_1_1
...
...
...
and so on many entries
为了理解数据库结构让我们以v_1.7.7_1_3
为例,这里v
可以定义为一个值,1.7.7
是标签然后1
是parent class(这可以是类型 1,2 和 3)然后 3
是 child class(这可以是类型 1,2,3,4 ,5,6,7 和 8)。
现在用户可以 select 多个标签,parent class 和 child class 作为选择。然后我必须分别根据参数selected从本地couchbase lite查询数据。目前,正如我上面所说,我正在尝试借助正则表达式查询数据,
例如,让用户select编辑标签4.6.2
和1.7.7
,那么parent class就是1,2和3和然后 child classes 1-8。所以我的查询就像,
"^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"
我已经在 https://regex101.com 上尝试过此查询,它运行良好,但不适用于 couchbase lite。
虽然应用程序只是因致命错误而崩溃,
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 25543 (.mains.activity)
这里是一些日志,
V/Query: Query encoded as {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}
I/LiteCore [Query]: {Query#3}==> N8litecore11SQLiteQueryE 0x7f5a2d9098
I/LiteCore [Query]: {Query#3} Compiling JSON query: {"WHAT":[[".info"]],"WHERE":["regexp_like()",[".info"],"^v_(4.6.2|1.7.7)_[123]_[12345678]"]}
I/LiteCore [Query]: {Query#3} Compiled as SELECT fl_result(fl_value(body, 'info')) FROM kv_default WHERE (regexp_like(fl_value(body, 'info'), '^v_(4.6.2|1.7.7)_[123]_[12345678]')) AND (flags & 1) = 0
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 28308 (.mains.activity)
我认为,您的正则表达式查询似乎没问题。您可以使用以下单元测试用例进行验证。
@Test
public void testRegex() throws Exception {
MutableDocument doc1 = new MutableDocument("doc1");
doc1.setValue("version", "v_1.7.7_1_3");
db.save(doc1);
MutableDocument doc2 = new MutableDocument("doc2");
doc2.setValue("version", "v_1.7.5_1_3");
db.save(doc2);
MutableDocument doc3 = new MutableDocument("doc3");
doc3.setValue("version", "v_4.7.1_2_8");
db.save(doc3);
MutableDocument doc4 = new MutableDocument("doc4");
doc4.setValue("version", "v_4.7.1_1_8");
db.save(doc4);
MutableDocument doc5 = new MutableDocument("doc5");
doc5.setValue("version", "v_4.7.2_2_8");
db.save(doc5);
MutableDocument doc6 = new MutableDocument("doc6");
doc6.setValue("version", "v_4.6.2_2_8");
db.save(doc6);
Query q = QueryBuilder
.select(SelectResult.property("version"))
.from(DataSource.database(db))
.where(Expression.property("version").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]")));
List<Result> results = q.execute().allResults();
// since the doc1 and doc6 passes the regex.
assertEquals(results.size(), 2);
}
在对 couchbase lite 进行了几个小时的工作和研究后,我得到了这个。首先,正则表达式查询没有任何问题,它工作正常。
第二个是在检查我的数据库时,我意识到我正在查询数据的信息字段在某些数据库条目中是 EMPTY 或 NULL。所以我在查询中添加了一个条件,例如
Expression.property("info").notNullOrMissing()
因此,当信息可用时,我将执行我的正则表达式查询,
.where(Expression.property("info").notNullOrMissing().and(Expression.property("info").regex(Expression.string("^v" + "_" + "(4.6.2|1.7.7)" + "_" + "[123]" + "_" + "[12345678]"))))
它工作完美,没有任何致命的信号错误或任何东西。
注意:- 另一件事是我的数据库中的信息字段被定义为索引,所以也许我正在查询索引字段上的数据并且它变得空或空,这就是为什么我收到一个致命的信号错误(我还在搜索,这个逻辑是否正确。)