![Огромная ошибка поиска входных данных PostgreSQL не может проанализировать XML-документ](https://rvso.com/image/789278/%D0%9E%D0%B3%D1%80%D0%BE%D0%BC%D0%BD%D0%B0%D1%8F%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20PostgreSQL%20%D0%BD%D0%B5%20%D0%BC%D0%BE%D0%B6%D0%B5%D1%82%20%D0%BF%D1%80%D0%BE%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20XML-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82.png)
У меня есть база данных 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, или использовать изображения меньшего размера.