![PostgreSQL巨大的輸入查找錯誤無法解析XML文檔](https://rvso.com/image/789278/PostgreSQL%E5%B7%A8%E5%A4%A7%E7%9A%84%E8%BC%B8%E5%85%A5%E6%9F%A5%E6%89%BE%E9%8C%AF%E8%AA%A4%E7%84%A1%E6%B3%95%E8%A7%A3%E6%9E%90XML%E6%96%87%E6%AA%94.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>
只有當我在關閉正文之前放置一個包含內容的額外部分時,它才會得到修復。但如果我在同一層的圖像後面添加一些內容,它仍然會產生錯誤。如果我刪除圖像就可以了,如果圖像不是基於 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 中,或使用較小的映像。