Some small parser bug fixes. ()

This commit is contained in:
Mees Delzenne 2024-07-02 13:22:55 +02:00 committed by GitHub
parent 735994549a
commit 780348b18f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 41 additions and 7 deletions
core/src/syn
lexer
parser

View file

@ -312,7 +312,8 @@ impl<'a> Lexer<'a> {
_ => t!(":"),
},
b'$' => {
if self.reader.peek().map(|x| x.is_ascii_alphabetic()).unwrap_or(false) {
if self.reader.peek().map(|x| x.is_ascii_alphabetic() || x == b'_').unwrap_or(false)
{
return self.lex_param();
}
t!("$")
@ -402,13 +403,20 @@ impl<'a> Lexer<'a> {
return self.lex_ident_from_next_byte(b'm');
}
},
b's' => {
if self.reader.peek().map(|x| x.is_ascii_alphabetic()).unwrap_or(false) {
return self.lex_ident_from_next_byte(b's');
} else {
t!("s")
b's' => match self.reader.peek() {
Some(b'"') => {
self.reader.next();
t!("\"")
}
}
Some(b'\'') => {
self.reader.next();
t!("'")
}
Some(x) if x.is_ascii_alphabetic() => {
return self.lex_ident_from_next_byte(b's');
}
_ => t!("s"),
},
b'h' => {
if self.reader.peek().map(|x| x.is_ascii_alphabetic()).unwrap_or(false) {
return self.lex_ident_from_next_byte(b'h');

View file

@ -725,4 +725,30 @@ mod tests {
};
assert_eq!(regex, r"(?i)test/[a-z]+/\s\d\w{1}.*".parse().unwrap());
}
#[test]
fn plain_string() {
let sql = r#""hello""#;
let out = Value::parse(sql);
assert_eq!(r#"'hello'"#, format!("{}", out));
let sql = r#"s"hello""#;
let out = Value::parse(sql);
assert_eq!(r#"'hello'"#, format!("{}", out));
let sql = r#"s'hello'"#;
let out = Value::parse(sql);
assert_eq!(r#"'hello'"#, format!("{}", out));
}
#[test]
fn params() {
let sql = "$hello";
let out = Value::parse(sql);
assert_eq!("$hello", format!("{}", out));
let sql = "$__hello";
let out = Value::parse(sql);
assert_eq!("$__hello", format!("{}", out));
}
}