From 04545c4ce43a9c6909c7a7c9e28862ba21a4ddd8 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 22 Aug 2026 13:39:32 +0800 Subject: [PATCH] MSSQL: Support PROC as CREATE PROCEDURE abbreviation --- src/dialect/mod.rs | 6 ++++++ src/dialect/mssql.rs | 4 ++++ src/keywords.rs | 1 + src/parser/mod.rs | 4 +++- tests/sqlparser_mssql.rs | 17 +++++++++++++++++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index c196913c1a..76fa5d7666 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs @@ -1310,6 +1310,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 980b63d289..06a07b61d8 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 7b91eecba0..deae7bbd94 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 6fd25b9eb7..5044c083fd 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5359,7 +5359,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 4510f953e5..d978f4a69a 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"); +}