![El enorme error de búsqueda de entrada de PostgreSQL no pudo analizar el documento XML](https://rvso.com/image/789278/El%20enorme%20error%20de%20b%C3%BAsqueda%20de%20entrada%20de%20PostgreSQL%20no%20pudo%20analizar%20el%20documento%20XML.png)
Tengo una base de datos PostgreSQL con algunos documentos bastante grandes en formato XML agregados a una tabla que tiene un XML
campo de tipo. Estoy ejecutando una XMLTABLE
consulta 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.