Ich habe eine PostgreSQL-Datenbank mit einigen ziemlich großen Dokumenten im XML-Format, die in eine Tabelle mit einem XML
Typfeld eingefügt sind. Ich führe eine XMLTABLE
Abfrage 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.