@@ -17343,7 +17343,9 @@ fn test_select_exclude() {
1734317343 SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
1734417344 assert_eq!(
1734517345 *opt_exclude,
17346- Some(ExcludeSelectItem::Single(Ident::new("c1")))
17346+ Some(ExcludeSelectItem::Single(ObjectName::from(Ident::new(
17347+ "c1"
17348+ ))))
1734717349 );
1734817350 }
1734917351 _ => unreachable!(),
@@ -17356,8 +17358,8 @@ fn test_select_exclude() {
1735617358 assert_eq!(
1735717359 *opt_exclude,
1735817360 Some(ExcludeSelectItem::Multiple(vec![
17359- Ident::new("c1"),
17360- Ident::new("c2")
17361+ ObjectName::from( Ident::new("c1") ),
17362+ ObjectName::from( Ident::new("c2")),
1736117363 ]))
1736217364 );
1736317365 }
@@ -17368,7 +17370,9 @@ fn test_select_exclude() {
1736817370 SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
1736917371 assert_eq!(
1737017372 *opt_exclude,
17371- Some(ExcludeSelectItem::Single(Ident::new("c1")))
17373+ Some(ExcludeSelectItem::Single(ObjectName::from(Ident::new(
17374+ "c1"
17375+ ))))
1737217376 );
1737317377 }
1737417378 _ => unreachable!(),
@@ -17390,7 +17394,9 @@ fn test_select_exclude() {
1739017394 }
1739117395 assert_eq!(
1739217396 select.exclude,
17393- Some(ExcludeSelectItem::Single(Ident::new("c1")))
17397+ Some(ExcludeSelectItem::Single(ObjectName::from(Ident::new(
17398+ "c1"
17399+ ))))
1739417400 );
1739517401
1739617402 let dialects = all_dialects_where(|d| {
@@ -17401,7 +17407,9 @@ fn test_select_exclude() {
1740117407 SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
1740217408 assert_eq!(
1740317409 *opt_exclude,
17404- Some(ExcludeSelectItem::Single(Ident::new("c1")))
17410+ Some(ExcludeSelectItem::Single(ObjectName::from(Ident::new(
17411+ "c1"
17412+ ))))
1740517413 );
1740617414 }
1740717415 _ => unreachable!(),
@@ -17438,6 +17446,32 @@ fn test_select_exclude() {
1743817446 );
1743917447}
1744017448
17449+ #[test]
17450+ fn test_select_exclude_qualified_names() {
17451+ // EXCLUDE should accept qualified names like `f.col` parsed as ObjectName.
17452+ let dialects = all_dialects_where(|d| d.supports_select_wildcard_exclude());
17453+
17454+ // Qualified name in multi-column EXCLUDE list: f.* EXCLUDE (f.col1, f.col2)
17455+ let select = dialects
17456+ .verified_only_select("SELECT f.* EXCLUDE (f.account_canonical_id, f.amount) FROM t AS f");
17457+ match &select.projection[0] {
17458+ SelectItem::QualifiedWildcard(_, WildcardAdditionalOptions { opt_exclude, .. }) => {
17459+ assert_eq!(
17460+ *opt_exclude,
17461+ Some(ExcludeSelectItem::Multiple(vec![
17462+ ObjectName::from(vec![Ident::new("f"), Ident::new("account_canonical_id")]),
17463+ ObjectName::from(vec![Ident::new("f"), Ident::new("amount")]),
17464+ ]))
17465+ );
17466+ }
17467+ _ => unreachable!(),
17468+ }
17469+
17470+ // Plain identifiers must still parse successfully.
17471+ dialects.verified_only_select("SELECT f.* EXCLUDE (account_canonical_id) FROM t AS f");
17472+ dialects.verified_only_select("SELECT f.* EXCLUDE (col1, col2) FROM t AS f");
17473+ }
17474+
1744117475#[test]
1744217476fn test_no_semicolon_required_between_statements() {
1744317477 let sql = r#"
0 commit comments