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>

只有當我在關閉正文之前放置一個包含內容的額外部分時,它才會得到修復。但如果我在同一層的圖像後面添加一些內容,它仍然會產生錯誤。如果我刪除圖像就可以了,如果圖像不是基於 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 中,或使用較小的映像。

相關內容