Огромная ошибка поиска входных данных PostgreSQL не может проанализировать XML-документ

Огромная ошибка поиска входных данных PostgreSQL не может проанализировать XML-документ

У меня есть база данных PostgreSQL с некоторыми довольно большими документами в формате XML, добавленными в таблицу, которая имеет XMLполе типа. Я запускаю XMLTABLEзапрос с выражением Xpath и получаю следующую ошибку:

[2200M] ERROR: could not parse XML document 
Detail: line 91735: internal error: Huge input lookup

Запрос довольно прост и без проблем работает с другими записями:

SELECT xmltable.*
FROM poc.xmlcontent,
    XMLTABLE(
            '//section'
            PASSING document
            COLUMNS
                id varchar PATH '@id'
        )
WHERE poc.xmlcontent.id = 375;

Некоторые настройки pgsql, которые я проверил:

huge_page_size|0
huge_pages|on
shared_buffers|327680
shared_memory_size|278MB
shared_memory_size_in_huge_pages|140
shared_memory_type|mmap
temp_buffers|8MB
work_mem|4MB

Спасибо

ОБНОВЛЯТЬ Я только что узнал, что это происходит только в документах, где файл заканчивается изображением, а изображения в документах декодируются из файла в формате base 64 и включаются в разметку. Вот пример конца документа, который выдает эту ошибку:

            ...
            <p class="content_center">
                <img src="data:image/jpeg;base64,/9j/4AAQSkZJ...."/>
            </p>
            </section>
        </section>
    </section>
</body>
</xml>

Только если я поставлю дополнительный раздел с содержимым прямо перед закрывающим телом, это будет исправлено. Но если я добавлю какой-либо контент после изображения на том же уровне, это все равно приведет к ошибке. Если я удалю изображение, это нормально, и также если изображение не является base 64 в документе, это также нормально. Если я использую любое изображение, это все равно приведет к ошибке, так что само изображение не является проблемой.

решение1

Я думаю, что элемент XML слишком велик для анализа.

Изпарсер.cИсходный код libxml2 позволяет увидеть, где генерируется эта ошибка:

if ((ctxt->input != NULL) &&
     (((ctxt->input->end - ctxt->input->cur) > XML_MAX_LOOKUP_LIMIT) ||
     ((ctxt->input->cur - ctxt->input->base) > XML_MAX_LOOKUP_LIMIT)) &&
    ((ctxt->options & XML_PARSE_HUGE) == 0)) {
    xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup");
    xmlHaltParser(ctxt);
}

ПределXML_MAX_LOOKUP_LIMITустановлен вparserInternals.h до 10000000:

/**
 * XML_MAX_LOOKUP_LIMIT:
 *
 * Maximum size allowed by the parser for ahead lookup
 * This is an upper boundary enforced by the parser to avoid bad
 * behaviour on "unfriendly' content
 * Introduced in 2.9.0
 */
#define XML_MAX_LOOKUP_LIMIT 10000000

Поэтому я ожидаю, что любое изображение размером более 7,15 МБ, закодированное в XML с помощью base64, сгенерирует исключение. Не могли бы вы проверить это ограничение?

Я думаю, что вам нужно анализировать XML на сервере приложений, а не в базе данных postgresql, или использовать изображения меньшего размера.

Связанный контент