Запрос регулярного выражения с фатальным сигналом 11 (SIGSEGV) ошибка - PullRequest
0 голосов
/ 28 января 2019

Я использую версию 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.2 и 1.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)

Ответы [ 2 ]

0 голосов
/ 31 января 2019

После нескольких часов работы и исследований на 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]"))))

И он работает отлично без каких-либофатальная ошибка или что-то в этом роде.

Примечание: - Другое дело, что информационное поле в моей базе данных определено как индекс, поэтому, возможно, я запрашиваю данные в поле индекса, и оно становится нулевым илипусто, поэтому я получаю фатальную ошибку сигнала (я все еще ищу, правильна эта логика или нет.)

0 голосов
/ 29 января 2019

Я думаю, ваш запрос регулярного выражения, кажется, в порядке.Вы можете проверить с помощью приведенного ниже модульного теста.

@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);
}
...