PostgreSQL の巨大な入力ルックアップ エラーにより XML ドキュメントを解析できませんでした

PostgreSQL の巨大な入力ルックアップ エラーにより XML ドキュメントを解析できませんでした

PostgreSQL データベースがあり、XMLタイプ フィールドを持つテーブルに XML 形式のかなり大きなドキュメントが追加されています。Xpath 式を使用してクエリを実行するXMLTABLEと、次のエラーが発生します。

[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

したがって、base64 で XML にエンコードされた 7.15 MB を超える画像では例外が発生すると予想されます。この制限を確認していただけますか?

XML を postgresql DB ではなくアプリケーション サーバーで解析するか、より小さな画像を使用する必要があると思います。

関連情報