Erro enorme de pesquisa de entrada do PostgreSQL não pôde analisar o documento XML

Erro enorme de pesquisa de entrada do PostgreSQL não pôde analisar o documento XML

Eu tenho um banco de dados PostgreSQL com alguns documentos bastante grandes em formato XML adicionados a uma tabela que possui um XMLcampo de tipo. Estou executando uma XMLTABLEconsulta 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.

informação relacionada