Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4263,6 +4263,14 @@ pub enum Statement {
/// ```
/// [Redshift](https://docs.aws.amazon.com/redshift/latest/dg/r_VACUUM_command.html)
Vacuum(VacuumStatement),
/// Restore the value of a run-time parameter to the default value.
///
/// ```sql
/// RESET configuration_parameter;
/// RESET ALL;
/// ```
/// [PostgreSQL](https://www.postgresql.org/docs/current/sql-reset.html)
Reset(ResetStatement),
}

impl From<Analyze> for Statement {
Expand Down Expand Up @@ -5757,6 +5765,7 @@ impl fmt::Display for Statement {
Statement::AlterSchema(s) => write!(f, "{s}"),
Statement::Vacuum(s) => write!(f, "{s}"),
Statement::AlterUser(s) => write!(f, "{s}"),
Statement::Reset(s) => write!(f, "{s}"),
}
}
}
Expand Down Expand Up @@ -10519,6 +10528,38 @@ impl fmt::Display for VacuumStatement {
}
}

/// Variants of the RESET statement
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub enum Reset {
/// Resets all session parameters to their default values.
ALL,

/// Resets a specific session parameter to its default value.
ConfigurationParameter(ObjectName),
}

/// Resets a session parameter to its default value.
/// ```sql
/// RESET { ALL | <configuration_parameter> }
/// ```
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub struct ResetStatement {
pub reset: Reset,
}

impl fmt::Display for ResetStatement {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match &self.reset {
Reset::ALL => write!(f, "RESET ALL"),
Reset::ConfigurationParameter(param) => write!(f, "RESET {}", param),
}
}
}

impl From<Set> for Statement {
fn from(s: Set) -> Self {
Self::Set(s)
Expand Down Expand Up @@ -10759,6 +10800,12 @@ impl From<VacuumStatement> for Statement {
}
}

impl From<ResetStatement> for Statement {
fn from(r: ResetStatement) -> Self {
Self::Reset(r)
}
}

#[cfg(test)]
mod tests {
use crate::tokenizer::Location;
Expand Down
1 change: 1 addition & 0 deletions src/ast/spans.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,7 @@ impl Spanned for Statement {
Statement::AlterSchema(s) => s.span(),
Statement::Vacuum(..) => Span::empty(),
Statement::AlterUser(..) => Span::empty(),
Statement::Reset(..) => Span::empty(),
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,7 @@ impl<'a> Parser<'a> {
self.prev_token();
self.parse_vacuum()
}
Keyword::RESET => self.parse_reset(),
_ => self.expected("an SQL statement", next_token),
},
Token::LParen => {
Expand Down Expand Up @@ -17727,6 +17728,18 @@ impl<'a> Parser<'a> {
_ => self.expected("expected option value", self.peek_token()),
}
}

/// Parses a RESET statement
fn parse_reset(&mut self) -> Result<Statement, ParserError> {
if self.parse_keyword(Keyword::ALL) {
return Ok(Statement::Reset(ResetStatement { reset: Reset::ALL }));
}

let obj = self.parse_object_name(false)?;
Ok(Statement::Reset(ResetStatement {
reset: Reset::ConfigurationParameter(obj),
}))
}
}

fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
Expand Down
27 changes: 27 additions & 0 deletions tests/sqlparser_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17632,3 +17632,30 @@ fn parse_generic_unary_ops() {
);
}
}

#[test]
fn parse_reset_statement() {
match verified_stmt("RESET some_parameter") {
Statement::Reset(ResetStatement { reset }) => match reset {
Reset::ConfigurationParameter(o) => {
assert_eq!(o, ObjectName::from(vec!["some_parameter".into()]))
}
_ => unreachable!(),
},
_ => unreachable!(),
}
match verified_stmt("RESET some_extension.some_parameter") {
Statement::Reset(ResetStatement { reset }) => match reset {
Reset::ConfigurationParameter(o) => assert_eq!(
o,
ObjectName::from(vec!["some_extension".into(), "some_parameter".into()])
),
_ => unreachable!(),
},
_ => unreachable!(),
}
match verified_stmt("RESET ALL") {
Statement::Reset(ResetStatement { reset }) => assert_eq!(reset, Reset::ALL),
_ => unreachable!(),
}
}