我有一个 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 元素太大而无法解析。
来自解析器.clibxml2 的源代码中你可以看到这个错误产生的位置:
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安顿好了分析器内部.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.15MB 的图像(即以 base64 编码到 XML 中)都会产生异常。您能验证一下这个限制吗?
我认为您需要在应用程序服务器中解析 XML,而不是在 postgresql DB 中,或者使用较小的图像。