Support row_alias and col_aliases in INSERT statement for mysql and generic dialects (#1136)

This commit is contained in:
Mehmet Emin KARAKAŞ 2024-03-08 23:03:49 +03:00 committed by GitHub
parent 5da66adda9
commit 11899fd0cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 148 additions and 4 deletions

View file

@ -1759,6 +1759,8 @@ pub enum Statement {
replace_into: bool,
/// Only for mysql
priority: Option<MysqlInsertPriority>,
/// Only for mysql
insert_alias: Option<InsertAliases>,
},
/// ```sql
/// INSTALL
@ -2773,6 +2775,7 @@ impl fmt::Display for Statement {
returning,
replace_into,
priority,
insert_alias,
} => {
let table_name = if let Some(alias) = table_alias {
format!("{table_name} AS {alias}")
@ -2822,6 +2825,16 @@ impl fmt::Display for Statement {
write!(f, "DEFAULT VALUES")?;
}
if let Some(insert_alias) = insert_alias {
write!(f, " AS {0}", insert_alias.row_alias)?;
if let Some(col_aliases) = &insert_alias.col_aliases {
if !col_aliases.is_empty() {
write!(f, " ({})", display_comma_separated(col_aliases))?;
}
}
}
if let Some(on) = on {
write!(f, "{on}")?;
}
@ -4194,6 +4207,14 @@ pub enum OnInsert {
OnConflict(OnConflict),
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub struct InsertAliases {
pub row_alias: ObjectName,
pub col_aliases: Option<Vec<Ident>>,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]

View file

@ -8419,6 +8419,19 @@ impl<'a> Parser<'a> {
(columns, partitioned, after_columns, source)
};
let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
&& self.parse_keyword(Keyword::AS)
{
let row_alias = self.parse_object_name(false)?;
let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
Some(InsertAliases {
row_alias,
col_aliases,
})
} else {
None
};
let on = if self.parse_keyword(Keyword::ON) {
if self.parse_keyword(Keyword::CONFLICT) {
let conflict_target =
@ -8488,6 +8501,7 @@ impl<'a> Parser<'a> {
returning,
replace_into,
priority,
insert_alias,
})
}
}