diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index 4bd80d580..6a3d30f1c 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs @@ -1333,6 +1333,12 @@ pub trait Dialect: Debug + Any { false } + /// Returns true if this dialect supports `PROC` as an abbreviation for + /// `PROCEDURE` in a `CREATE` statement. + fn supports_create_proc_syntax(&self) -> bool { + false + } + /// Returns true if the dialect accepts a comma-separated list of table-level /// options placed between the table name and the column-list parenthesis, e.g. /// diff --git a/src/dialect/mssql.rs b/src/dialect/mssql.rs index 980b63d28..06a07b61d 100644 --- a/src/dialect/mssql.rs +++ b/src/dialect/mssql.rs @@ -71,6 +71,10 @@ impl Dialect for MsSqlDialect { true } + fn supports_create_proc_syntax(&self) -> bool { + true + } + fn supports_connect_by(&self) -> bool { true } diff --git a/src/keywords.rs b/src/keywords.rs index 7b91eecba..deae7bbd9 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -820,6 +820,7 @@ define_keywords!( PRINT, PRIOR, PRIVILEGES, + PROC, PROCEDURE, PROCESSLIST, PROFILE, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index f7fc6d33b..b8238843a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5366,7 +5366,9 @@ impl<'a> Parser<'a> { self.parse_create_collation().map(Into::into) } else if self.parse_keyword(Keyword::TYPE) { self.parse_create_type() - } else if self.parse_keyword(Keyword::PROCEDURE) { + } else if self.parse_keyword(Keyword::PROCEDURE) + || self.dialect.supports_create_proc_syntax() && self.parse_keyword(Keyword::PROC) + { self.parse_create_procedure(or_alter) } else if self.parse_keyword(Keyword::CONNECTOR) { self.parse_create_connector().map(Into::into) diff --git a/tests/sqlparser_mssql.rs b/tests/sqlparser_mssql.rs index 4510f953e..d978f4a69 100644 --- a/tests/sqlparser_mssql.rs +++ b/tests/sqlparser_mssql.rs @@ -2941,3 +2941,20 @@ fn parse_bracket_quoted_function_argument_name() { }]) ); } + +#[test] +fn parse_create_proc() { + ms().one_statement_parses_to( + "CREATE PROC test AS BEGIN SELECT 1; END", + "CREATE PROCEDURE test AS BEGIN SELECT 1; END", + ); + ms().one_statement_parses_to( + "CREATE OR ALTER PROC test AS BEGIN SELECT 1; END", + "CREATE OR ALTER PROCEDURE test AS BEGIN SELECT 1; END", + ); + + TestedDialects::new(vec![Box::new(GenericDialect {})]) + .parse_sql_statements("CREATE PROC test AS BEGIN SELECT 1; END") + .expect_err("PROC should remain MSSQL-specific"); + ms_and_generic().verified_stmt("SELECT proc FROM jobs"); +}