Alterações no comportamento de análise e emissão de XML (Pendente)

Atenção

Essa mudança de comportamento está no pacote 2025_01.

Para saber o status atual do pacote, consulte Histórico do pacote.

Quando esse pacote de alteração de comportamento está ativado, a análise e a emissão do conteúdo XML são alteradas ao usar o comando COPY INTO <tabela> com o formato de arquivo XML e ao chamar as seguintes funções:

Antes da mudança:

Comportamento de análise e emissão de XML:

  • Algumas consultas que chamam a função CHECK_XML retornam uma cadeia de caracteres com uma mensagem de erro.

  • Algumas consultas que chamam a função PARSE_XML falham.

Após a mudança:

Comportamento de análise e emissão de XML:

  • Algumas consultas que retornavam uma cadeia de caracteres com uma mensagem de erro ao chamar a função CHECK_XML antes da alteração agora retornam NULL.

  • Algumas consultas que falharam ao chamar a função PARSE_XML antes da alteração agora são bem-sucedidas, e a função retorna o XML analisado.

  • Consultas com cadeias de caracteres XML contendo colchetes angulares ou apóstrofos retornam resultados diferentes após a alteração.

  • Consultas com cadeias de caracteres XML contendo espaço em branco ou atributos XML relacionados à preservação de espaço em branco retornam resultados diferentes após a alteração.

As seções a seguir fornecem mais detalhes sobre as alterações.

Análise do conteúdo XML que contém instruções de processamento

O exemplo a seguir usa a função PARSE_XML para analisar o conteúdo XML com pontos de interrogação nas instruções de processamento:

SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
Copy
Retornado antes da mudança::
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
Retornado após a mudança::
+-----------------+
| MYTAG           |
|-----------------|
| <mytag></mytag> |
+-----------------+

Análise do conteúdo XML que contém colchetes angulares ou apóstrofos

O exemplo a seguir usa a função PARSE_XML para analisar o conteúdo XML que contém colchetes angulares e apóstrofos nos valores de atributos XML. Após a alteração, os apóstrofos e os colchetes angulares nos valores do atributo XML são escapados corretamente no valor de retorno e no XML emitido:

SELECT PARSE_XML('<mytag myattr="&lt;&gt;\'"/>') AS mytag;
Copy
Retornado antes da mudança::
+------------------------------+
| MYTAG                        |
|------------------------------|
| <mytag myattr="<>'"></mytag> |
+------------------------------+
Retornado após a mudança::
+-----------------------------------------+
| MYTAG                                   |
|-----------------------------------------|
| <mytag myattr="&lt;&gt;&apos;"></mytag> |
+-----------------------------------------+

Análise do conteúdo XML que contém entidades definidas pelo usuário

O exemplo a seguir usa a função PARSE_XML para analisar o conteúdo XML que contém entidades definidas pelo usuário:

SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
  AS placeholder;
Copy
Retornado antes da mudança::
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
Retornado após a mudança::
+-------------------------------------------------------------+
| PLACEHOLDER                                                 |
|-------------------------------------------------------------|
| <!DOCTYPE doc [<!ENTITY placeholder "some                   |
| text">]><doc>some text</doc>                                |
+-------------------------------------------------------------+

Análise do conteúdo XML que preserva espaços em branco

Essa alteração foi feita para que o comportamento no Snowflake corresponda à especificação XML com relação à preservação de espaços em branco:

  • Antes da alteração, os espaços em branco eram preservados para o atributo xsl:space="preserve". Após a alteração, os espaços em branco não são preservados para o atributo xsl:space="preserve".

  • Antes da alteração, os espaços em branco não eram preservados para o atributo xml:space="preserve". Após a alteração, os espaços em branco são preservados para o atributo xml:space="preserve".

O exemplo a seguir usa a função PARSE_XML para analisar o conteúdo XML e especifica o atributo xsl:space="preserve":

SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
Retornado antes da mudança::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
Retornado após a mudança::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve">my content</mytag>   |
+--------------------------------------------------+

O exemplo a seguir usa a função PARSE_XML para analisar o conteúdo XML e especifica o atributo xml:space="preserve":

SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
Retornado antes da mudança::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve">my content</mytag>   |
+--------------------------------------------------+
Retornado após a mudança::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

Carregamento do conteúdo XML que preserva espaços em branco

O exemplo a seguir carrega dados em uma tabela usando o comando COPY INTO <table>. O parâmetro PRESERVE_SPACE é definido como TRUE para preservar espaços em branco:

COPY INTO mytable
  FROM @my_xml_stage
  FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
Copy
Conteúdo carregado antes da alteração::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
Conteúdo carregado após a alteração::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

Antes e depois da alteração, o conteúdo preserva espaços em branco, mas o atributo muda de xsl:space="preserve" para xml:space="preserve".

Ref: 1862