mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-27 05:36:23 +00:00
MS SQL Server: add support for IDENTITY column option (#1432)
This commit is contained in:
parent
71318df8b9
commit
fb42425d51
4 changed files with 155 additions and 2 deletions
|
|
@ -1050,6 +1050,20 @@ impl fmt::Display for ColumnOptionDef {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
|
||||
pub struct IdentityProperty {
|
||||
pub seed: Expr,
|
||||
pub increment: Expr,
|
||||
}
|
||||
|
||||
impl fmt::Display for IdentityProperty {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "{}, {}", self.seed, self.increment)
|
||||
}
|
||||
}
|
||||
|
||||
/// `ColumnOption`s are modifiers that follow a column definition in a `CREATE
|
||||
/// TABLE` statement.
|
||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||
|
|
@ -1120,6 +1134,13 @@ pub enum ColumnOption {
|
|||
/// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#view_column_option_list
|
||||
/// [2]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#column_option_list
|
||||
Options(Vec<SqlOption>),
|
||||
/// MS SQL Server specific: Creates an identity column in a table.
|
||||
/// Syntax
|
||||
/// ```sql
|
||||
/// IDENTITY [ (seed , increment) ]
|
||||
/// ```
|
||||
/// [MS SQL Server]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property
|
||||
Identity(Option<IdentityProperty>),
|
||||
}
|
||||
|
||||
impl fmt::Display for ColumnOption {
|
||||
|
|
@ -1221,6 +1242,13 @@ impl fmt::Display for ColumnOption {
|
|||
Options(options) => {
|
||||
write!(f, "OPTIONS({})", display_comma_separated(options))
|
||||
}
|
||||
Identity(parameters) => {
|
||||
write!(f, "IDENTITY")?;
|
||||
if let Some(parameters) = parameters {
|
||||
write!(f, "({parameters})")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ pub use self::dcl::{AlterRoleOperation, ResetConfig, RoleOption, SetConfigValue,
|
|||
pub use self::ddl::{
|
||||
AlterColumnOperation, AlterIndexOperation, AlterTableOperation, ClusteredBy, ColumnDef,
|
||||
ColumnOption, ColumnOptionDef, ConstraintCharacteristics, Deduplicate, DeferrableInitial,
|
||||
GeneratedAs, GeneratedExpressionMode, IndexOption, IndexType, KeyOrIndexDisplay, Owner,
|
||||
Partition, ProcedureParam, ReferentialAction, TableConstraint,
|
||||
GeneratedAs, GeneratedExpressionMode, IdentityProperty, IndexOption, IndexType,
|
||||
KeyOrIndexDisplay, Owner, Partition, ProcedureParam, ReferentialAction, TableConstraint,
|
||||
UserDefinedTypeCompositeAttributeDef, UserDefinedTypeRepresentation, ViewColumnDef,
|
||||
};
|
||||
pub use self::dml::{CreateIndex, CreateTable, Delete, Insert};
|
||||
|
|
|
|||
|
|
@ -6069,6 +6069,20 @@ impl<'a> Parser<'a> {
|
|||
&& dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
|
||||
{
|
||||
self.parse_optional_column_option_as()
|
||||
} else if self.parse_keyword(Keyword::IDENTITY)
|
||||
&& dialect_of!(self is MsSqlDialect | GenericDialect)
|
||||
{
|
||||
let property = if self.consume_token(&Token::LParen) {
|
||||
let seed = self.parse_number()?;
|
||||
self.expect_token(&Token::Comma)?;
|
||||
let increment = self.parse_number()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
|
||||
Some(IdentityProperty { seed, increment })
|
||||
} else {
|
||||
None
|
||||
};
|
||||
Ok(Some(ColumnOption::Identity(property)))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue