diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index cae0f597b..c7fb973fc 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -437,6 +437,7 @@ pub enum ColumnOption { DialectSpecific(Vec), CharacterSet(ObjectName), Comment(String), + OnUpdate(Expr), } impl fmt::Display for ColumnOption { @@ -471,6 +472,7 @@ impl fmt::Display for ColumnOption { DialectSpecific(val) => write!(f, "{}", display_separated(val, " ")), CharacterSet(n) => write!(f, "CHARACTER SET {}", n), Comment(v) => write!(f, "COMMENT '{}'", escape_single_quote_string(v)), + OnUpdate(expr) => write!(f, "ON UPDATE {}", expr), } } } diff --git a/src/parser.rs b/src/parser.rs index 108427889..e5870783d 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2919,11 +2919,10 @@ impl<'a> Parser<'a> { Token::make_keyword("AUTOINCREMENT"), ]))) } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE]) - && dialect_of!(self is MySqlDialect) + && dialect_of!(self is MySqlDialect | GenericDialect) { - Ok(Some(ColumnOption::DialectSpecific(vec![ - Token::make_keyword("ON UPDATE"), - ]))) + let expr = self.parse_expr()?; + Ok(Some(ColumnOption::OnUpdate(expr))) } else { Ok(None) } diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 8c42c715b..2659fd16b 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -1007,7 +1007,7 @@ fn parse_kill() { #[test] fn parse_table_colum_option_on_update() { - let sql1 = "CREATE TABLE foo (`modification_time` DATETIME ON UPDATE)"; + let sql1 = "CREATE TABLE foo (`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP())"; match mysql().verified_stmt(sql1) { Statement::CreateTable { name, columns, .. } => { assert_eq!(name.to_string(), "foo"); @@ -1018,9 +1018,13 @@ fn parse_table_colum_option_on_update() { collation: None, options: vec![ColumnOptionDef { name: None, - option: ColumnOption::DialectSpecific(vec![Token::make_keyword( - "ON UPDATE" - )]), + option: ColumnOption::OnUpdate(Expr::Function(Function { + name: ObjectName(vec![Ident::new("CURRENT_TIMESTAMP")]), + args: vec![], + over: None, + distinct: false, + special: false, + })), },], }], columns