PostgreSQL의 대규모 입력 조회 오류로 인해 XML 문서를 구문 분석할 수 없습니다.

PostgreSQL의 대규모 입력 조회 오류로 인해 XML 문서를 구문 분석할 수 없습니다.

유형 필드 가 있는 테이블에 XML 형식의 꽤 큰 문서가 추가된 PostgreSQL 데이터베이스가 있습니다 XML. Xpath 표현식을 사용하여 쿼리를 실행 중인데 XMLTABLE다음 오류가 발생했습니다.

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

쿼리는 매우 간단하며 다른 레코드에서는 문제 없이 작동합니다.

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

내가 확인한 일부 pgsql 설정은 다음과 같습니다.

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

감사해요

업데이트 파일이 이미지로 끝나고 문서의 이미지가 파일에서 Base 64로 디코딩되어 마크업에 포함되는 문서에서만 이런 일이 발생한다는 것을 방금 알게 되었습니다. 다음은 이 오류를 생성하는 문서 끝의 예입니다.

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

본문을 닫는 바로 앞에 콘텐츠가 포함된 추가 섹션을 추가하는 경우에만 문제가 해결됩니다. 그러나 동일한 레벨의 이미지 뒤에 일부 콘텐츠를 추가하면 여전히 오류가 발생합니다. 이미지를 제거해도 괜찮고 이미지가 문서에 기본 64가 아닌 경우에도 괜찮습니다. 이미지를 사용해도 여전히 실패하므로 이미지 자체에는 문제가 없습니다.

답변1

XML 요소가 너무 커서 구문 분석할 수 없는 것 같습니다.

로부터파서.clibxml2의 소스 코드에서 이 오류가 생성되는 위치를 확인할 수 있습니다.

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

한도XML_MAX_LOOKUP_LIMIT에 설정되어 있습니다파서내부.h 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

따라서 7.15MB보다 큰 이미지, 즉 XML로 base64로 인코딩된 이미지는 예외가 발생할 것으로 예상됩니다. 이 한도를 확인해 주시겠어요?

postgresql DB가 아닌 애플리케이션 서버에서 XML을 파싱하거나, 더 작은 이미지를 사용해야 한다고 생각합니다.

관련 정보