mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-09 21:42:05 +00:00
Add support for PRINT
statement for SQL Server (#1811)
This commit is contained in:
parent
81d8909e00
commit
4a487290ce
5 changed files with 47 additions and 1 deletions
|
@ -4054,6 +4054,12 @@ pub enum Statement {
|
||||||
arguments: Vec<Expr>,
|
arguments: Vec<Expr>,
|
||||||
options: Vec<RaisErrorOption>,
|
options: Vec<RaisErrorOption>,
|
||||||
},
|
},
|
||||||
|
/// ```sql
|
||||||
|
/// PRINT msg_str | @local_variable | string_expr
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// See: <https://learn.microsoft.com/en-us/sql/t-sql/statements/print-transact-sql>
|
||||||
|
Print(PrintStatement),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||||
|
@ -5745,7 +5751,7 @@ impl fmt::Display for Statement {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Statement::Print(s) => write!(f, "{s}"),
|
||||||
Statement::List(command) => write!(f, "LIST {command}"),
|
Statement::List(command) => write!(f, "LIST {command}"),
|
||||||
Statement::Remove(command) => write!(f, "REMOVE {command}"),
|
Statement::Remove(command) => write!(f, "REMOVE {command}"),
|
||||||
}
|
}
|
||||||
|
@ -9211,6 +9217,19 @@ pub enum CopyIntoSnowflakeKind {
|
||||||
Location,
|
Location,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
|
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
|
||||||
|
pub struct PrintStatement {
|
||||||
|
pub message: Box<Expr>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for PrintStatement {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "PRINT {}", self.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
|
@ -519,6 +519,7 @@ impl Spanned for Statement {
|
||||||
Statement::UNLISTEN { .. } => Span::empty(),
|
Statement::UNLISTEN { .. } => Span::empty(),
|
||||||
Statement::RenameTable { .. } => Span::empty(),
|
Statement::RenameTable { .. } => Span::empty(),
|
||||||
Statement::RaisError { .. } => Span::empty(),
|
Statement::RaisError { .. } => Span::empty(),
|
||||||
|
Statement::Print { .. } => Span::empty(),
|
||||||
Statement::List(..) | Statement::Remove(..) => Span::empty(),
|
Statement::List(..) | Statement::Remove(..) => Span::empty(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -686,6 +686,7 @@ define_keywords!(
|
||||||
PRESERVE,
|
PRESERVE,
|
||||||
PREWHERE,
|
PREWHERE,
|
||||||
PRIMARY,
|
PRIMARY,
|
||||||
|
PRINT,
|
||||||
PRIOR,
|
PRIOR,
|
||||||
PRIVILEGES,
|
PRIVILEGES,
|
||||||
PROCEDURE,
|
PROCEDURE,
|
||||||
|
|
|
@ -617,6 +617,7 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
// `COMMENT` is snowflake specific https://docs.snowflake.com/en/sql-reference/sql/comment
|
// `COMMENT` is snowflake specific https://docs.snowflake.com/en/sql-reference/sql/comment
|
||||||
Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
|
Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
|
||||||
|
Keyword::PRINT => self.parse_print(),
|
||||||
_ => self.expected("an SQL statement", next_token),
|
_ => self.expected("an SQL statement", next_token),
|
||||||
},
|
},
|
||||||
Token::LParen => {
|
Token::LParen => {
|
||||||
|
@ -15056,6 +15057,13 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse [Statement::Print]
|
||||||
|
fn parse_print(&mut self) -> Result<Statement, ParserError> {
|
||||||
|
Ok(Statement::Print(PrintStatement {
|
||||||
|
message: Box::new(self.parse_expr()?),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
/// Consume the parser and return its underlying token buffer
|
/// Consume the parser and return its underlying token buffer
|
||||||
pub fn into_tokens(self) -> Vec<TokenWithSpan> {
|
pub fn into_tokens(self) -> Vec<TokenWithSpan> {
|
||||||
self.tokens
|
self.tokens
|
||||||
|
|
|
@ -2053,3 +2053,20 @@ fn parse_drop_trigger() {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_print() {
|
||||||
|
let print_string_literal = "PRINT 'Hello, world!'";
|
||||||
|
let print_stmt = ms().verified_stmt(print_string_literal);
|
||||||
|
assert_eq!(
|
||||||
|
print_stmt,
|
||||||
|
Statement::Print(PrintStatement {
|
||||||
|
message: Box::new(Expr::Value(
|
||||||
|
(Value::SingleQuotedString("Hello, world!".to_string())).with_empty_span()
|
||||||
|
)),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let _ = ms().verified_stmt("PRINT N'Hello, ⛄️!'");
|
||||||
|
let _ = ms().verified_stmt("PRINT @my_variable");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue