Großer PostgreSQL-Eingabesuchfehler, XML-Dokument konnte nicht analysiert werden

Großer PostgreSQL-Eingabesuchfehler, XML-Dokument konnte nicht analysiert werden

Ich habe eine PostgreSQL-Datenbank mit einigen ziemlich großen Dokumenten im XML-Format, die in eine Tabelle mit einem XMLTypfeld eingefügt sind. Ich führe eine XMLTABLEAbfrage mit einem XPath-Ausdruck aus und erhalte den folgenden Fehler:

[2200M] ERROR: could not parse XML document 
Detail: line 91735: internal error: Huge input lookup

Die Abfrage ist ziemlich einfach und funktioniert problemlos bei anderen Datensätzen:

SELECT xmltable.*
FROM poc.xmlcontent,
    XMLTABLE(
            '//section'
            PASSING document
            COLUMNS
                id varchar PATH '@id'
        )
WHERE poc.xmlcontent.id = 375;

Einige der pgsql-Einstellungen, die ich überprüft habe:

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

Danke

AKTUALISIEREN Ich habe gerade herausgefunden, dass dies nur bei Dokumenten passiert, deren Datei mit einem Bild endet und die Bilder in den Dokumenten Base64-dekodiert und in das Markup aufgenommen werden. Hier ist ein Beispiel für das Ende eines Dokuments, das diesen Fehler erzeugt:

            ...
            <p class="content_center">
                <img src="data:image/jpeg;base64,/9j/4AAQSkZJ...."/>
            </p>
            </section>
        </section>
    </section>
</body>
</xml>

Nur wenn ich einen zusätzlichen Abschnitt mit Inhalt direkt vor den schließenden Textkörper setze, wird das Problem behoben. Wenn ich jedoch nach dem Bild auf derselben Ebene Inhalt hinzufüge, tritt der Fehler trotzdem auf. Wenn ich das Bild entferne, ist es ok, und auch wenn das Bild im Dokument nicht Base 64 ist, ist es ok. Wenn ich ein beliebiges Bild verwende, schlägt es trotzdem fehl, das Bild selbst ist also nicht das Problem.

Antwort1

Ich denke, dass das XML-Element zu groß ist, um analysiert zu werden.

Von demparser.cIm Quellcode von libxml2 können Sie sehen, wo dieser Fehler auftritt:

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);
}

Die Grenze vonXML_MAX_LOOKUP_LIMITist eingestellt inparserInternals.h bis 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

Ich gehe also davon aus, dass jedes Bild, das größer als 7,15 MB ist und in XML base64-codiert ist, eine Ausnahme generiert. Können Sie diese Grenze bestätigen?

Ich denke, Sie müssen das XML im Anwendungsserver und nicht in der PostgreSQL-Datenbank analysieren oder kleinere Bilder verwenden.

verwandte Informationen