Skip to content

Commit 6c11bb9

Browse files
committed
add support for [NOT] NULL in xml columns
1 parent 82dff42 commit 6c11bb9

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

src/ast/query.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3142,8 +3142,8 @@ pub enum XmlTableColumnOption {
31423142
path: Option<Expr>,
31433143
/// Default value if path does not match
31443144
default: Option<Expr>,
3145-
// TODO: Add NULL ON EMPTY / ERROR handling if needed later
3146-
// TODO: Add NOT NULL / NULL constraints
3145+
/// Whether the column is nullable (NULL=true, NOT NULL=false)
3146+
nullable: bool,
31473147
},
31483148
/// The FOR ORDINALITY marker
31493149
ForOrdinality,
@@ -3179,6 +3179,7 @@ impl fmt::Display for XmlTableColumn {
31793179
r#type,
31803180
path,
31813181
default,
3182+
nullable,
31823183
} => {
31833184
write!(f, " {}", r#type)?;
31843185
if let Some(p) = path {
@@ -3187,6 +3188,9 @@ impl fmt::Display for XmlTableColumn {
31873188
if let Some(d) = default {
31883189
write!(f, " DEFAULT {}", d)?;
31893190
}
3191+
if !*nullable {
3192+
write!(f, " NOT NULL")?;
3193+
}
31903194
Ok(())
31913195
}
31923196
XmlTableColumnOption::ForOrdinality => {

src/parser/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12378,12 +12378,17 @@ impl<'a> Parser<'a> {
1237812378
default = Some(self.parse_expr()?);
1237912379
}
1238012380

12381-
// TODO: Parse NOT NULL/NULL constraints
12381+
let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
12382+
if !not_null {
12383+
// NULL is the default but can be specified explicitly
12384+
let _ = self.parse_keyword(Keyword::NULL);
12385+
}
1238212386

1238312387
XmlTableColumnOption::NamedInfo {
1238412388
r#type,
1238512389
path,
1238612390
default,
12391+
nullable: !not_null,
1238712392
}
1238812393
};
1238912394
Ok(XmlTableColumn { name, option })

tests/sqlparser_common.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11742,6 +11742,11 @@ fn test_xmltable() {
1174211742
// Test using subqueries
1174311743
all_dialects().verified_only_select("SELECT y FROM XMLTABLE((SELECT '/X') PASSING (SELECT CAST('<X><y>z</y></X>' AS xml)) COLUMNS y TEXT PATH (SELECT 'y'))");
1174411744

11745+
// NOT NULL
11746+
all_dialects().verified_only_select(
11747+
"SELECT y FROM XMLTABLE('/X' PASSING '<X></X>' COLUMNS y TEXT NOT NULL)",
11748+
);
11749+
1174511750
all_dialects().verified_only_select("SELECT * FROM XMLTABLE('/root/row' PASSING xmldata COLUMNS id INT PATH '@id', name TEXT PATH 'name/text()', value FLOAT PATH 'value')");
1174611751

1174711752
all_dialects().verified_only_select("SELECT * FROM XMLTABLE('//ROWS/ROW' PASSING data COLUMNS row_num FOR ORDINALITY, id INT PATH '@id', name TEXT PATH 'NAME' DEFAULT 'unnamed')");

0 commit comments

Comments
 (0)