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;
- 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="<>\'"/>') AS mytag;
- Retornado antes da mudança::
+------------------------------+ | MYTAG | |------------------------------| | <mytag myattr="<>'"></mytag> | +------------------------------+
- Retornado após a mudança::
+-----------------------------------------+ | MYTAG | |-----------------------------------------| | <mytag myattr="<>'"></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;
- 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 atributoxsl: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 atributoxml: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;
- 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;
- 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);
- 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