XML の解析と出力の動作の変更(保留中)

注意

この動作変更は2025_01バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

この動作変更バンドルが有効な場合、 XML ファイル形式で COPY INTO <テーブル> コマンドを使用する際に、以下の関数を呼び出すと 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 コンテンツの解析

この変更は、Snowflakeの動作が、空白の保持に関する XML 仕様 と一致するように行われました。

  • 変更前は、 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