簡體   English   中英

帶有致命信號 11 (SIGSEGV) 錯誤的正則表達式查詢

[英]Regex query with fatal signal 11 (SIGSEGV) error

我正在使用 couchbase lite 版本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是父類(這可以是類型 1,2 和 3),然后3是子類類(這可以是 1、2、3、4、5、6、7 和 8 類型)。

現在用戶可以選擇多個標簽、父類和子類作為選擇。 然后我必須根據分別選擇的參數從本地 couchbase lite 查詢數據。 目前,正如我上面所說,我試圖在正則表達式的幫助下查詢數據,

例如,讓用戶選擇標簽4.6.21.7.7 ,那么父類是 1,2 和 3,然后是子類 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]"))))

它運行完美,沒有任何致命的信號錯誤或任何東西。

注意: -另一件事是我的數據庫中的信息字段被定義為索引,所以也許我正在查詢索引字段上的數據並且它變得空或空,這就是我收到致命信號錯誤的原因(我仍在搜索,這是邏輯正確與否。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM