Änderungen am XML-Verhalten beim Parsen und Emittieren (Ausstehend)

Achtung

Diese Verhaltensänderung ist in Bundle 2025_01 enthalten.

Den aktuellen Status des Bundles finden Sie unter Bundle-Verlauf.

Wenn dieses Verhaltensänderungs-Bundle aktiviert ist, ändert sich das Parsen und Emittieren von XML-Inhalten bei der Verwendung des Befehls COPY INTO <Tabelle> mit dem XML-Dateiformat und beim Aufruf der folgenden Funktionen:

Vor der Änderung:

XML-Verhalten beim Parsen und Emittieren:

  • Einige Abfragen, welche die Funktion CHECK_XML aufrufen, geben eine Zeichenfolge mit einer Fehlermeldung zurück.

  • Einige Abfragen, welche die Funktion PARSE_XML aufrufen, schlagen fehl.

Nach der Änderung:

XML-Verhalten beim Parsen und Emittieren:

  • Einige Abfragen, die vor der Änderung beim Aufruf der Funktion CHECK_XML eine Zeichenfolge mit einer Fehlermeldung zurückgaben, geben nun NULL zurück.

  • Einige Abfragen, die beim Aufruf der Funktion PARSE_XML vor der Änderung fehlgeschlagen sind, sind jetzt erfolgreich, und die Funktion gibt das geparste XML zurück.

  • Abfragen mit XML-Zeichenfolgen, die spitze Klammern oder Apostrophe enthalten, liefern nach der Änderung andere Ergebnisse.

  • Abfragen mit XML-Zeichenfolgen, die Leerzeichen enthalten, oder XML-Attribute, die sich auf die Erhaltung von Leerzeichen beziehen, liefern nach der Änderung andere Ergebnisse.

In den folgenden Abschnitten finden Sie weitere Einzelheiten zu den Änderungen.

Parsen von XML-Inhalt, der Verarbeitungsanweisungen enthält

Das folgende Beispiel verwendet die Funktion PARSE_XML, um XML-Inhalt mit Fragezeichen in den Verarbeitungsanweisungen zu parsen:

SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
Copy
Vor der Änderung zurückgegeben::
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
Nach der Änderung zurückgegeben::
+-----------------+
| MYTAG           |
|-----------------|
| <mytag></mytag> |
+-----------------+

Parsen von XML-Inhalten, die spitze Klammern oder Apostrophe enthalten

Im folgenden Beispiel wird die Funktion PARSE_XML verwendet, um XML-Inhalt zu parsen, der spitze Klammern und Apostrophe in XML-Attributwerten enthält. Nach der Änderung werden Apostrophe und spitze Klammern in den XML-Attributwerten im Rückgabewert und im emittierten XML korrekt mit Escape-Zeichen versehen:

SELECT PARSE_XML('<mytag myattr="&lt;&gt;\'"/>') AS mytag;
Copy
Vor der Änderung zurückgegeben::
+------------------------------+
| MYTAG                        |
|------------------------------|
| <mytag myattr="<>'"></mytag> |
+------------------------------+
Nach der Änderung zurückgegeben::
+-----------------------------------------+
| MYTAG                                   |
|-----------------------------------------|
| <mytag myattr="&lt;&gt;&apos;"></mytag> |
+-----------------------------------------+

Parsen von XML-Inhalt, der benutzerdefinierte Entitäten enthält

Das folgende Beispiel verwendet die Funktion PARSE_XML zum Parsen von XML-Inhalt, der benutzerdefinierte Entitäten enthält:

SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
  AS placeholder;
Copy
Vor der Änderung zurückgegeben::
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
Nach der Änderung zurückgegeben::
+-------------------------------------------------------------+
| PLACEHOLDER                                                 |
|-------------------------------------------------------------|
| <!DOCTYPE doc [<!ENTITY placeholder "some                   |
| text">]><doc>some text</doc>                                |
+-------------------------------------------------------------+

Parsen von XML-Inhalt, der Leerzeichen bewahrt

Diese Änderung wurde vorgenommen, damit das Verhalten in Snowflake mit der XML-Spezifikation hinsichtlich der Erhaltung von Leerzeichen übereinstimmt:

  • Vor der Änderung bleiben Leerzeichen für das Attribut xsl:space="preserve" erhalten. Nach der Änderung bleiben Leerzeichen für das Attribut xsl:space="preserve" nicht erhalten.

  • Vor der Änderung wurden für das Attribut xml:space="preserve" keine Leerzeichen beibehalten. Nach der Änderung bleiben Leerzeichen für das Attribut xml:space="preserve" erhalten.

Das folgende Beispiel verwendet die Funktion PARSE_XML, um den XML-Inhalt zu parsen, und gibt das Attribut xsl:space="preserve" an:

SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
Vor der Änderung zurückgegeben::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
Nach der Änderung zurückgegeben::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve">my content</mytag>   |
+--------------------------------------------------+

Das folgende Beispiel verwendet die Funktion PARSE_XML, um den XML-Inhalt zu parsen, und gibt das Attribut xml:space="preserve" an:

SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
  AS space_preserve;
Copy
Vor der Änderung zurückgegeben::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve">my content</mytag>   |
+--------------------------------------------------+
Nach der Änderung zurückgegeben::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

Laden von XML-Inhalt, der Leerzeichen bewahrt

Im folgenden Beispiel werden mit dem Befehl COPY INTO <table> Daten in eine Tabelle geladen. Der Parameter PRESERVE_SPACE ist auf TRUE eingestellt, um Leerzeichen zu bewahren:

COPY INTO mytable
  FROM @my_xml_stage
  FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
Copy
Geladener Inhalt vor der Änderung::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xsl:space="preserve"> my content </mytag> |
+--------------------------------------------------+
Geladener Inhalt nach der Änderung::
+--------------------------------------------------+
| SPACE_PRESERVE                                   |
|--------------------------------------------------|
| <mytag xml:space="preserve"> my content </mytag> |
+--------------------------------------------------+

Vor und nach der Änderung behält der Inhalt Leerzeichen bei, aber das Attribut ändert sich von xsl:space="preserve" zu xml:space="preserve".

Ref: 1862