XML 구문 분석 및 방출 동작 변경 사항(보류 중)

주의

이 동작 변경 사항은 2025_01 번들에 있습니다.

번들의 현재 상태는 번들 기록 섹션을 참조하십시오.

이 동작 변경 번들을 활성화하면 COPY INTO <테이블> 명령을 XML 파일 형식으로 사용할 때와 다음 함수를 호출할 때 XML 내용을 구문 분석하고 출력하는 방식이 변경됩니다.

변경 전:

XML 구문 분석 및 방출 동작:

  • CHECK_XML 함수를 호출하는 일부 쿼리는 오류 메시지와 함께 문자열을 반환합니다.

  • PARSE_XML 함수를 호출하는 일부 쿼리가 실패합니다.

변경 후:

XML 구문 분석 및 방출 동작:

  • 변경 전 CHECK_XML 함수를 호출할 때 오류 메시지와 함께 문자열을 반환하던 일부 쿼리가 이제는 NULL 을 반환합니다.

  • 변경 전 PARSE_XML 함수를 호출할 때 실패했던 일부 쿼리가 이제 성공하며, 함수는 구문 분석된 XML 을 반환합니다.

  • 대괄호 또는 아포스트로피를 포함하는 XML 문자열이 포함된 쿼리는 변경 후 다른 결과를 반환합니다.

  • 공백이 포함된 XML 문자열 또는 공백 보존과 관련된 XML 특성이 있는 쿼리는 변경 후 다른 결과를 반환합니다.

다음 섹션에서 변경 사항에 대한 자세한 내용을 확인할 수 있습니다.

처리 지침이 포함된 XML 내용 구문 분석하기

다음은 PARSE_XML 함수를 사용하여 처리 지침에 물음표가 있는 XML 내용을 구문 분석하는 예입니다.

SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
Copy
변경 전에 반환되었습니다.:
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
변경 후에 반환되었습니다.:
+-----------------+
| MYTAG           |
|-----------------|
| <mytag></mytag> |
+-----------------+

꺾쇠 괄호 또는 아포스트로피가 포함된 XML 내용 구문 분석하기

다음은 PARSE_XML 함수를 사용하여 XML 특성 값에 꺾쇠 괄호와 아포스트로피를 포함하는 XML 내용을 구문 분석하는 예입니다. 변경 후 XML 특성 값의 아포스트로피와 꺾쇠 괄호는 반환 값과 전송된 XML에서 올바르게 이스케이프 처리됩니다.

SELECT PARSE_XML('<mytag myattr="&lt;&gt;\'"/>') AS mytag;
Copy
변경 전에 반환되었습니다.:
+------------------------------+
| MYTAG                        |
|------------------------------|
| <mytag myattr="<>'"></mytag> |
+------------------------------+
변경 후에 반환되었습니다.:
+-----------------------------------------+
| MYTAG                                   |
|-----------------------------------------|
| <mytag myattr="&lt;&gt;&apos;"></mytag> |
+-----------------------------------------+

사용자 정의 엔터티가 포함된 XML 내용 구문 분석하기

다음 예에서는 PARSE_XML 함수를 사용하여 사용자 정의 엔터티가 포함된 XML 내용을 구문 분석합니다.

SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
  AS placeholder;
Copy
변경 전에 반환되었습니다.:
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
변경 후에 반환되었습니다.:
+-------------------------------------------------------------+
| PLACEHOLDER                                                 |
|-------------------------------------------------------------|
| <!DOCTYPE doc [<!ENTITY placeholder "some                   |
| text">]><doc>some text</doc>                                |
+-------------------------------------------------------------+

공백을 보존하는 XML 내용 구문 분석하기

공백 보존에 관한 XML 사양 과 Snowflake의 동작이 일치하도록 이 변경이 이루어졌습니다.

  • 변경 전에는 xsl:space="preserve" 특성에 공백이 유지됩니다. 변경 후에는 xsl:space="preserve" 특성에 공백이 보존되지 않습니다.

  • 변경 전에는 xml:space="preserve" 특성에 공백이 보존되지 않았습니다. 변경 후 xml:space="preserve" 특성에는 공백이 유지됩니다.

다음은 PARSE_XML 함수를 사용하여 XML 내용을 구문 분석하고 xsl:space="preserve" 특성을 지정하는 예입니다.

SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
변경 전에 반환되었습니다.:
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
변경 후에 반환되었습니다.:
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve">my content</mytag>   |
+--------------------------------------------------+

다음은 PARSE_XML 함수를 사용하여 XML 내용을 구문 분석하고 xml:space="preserve" 특성을 지정하는 예입니다.

SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
변경 전에 반환되었습니다.:
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve">my content</mytag>   |
+--------------------------------------------------+
변경 후에 반환되었습니다.:
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

공백을 보존하는 XML 내용 로딩하기

다음은 COPY INTO <table> 명령을 사용하여 테이블에 데이터를 로딩하는 예입니다. PRESERVE_SPACE 매개 변수는 공백을 보존하기 위해 TRUE 로 설정됩니다.

COPY INTO mytable
  FROM @my_xml_stage
  FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
Copy
변경 전 로딩된 콘텐츠::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
변경 후 로딩된 콘텐츠::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

변경 전후의 내용은 공백을 유지하지만 특성은 xsl:space="preserve" 에서 xml:space="preserve" 로 변경됩니다.

참조: 1862

OSZAR »