Support SHOW <var> and SET <var>

This commit is contained in:
Nikhil Benesch 2019-08-14 14:59:55 -04:00
parent f64928e994
commit e1ded184f8
No known key found for this signature in database
GPG key ID: FCF98542083C5A69
4 changed files with 168 additions and 9 deletions

View file

@ -125,9 +125,9 @@ impl Parser {
"UPDATE" => Ok(self.parse_update()?),
"ALTER" => Ok(self.parse_alter()?),
"COPY" => Ok(self.parse_copy()?),
"SET" => Ok(self.parse_set()?),
"SHOW" => Ok(self.parse_show()?),
"START" => Ok(self.parse_start_transaction()?),
"SET" => Ok(self.parse_set_transaction()?),
// `BEGIN` is a nonstandard but common alias for the
// standard `START TRANSACTION` statement. It is supported
// by at least PostgreSQL and MySQL.
@ -1593,6 +1593,30 @@ impl Parser {
})
}
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
let modifier = self.parse_one_of_keywords(&["SESSION", "LOCAL"]);
let variable = self.parse_identifier()?;
if self.consume_token(&Token::Eq) || self.parse_keyword("TO") {
let token = self.peek_token();
let value = match (self.parse_value(), token) {
(Ok(value), _) => SetVariableValue::Literal(value),
(Err(_), Some(Token::Word(ident))) => SetVariableValue::Ident(ident.as_ident()),
(Err(_), other) => self.expected("variable value", other)?,
};
Ok(Statement::SetVariable {
local: modifier == Some("LOCAL"),
variable,
value,
})
} else if variable == "TRANSACTION" && modifier.is_none() {
Ok(Statement::SetTransaction {
modes: self.parse_transaction_modes()?,
})
} else {
self.expected("equals sign or TO", self.peek_token())
}
}
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
if self
.parse_one_of_keywords(&["EXTENDED", "FULL", "COLUMNS", "FIELDS"])
@ -1601,7 +1625,9 @@ impl Parser {
self.prev_token();
self.parse_show_columns()
} else {
self.expected("EXTENDED, FULL, COLUMNS, or FIELDS", self.peek_token())
Ok(Statement::ShowVariable {
variable: self.parse_identifier()?,
})
}
}
@ -1973,13 +1999,6 @@ impl Parser {
})
}
pub fn parse_set_transaction(&mut self) -> Result<Statement, ParserError> {
self.expect_keyword("TRANSACTION")?;
Ok(Statement::SetTransaction {
modes: self.parse_transaction_modes()?,
})
}
pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
let mut modes = vec![];
let mut required = false;