mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-16 04:00:15 +00:00
Support json operators @>
<@
#-
@?
and @@
postgres supports a bunch more json operators. See https://www.postgresql.org/docs/15/functions-json.html Skipping operators starting with a question mark for now, since those are hard to distinguish from placeholders without more context.
This commit is contained in:
parent
fb02344131
commit
6d6eb4bc9b
4 changed files with 132 additions and 2 deletions
|
@ -155,6 +155,20 @@ pub enum Token {
|
|||
HashArrow,
|
||||
/// #>> Extracts JSON sub-object at the specified path as text
|
||||
HashLongArrow,
|
||||
/// jsonb @> jsonb -> boolean: Test whether left json contains the right json
|
||||
AtArrow,
|
||||
/// jsonb <@ jsonb -> boolean: Test whether right json contains the left json
|
||||
ArrowAt,
|
||||
/// jsonb #- text[] -> jsonb: Deletes the field or array element at the specified
|
||||
/// path, where path elements can be either field keys or array indexes.
|
||||
HashMinus,
|
||||
/// jsonb @? jsonpath -> boolean: Does JSON path return any item for the specified
|
||||
/// JSON value?
|
||||
AtQuestion,
|
||||
/// jsonb @@ jsonpath → boolean: Returns the result of a JSON path predicate check
|
||||
/// for the specified JSON value. Only the first item of the result is taken into
|
||||
/// account. If the result is not Boolean, then NULL is returned.
|
||||
AtAt,
|
||||
}
|
||||
|
||||
impl fmt::Display for Token {
|
||||
|
@ -217,7 +231,12 @@ impl fmt::Display for Token {
|
|||
Token::LongArrow => write!(f, "->>"),
|
||||
Token::HashArrow => write!(f, "#>"),
|
||||
Token::HashLongArrow => write!(f, "#>>"),
|
||||
Token::AtArrow => write!(f, "@>"),
|
||||
Token::DoubleDollarQuoting => write!(f, "$$"),
|
||||
Token::ArrowAt => write!(f, "<@"),
|
||||
Token::HashMinus => write!(f, "#-"),
|
||||
Token::AtQuestion => write!(f, "@?"),
|
||||
Token::AtAt => write!(f, "@@"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -708,6 +727,7 @@ impl<'a> Tokenizer<'a> {
|
|||
}
|
||||
Some('>') => self.consume_and_return(chars, Token::Neq),
|
||||
Some('<') => self.consume_and_return(chars, Token::ShiftLeft),
|
||||
Some('@') => self.consume_and_return(chars, Token::ArrowAt),
|
||||
_ => Ok(Some(Token::Lt)),
|
||||
}
|
||||
}
|
||||
|
@ -752,6 +772,7 @@ impl<'a> Tokenizer<'a> {
|
|||
'#' => {
|
||||
chars.next();
|
||||
match chars.peek() {
|
||||
Some('-') => self.consume_and_return(chars, Token::HashMinus),
|
||||
Some('>') => {
|
||||
chars.next();
|
||||
match chars.peek() {
|
||||
|
@ -765,7 +786,15 @@ impl<'a> Tokenizer<'a> {
|
|||
_ => Ok(Some(Token::Sharp)),
|
||||
}
|
||||
}
|
||||
'@' => self.consume_and_return(chars, Token::AtSign),
|
||||
'@' => {
|
||||
chars.next();
|
||||
match chars.peek() {
|
||||
Some('>') => self.consume_and_return(chars, Token::AtArrow),
|
||||
Some('?') => self.consume_and_return(chars, Token::AtQuestion),
|
||||
Some('@') => self.consume_and_return(chars, Token::AtAt),
|
||||
_ => Ok(Some(Token::AtSign)),
|
||||
}
|
||||
}
|
||||
'?' => {
|
||||
chars.next();
|
||||
let s = peeking_take_while(chars, |ch| ch.is_numeric());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue