![Erro enorme de pesquisa de entrada do PostgreSQL não pôde analisar o documento XML](https://rvso.com/image/789278/Erro%20enorme%20de%20pesquisa%20de%20entrada%20do%20PostgreSQL%20n%C3%A3o%20p%C3%B4de%20analisar%20o%20documento%20XML.png)
Eu tenho um banco de dados PostgreSQL com alguns documentos bastante grandes em formato XML adicionados a uma tabela que possui um XML
campo de tipo. Estou executando uma XMLTABLE
consulta com expressão XPath e tenho o seguinte erro:
[2200M] ERROR: could not parse XML document
Detail: line 91735: internal error: Huge input lookup
A consulta é bastante simples e funciona sem problemas em outros registros:
SELECT xmltable.*
FROM poc.xmlcontent,
XMLTABLE(
'//section'
PASSING document
COLUMNS
id varchar PATH '@id'
)
WHERE poc.xmlcontent.id = 375;
Algumas das configurações do pgsql que verifiquei:
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
Obrigado
ATUALIZAR Acabei de descobrir que isso acontece apenas em documentos onde o arquivo termina com uma imagem e as imagens nos documentos são decodificadas na base 64 do arquivo e incluídas na marcação. Aqui está um exemplo do final de um documento que produz este erro:
...
<p class="content_center">
<img src="data:image/jpeg;base64,/9j/4AAQSkZJ...."/>
</p>
</section>
</section>
</section>
</body>
</xml>
Somente se eu colocar uma seção extra com conteúdo logo antes do corpo de fechamento, ela será corrigida. Mas se eu adicionar algum conteúdo após a imagem no mesmo nível, ainda produzirá o erro. Se eu remover a imagem está tudo bem e também se a imagem não estiver na base 64 do documento também está tudo bem. Se eu usar qualquer imagem, ela ainda falhará, então a imagem em si não é o problema.
Responder1
Acho que o elemento XML é muito grande para ser analisado.
Deanalisador.ccódigo fonte da libxml2 você pode ver onde esse erro é gerado:
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);
}
O limite deXML_MAX_LOOKUP_LIMITÉ definido emanalisadorInternals.h para 1.000.000:
/**
* 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
Portanto, espero que qualquer imagem maior que 7,15 MB, codificada em base64 no XML, gere uma exceção. Você poderia verificar esse limite?
Acho que você precisa analisar o XML no servidor de aplicativos, não no banco de dados postgresql, ou usar imagens menores.