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 元素太大而无法解析。

来自解析器.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 中,或者使用较小的图像。

相关内容