Skip to content

Fix FOR XML RAW('') empty element name handling and all-NULL row outp…#4689

Merged
Deepesh125 merged 3 commits intobabelfish-for-postgresql:BABEL_6_X_DEVfrom
JapleenKaur3:raw-fix-6x
Apr 3, 2026
Merged

Fix FOR XML RAW('') empty element name handling and all-NULL row outp…#4689
Deepesh125 merged 3 commits intobabelfish-for-postgresql:BABEL_6_X_DEVfrom
JapleenKaur3:raw-fix-6x

Conversation

@JapleenKaur3
Copy link
Copy Markdown
Contributor

Description

Fix FOR XML RAW behavior with empty element name and all-NULL rows

Changes are in tsql_row_to_xml_raw() in forxml.c. When element_name is empty, the opening and closing wrapper tags are now skipped in ELEMENTS mode (same approach as PATH mode). For attribute-centric mode (without ELEMENTS), an error is raised since empty row tag names are not valid. The self-closing tag logic for all-NULL rows was also corrected.

Authored-by: Japleen Kaur amjj@amazon.com
Signed-off-by: Japleen Kaur amjj@amazon.com

Cherry-picked from - #4680

Issues Resolved

JIRA : BABEL-6379

  1. FOR XML RAW(''), ELEMENTS — Babelfish produced <><a>1</a><b>2</b></> (invalid XML with empty wrapper tags). SQL Server produces <a>1</a><b>2</b> (no wrapper). Fixed by skipping the wrapper tag when element name is empty, consistent with how PATH('') handles it.

  2. FOR XML RAW('') (without ELEMENTS) — Babelfish produced < a="1" b="2"/> (invalid XML). SQL Server throws: "Row tag omission (empty row tag name) cannot be used with attribute-centric FOR XML serialization." Fixed by adding the same error that PATH mode already throws for this case.

  3. All-NULL rows with ELEMENTS — Babelfish produced <row></row>. SQL Server produces<row/> (self-closing tag). Fixed by replacing the closing > of the opening tag with /> when all columns are NULL.

Test Scenarios Covered

  • Use case based -
    RAW(''), ELEMENTS without wrapper tag, RAW('') error without ELEMENTS, all-NULL rows producing .

  • Boundary conditions -
    Empty element name (RAW('')).

  • Arbitrary inputs -
    N/A

  • Negative test cases -
    N/A

  • Minor version upgrade tests -
    N/A

  • Major version upgrade tests -
    N/A

  • Performance tests -
    N/A

  • Tooling impact -
    N/A

  • Client tests -
    N/A

Check List

  • Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is under the terms of the Apache 2.0 and PostgreSQL licenses, and grant any person obtaining a copy of the contribution permission to relicense all or a portion of my contribution to the PostgreSQL License solely to contribute all or a portion of my contribution to the PostgreSQL open source project.

For more information on following Developer Certificate of Origin and signing off your commits, please check here.

JapleenKaur3 and others added 3 commits March 31, 2026 09:06
…ut (babelfish-for-postgresql#4680)

Changes are in tsql_row_to_xml_raw() in forxml.c. When element_name is empty, the opening and closing wrapper
tags are now skipped in ELEMENTS mode (same approach as PATH mode). For attribute-centric mode (without
ELEMENTS), an error is raised since empty row tag names are not valid.

The self-closing tag logic for all-NULL rows was also corrected.

Task: BABEL-6379
Signed-off-by: Japleen Kaur <amjj@amazon.com>
@Deepesh125 Deepesh125 merged commit 76a6d4b into babelfish-for-postgresql:BABEL_6_X_DEV Apr 3, 2026
48 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants