El enorme error de búsqueda de entrada de PostgreSQL no pudo analizar el documento XML

El enorme error de búsqueda de entrada de PostgreSQL no pudo analizar el documento XML

Tengo una base de datos PostgreSQL con algunos documentos bastante grandes en formato XML agregados a una tabla que tiene un XMLcampo de tipo. Estoy ejecutando una XMLTABLEconsulta con expresión XPath y tengo el siguiente error:

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

La consulta es bastante sencilla y funciona sin problemas en otros registros:

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

Algunas de las configuraciones de pgsql que verifiqué:

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

Gracias

ACTUALIZAR Acabo de descubrir que esto sucede solo en documentos donde el archivo termina con una imagen y las imágenes en los documentos están decodificadas en base 64 del archivo y se incluyen en el marcado. A continuación se muestra un ejemplo del final de un documento que produce este error:

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

Sólo si coloco una sección adicional con contenido justo antes del cuerpo de cierre, se solucionará. Pero si agrego algún contenido después de la imagen en el mismo nivel, seguirá produciendo el error. Si elimino la imagen, está bien y también si la imagen no es base 64 en el documento, también está bien. Si uso alguna imagen, seguirá fallando, por lo que la imagen en sí no es el problema.

Respuesta1

Creo que el elemento XML es demasiado grande para analizarlo.

Desde elanalizador.ccódigo fuente de libxml2 puede ver dónde se genera este error:

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

el límite deXML_MAX_LOOKUP_LIMITestá preparadoanalizadorInternals.h a 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

Por lo tanto, espero que cualquier imagen de más de 7,15 MB, es decir, codificada en base64 en XML, genere una excepción. ¿Podrías verificar este límite?

Creo que es necesario analizar el XML en el servidor de aplicaciones, no en la base de datos postgresql, o utilizar imágenes más pequeñas.

información relacionada