mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-16 04:00:15 +00:00
Merge pull request #328 from b41sh/regexp_match
Add support for PostgreSQL regex match
This commit is contained in:
commit
783bc21d29
4 changed files with 102 additions and 2 deletions
|
@ -109,8 +109,14 @@ pub enum Token {
|
|||
RArrow,
|
||||
/// Sharp `#` used for PostgreSQL Bitwise XOR operator
|
||||
Sharp,
|
||||
/// Tilde `~` used for PostgreSQL Bitwise NOT operator
|
||||
/// Tilde `~` used for PostgreSQL Bitwise NOT operator or case sensitive match regular expression operator
|
||||
Tilde,
|
||||
/// `~*` , a case insensitive match regular expression operator in PostgreSQL
|
||||
TildeAsterisk,
|
||||
/// `!~` , a case sensitive not match regular expression operator in PostgreSQL
|
||||
ExclamationMarkTilde,
|
||||
/// `!~*` , a case insensitive not match regular expression operator in PostgreSQL
|
||||
ExclamationMarkTildeAsterisk,
|
||||
/// `<<`, a bitwise shift left operator in PostgreSQL
|
||||
ShiftLeft,
|
||||
/// `>>`, a bitwise shift right operator in PostgreSQL
|
||||
|
@ -172,6 +178,9 @@ impl fmt::Display for Token {
|
|||
Token::ExclamationMark => f.write_str("!"),
|
||||
Token::DoubleExclamationMark => f.write_str("!!"),
|
||||
Token::Tilde => f.write_str("~"),
|
||||
Token::TildeAsterisk => f.write_str("~*"),
|
||||
Token::ExclamationMarkTilde => f.write_str("!~"),
|
||||
Token::ExclamationMarkTildeAsterisk => f.write_str("!~*"),
|
||||
Token::AtSign => f.write_str("@"),
|
||||
Token::ShiftLeft => f.write_str("<<"),
|
||||
Token::ShiftRight => f.write_str(">>"),
|
||||
|
@ -489,6 +498,14 @@ impl<'a> Tokenizer<'a> {
|
|||
match chars.peek() {
|
||||
Some('=') => self.consume_and_return(chars, Token::Neq),
|
||||
Some('!') => self.consume_and_return(chars, Token::DoubleExclamationMark),
|
||||
Some('~') => {
|
||||
chars.next();
|
||||
match chars.peek() {
|
||||
Some('*') => self
|
||||
.consume_and_return(chars, Token::ExclamationMarkTildeAsterisk),
|
||||
_ => Ok(Some(Token::ExclamationMarkTilde)),
|
||||
}
|
||||
}
|
||||
_ => Ok(Some(Token::ExclamationMark)),
|
||||
}
|
||||
}
|
||||
|
@ -538,7 +555,13 @@ impl<'a> Tokenizer<'a> {
|
|||
comment,
|
||||
})))
|
||||
}
|
||||
'~' => self.consume_and_return(chars, Token::Tilde),
|
||||
'~' => {
|
||||
chars.next(); // consume
|
||||
match chars.peek() {
|
||||
Some('*') => self.consume_and_return(chars, Token::TildeAsterisk),
|
||||
_ => Ok(Some(Token::Tilde)),
|
||||
}
|
||||
}
|
||||
'#' => self.consume_and_return(chars, Token::Sharp),
|
||||
'@' => self.consume_and_return(chars, Token::AtSign),
|
||||
other => self.consume_and_return(chars, Token::Char(other)),
|
||||
|
@ -1114,6 +1137,45 @@ mod tests {
|
|||
compare(expected, tokens);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn tokenize_pg_regex_match() {
|
||||
let sql = "SELECT col ~ '^a', col ~* '^a', col !~ '^a', col !~* '^a'";
|
||||
let dialect = GenericDialect {};
|
||||
let mut tokenizer = Tokenizer::new(&dialect, sql);
|
||||
let tokens = tokenizer.tokenize().unwrap();
|
||||
let expected = vec![
|
||||
Token::make_keyword("SELECT"),
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::make_word("col", None),
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::Tilde,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::SingleQuotedString("^a".into()),
|
||||
Token::Comma,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::make_word("col", None),
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::TildeAsterisk,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::SingleQuotedString("^a".into()),
|
||||
Token::Comma,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::make_word("col", None),
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::ExclamationMarkTilde,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::SingleQuotedString("^a".into()),
|
||||
Token::Comma,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::make_word("col", None),
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::ExclamationMarkTildeAsterisk,
|
||||
Token::Whitespace(Whitespace::Space),
|
||||
Token::SingleQuotedString("^a".into()),
|
||||
];
|
||||
compare(expected, tokens);
|
||||
}
|
||||
|
||||
fn compare(expected: Vec<Token>, actual: Vec<Token>) {
|
||||
//println!("------------------------------");
|
||||
//println!("tokens = {:?}", actual);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue