Skip to content

Commit b0b6288

Browse files
invmMichael Ionov
andauthored
Allow string values in pragma commands (apache#1101)
Co-authored-by: Michael Ionov <michael@appdome.com>
1 parent 3ec337e commit b0b6288

2 files changed

Lines changed: 63 additions & 2 deletions

File tree

src/parser/mod.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8470,11 +8470,24 @@ impl<'a> Parser<'a> {
84708470
})
84718471
}
84728472

8473+
fn parse_pragma_value(&mut self) -> Result<Value, ParserError> {
8474+
match self.parse_value()? {
8475+
v @ Value::SingleQuotedString(_) => Ok(v),
8476+
v @ Value::DoubleQuotedString(_) => Ok(v),
8477+
v @ Value::Number(_, _) => Ok(v),
8478+
v @ Value::Placeholder(_) => Ok(v),
8479+
_ => {
8480+
self.prev_token();
8481+
self.expected("number or string or ? placeholder", self.peek_token())
8482+
}
8483+
}
8484+
}
8485+
84738486
// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
84748487
pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
84758488
let name = self.parse_object_name()?;
84768489
if self.consume_token(&Token::LParen) {
8477-
let value = self.parse_number_value()?;
8490+
let value = self.parse_pragma_value()?;
84788491
self.expect_token(&Token::RParen)?;
84798492
Ok(Statement::Pragma {
84808493
name,
@@ -8484,7 +8497,7 @@ impl<'a> Parser<'a> {
84848497
} else if self.consume_token(&Token::Eq) {
84858498
Ok(Statement::Pragma {
84868499
name,
8487-
value: Some(self.parse_number_value()?),
8500+
value: Some(self.parse_pragma_value()?),
84888501
is_eq: true,
84898502
})
84908503
} else {

tests/sqlparser_sqlite.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,54 @@ fn pragma_funciton_style() {
7070
}
7171
}
7272

73+
#[test]
74+
fn pragma_eq_string_style() {
75+
let sql = "PRAGMA table_info = 'sqlite_master'";
76+
match sqlite_and_generic().verified_stmt(sql) {
77+
Statement::Pragma {
78+
name,
79+
value: Some(val),
80+
is_eq: true,
81+
} => {
82+
assert_eq!("table_info", name.to_string());
83+
assert_eq!("'sqlite_master'", val.to_string());
84+
}
85+
_ => unreachable!(),
86+
}
87+
}
88+
89+
#[test]
90+
fn pragma_function_string_style() {
91+
let sql = "PRAGMA table_info(\"sqlite_master\")";
92+
match sqlite_and_generic().verified_stmt(sql) {
93+
Statement::Pragma {
94+
name,
95+
value: Some(val),
96+
is_eq: false,
97+
} => {
98+
assert_eq!("table_info", name.to_string());
99+
assert_eq!("\"sqlite_master\"", val.to_string());
100+
}
101+
_ => unreachable!(),
102+
}
103+
}
104+
105+
#[test]
106+
fn pragma_eq_placehoder_style() {
107+
let sql = "PRAGMA table_info = ?";
108+
match sqlite_and_generic().verified_stmt(sql) {
109+
Statement::Pragma {
110+
name,
111+
value: Some(val),
112+
is_eq: true,
113+
} => {
114+
assert_eq!("table_info", name.to_string());
115+
assert_eq!("?", val.to_string());
116+
}
117+
_ => unreachable!(),
118+
}
119+
}
120+
73121
#[test]
74122
fn parse_create_table_without_rowid() {
75123
let sql = "CREATE TABLE t (a INT) WITHOUT ROWID";

0 commit comments

Comments
 (0)