mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-09 13:40:22 +00:00
Allow string values in pragma commands (#1101)
Co-authored-by: Michael Ionov <michael@appdome.com>
This commit is contained in:
parent
3ec337ec5f
commit
b0b62887a2
2 changed files with 63 additions and 2 deletions
|
@ -8470,11 +8470,24 @@ impl<'a> Parser<'a> {
|
|||
})
|
||||
}
|
||||
|
||||
fn parse_pragma_value(&mut self) -> Result<Value, ParserError> {
|
||||
match self.parse_value()? {
|
||||
v @ Value::SingleQuotedString(_) => Ok(v),
|
||||
v @ Value::DoubleQuotedString(_) => Ok(v),
|
||||
v @ Value::Number(_, _) => Ok(v),
|
||||
v @ Value::Placeholder(_) => Ok(v),
|
||||
_ => {
|
||||
self.prev_token();
|
||||
self.expected("number or string or ? placeholder", self.peek_token())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
|
||||
pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
|
||||
let name = self.parse_object_name()?;
|
||||
if self.consume_token(&Token::LParen) {
|
||||
let value = self.parse_number_value()?;
|
||||
let value = self.parse_pragma_value()?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Ok(Statement::Pragma {
|
||||
name,
|
||||
|
@ -8484,7 +8497,7 @@ impl<'a> Parser<'a> {
|
|||
} else if self.consume_token(&Token::Eq) {
|
||||
Ok(Statement::Pragma {
|
||||
name,
|
||||
value: Some(self.parse_number_value()?),
|
||||
value: Some(self.parse_pragma_value()?),
|
||||
is_eq: true,
|
||||
})
|
||||
} else {
|
||||
|
|
|
@ -70,6 +70,54 @@ fn pragma_funciton_style() {
|
|||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pragma_eq_string_style() {
|
||||
let sql = "PRAGMA table_info = 'sqlite_master'";
|
||||
match sqlite_and_generic().verified_stmt(sql) {
|
||||
Statement::Pragma {
|
||||
name,
|
||||
value: Some(val),
|
||||
is_eq: true,
|
||||
} => {
|
||||
assert_eq!("table_info", name.to_string());
|
||||
assert_eq!("'sqlite_master'", val.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pragma_function_string_style() {
|
||||
let sql = "PRAGMA table_info(\"sqlite_master\")";
|
||||
match sqlite_and_generic().verified_stmt(sql) {
|
||||
Statement::Pragma {
|
||||
name,
|
||||
value: Some(val),
|
||||
is_eq: false,
|
||||
} => {
|
||||
assert_eq!("table_info", name.to_string());
|
||||
assert_eq!("\"sqlite_master\"", val.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pragma_eq_placehoder_style() {
|
||||
let sql = "PRAGMA table_info = ?";
|
||||
match sqlite_and_generic().verified_stmt(sql) {
|
||||
Statement::Pragma {
|
||||
name,
|
||||
value: Some(val),
|
||||
is_eq: true,
|
||||
} => {
|
||||
assert_eq!("table_info", name.to_string());
|
||||
assert_eq!("?", val.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_create_table_without_rowid() {
|
||||
let sql = "CREATE TABLE t (a INT) WITHOUT ROWID";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue