mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-20 06:00:15 +00:00
[postgres] Add support for custom binary operators (#548)
* [postgres] Add support for custom binary operators More details about operators in general are at: https://www.postgresql.org/docs/current/sql-createoperator.html. This patch attempts to parse `SELECT` queries that reference an operator using `OPERATOR(<optional_schema>.<operator_name>)` syntax. This is a PostgreSQL extension. There are no provisions for user-defined operators in the SQL standard. * fix code-review comments and ci failures * Allow custom operator in generic dialects too * Parse `OPERATOR` as Vec<String> * fix: std Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
This commit is contained in:
parent
6c98228e71
commit
1c64129f76
4 changed files with 114 additions and 32 deletions
|
@ -1173,6 +1173,22 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
}
|
||||
Keyword::XOR => Some(BinaryOperator::Xor),
|
||||
Keyword::OPERATOR if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
|
||||
self.expect_token(&Token::LParen)?;
|
||||
// there are special rules for operator names in
|
||||
// postgres so we can not use 'parse_object'
|
||||
// or similar.
|
||||
// See https://www.postgresql.org/docs/current/sql-createoperator.html
|
||||
let mut idents = vec![];
|
||||
loop {
|
||||
idents.push(self.next_token().to_string());
|
||||
if !self.consume_token(&Token::Period) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
self.expect_token(&Token::RParen)?;
|
||||
Some(BinaryOperator::PGCustomBinaryOperator(idents))
|
||||
}
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
|
@ -1437,6 +1453,7 @@ impl<'a> Parser<'a> {
|
|||
Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(Self::BETWEEN_PREC),
|
||||
Token::Word(w) if w.keyword == Keyword::LIKE => Ok(Self::BETWEEN_PREC),
|
||||
Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(Self::BETWEEN_PREC),
|
||||
Token::Word(w) if w.keyword == Keyword::OPERATOR => Ok(Self::BETWEEN_PREC),
|
||||
Token::Eq
|
||||
| Token::Lt
|
||||
| Token::LtEq
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue