| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| use core::fmt; | |
| #[cfg(not(feature = "std"))] | |
| use alloc::{string::String, vec::Vec}; | |
| #[cfg(feature = "serde")] | |
| use serde::{Deserialize, Serialize}; | |
| #[cfg(feature = "visitor")] | |
| use sqlparser_derive::{Visit, VisitMut}; | |
| use super::display_separated; | |
| /// Unary operators | |
| #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] | |
| #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] | |
| #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] | |
| pub enum UnaryOperator { | |
| /// `@-@` Length or circumference (PostgreSQL/Redshift geometric operator) | |
| /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| AtDashAt, | |
| /// Unary logical not operator: e.g. `! false` (Hive-specific) | |
| BangNot, | |
| /// Bitwise Not, e.g. `~9` | |
| BitwiseNot, | |
| /// `@@` Center (PostgreSQL/Redshift geometric operator) | |
| /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| DoubleAt, | |
| /// `#` Number of points in path or polygon (PostgreSQL/Redshift geometric operator) | |
| /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| Hash, | |
| /// Plus, e.g. `+9` | |
| Plus, | |
| /// Minus, e.g. `-9` | |
| Minus, | |
| /// Not, e.g. `NOT(true)` | |
| Not, | |
| /// Absolute value, e.g. `@ -9` (PostgreSQL-specific) | |
| PGAbs, | |
| /// Cube root, e.g. `||/27` (PostgreSQL-specific) | |
| PGCubeRoot, | |
| /// Factorial, e.g. `9!` (PostgreSQL-specific) | |
| PGPostfixFactorial, | |
| /// Factorial, e.g. `!!9` (PostgreSQL-specific) | |
| PGPrefixFactorial, | |
| /// Square root, e.g. `|/9` (PostgreSQL-specific) | |
| PGSquareRoot, | |
| /// `?-` Is horizontal? (PostgreSQL/Redshift geometric operator) | |
| /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionDash, | |
| /// `?|` Is vertical? (PostgreSQL/Redshift geometric operator) | |
| /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionPipe, | |
| } | |
| impl fmt::Display for UnaryOperator { | |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | |
| f.write_str(match self { | |
| UnaryOperator::AtDashAt => "@-@", | |
| UnaryOperator::BangNot => "!", | |
| UnaryOperator::BitwiseNot => "~", | |
| UnaryOperator::DoubleAt => "@@", | |
| UnaryOperator::Hash => "#", | |
| UnaryOperator::Minus => "-", | |
| UnaryOperator::Not => "NOT", | |
| UnaryOperator::PGAbs => "@", | |
| UnaryOperator::PGCubeRoot => "||/", | |
| UnaryOperator::PGPostfixFactorial => "!", | |
| UnaryOperator::PGPrefixFactorial => "!!", | |
| UnaryOperator::PGSquareRoot => "|/", | |
| UnaryOperator::Plus => "+", | |
| UnaryOperator::QuestionDash => "?-", | |
| UnaryOperator::QuestionPipe => "?|", | |
| }) | |
| } | |
| } | |
| /// Binary operators | |
| #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] | |
| #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] | |
| #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] | |
| pub enum BinaryOperator { | |
| /// Plus, e.g. `a + b` | |
| Plus, | |
| /// Minus, e.g. `a - b` | |
| Minus, | |
| /// Multiply, e.g. `a * b` | |
| Multiply, | |
| /// Divide, e.g. `a / b` | |
| Divide, | |
| /// Modulo, e.g. `a % b` | |
| Modulo, | |
| /// String/Array Concat operator, e.g. `a || b` | |
| StringConcat, | |
| /// Greater than, e.g. `a > b` | |
| Gt, | |
| /// Less than, e.g. `a < b` | |
| Lt, | |
| /// Greater equal, e.g. `a >= b` | |
| GtEq, | |
| /// Less equal, e.g. `a <= b` | |
| LtEq, | |
| /// Spaceship, e.g. `a <=> b` | |
| Spaceship, | |
| /// Equal, e.g. `a = b` | |
| Eq, | |
| /// Not equal, e.g. `a <> b` | |
| NotEq, | |
| /// And, e.g. `a AND b` | |
| And, | |
| /// Or, e.g. `a OR b` | |
| Or, | |
| /// XOR, e.g. `a XOR b` | |
| Xor, | |
| /// Bitwise or, e.g. `a | b` | |
| BitwiseOr, | |
| /// Bitwise and, e.g. `a & b` | |
| BitwiseAnd, | |
| /// Bitwise XOR, e.g. `a ^ b` | |
| BitwiseXor, | |
| /// Integer division operator `//` in DuckDB | |
| DuckIntegerDivide, | |
| /// MySQL [`DIV`](https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html) integer division | |
| MyIntegerDivide, | |
| /// MATCH operator, e.g. `a MATCH b` (SQLite-specific) | |
| /// See <https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_match_and_extract_operators> | |
| Match, | |
| /// REGEXP operator, e.g. `a REGEXP b` (SQLite-specific) | |
| Regexp, | |
| /// GLOB operator, e.g. `a GLOB b` (SQLite-specific) | |
| /// See <https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_match_and_extract_operators> | |
| Glob, | |
| /// Support for custom operators (such as Postgres custom operators) | |
| Custom(String), | |
| /// Bitwise XOR, e.g. `a # b` (PostgreSQL-specific) | |
| PGBitwiseXor, | |
| /// Bitwise shift left, e.g. `a << b` (PostgreSQL-specific) | |
| PGBitwiseShiftLeft, | |
| /// Bitwise shift right, e.g. `a >> b` (PostgreSQL-specific) | |
| PGBitwiseShiftRight, | |
| /// Exponent, e.g. `a ^ b` (PostgreSQL-specific) | |
| PGExp, | |
| /// Overlap operator, e.g. `a && b` (PostgreSQL-specific) | |
| PGOverlap, | |
| /// String matches regular expression (case sensitively), e.g. `a ~ b` (PostgreSQL-specific) | |
| PGRegexMatch, | |
| /// String matches regular expression (case insensitively), e.g. `a ~* b` (PostgreSQL-specific) | |
| PGRegexIMatch, | |
| /// String does not match regular expression (case sensitively), e.g. `a !~ b` (PostgreSQL-specific) | |
| PGRegexNotMatch, | |
| /// String does not match regular expression (case insensitively), e.g. `a !~* b` (PostgreSQL-specific) | |
| PGRegexNotIMatch, | |
| /// String matches pattern (case sensitively), e.g. `a ~~ b` (PostgreSQL-specific) | |
| PGLikeMatch, | |
| /// String matches pattern (case insensitively), e.g. `a ~~* b` (PostgreSQL-specific) | |
| PGILikeMatch, | |
| /// String does not match pattern (case sensitively), e.g. `a !~~ b` (PostgreSQL-specific) | |
| PGNotLikeMatch, | |
| /// String does not match pattern (case insensitively), e.g. `a !~~* b` (PostgreSQL-specific) | |
| PGNotILikeMatch, | |
| /// String "starts with", eg: `a ^@ b` (PostgreSQL-specific) | |
| PGStartsWith, | |
| /// The `->` operator. | |
| /// | |
| /// On PostgreSQL, this operator extracts a JSON object field or array | |
| /// element, for example `'{"a":"b"}'::json -> 'a'` or `[1, 2, 3]'::json | |
| /// -> 2`. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| Arrow, | |
| /// The `->>` operator. | |
| /// | |
| /// On PostgreSQL, this operator extracts a JSON object field or JSON | |
| /// array element and converts it to text, for example `'{"a":"b"}'::json | |
| /// ->> 'a'` or `[1, 2, 3]'::json ->> 2`. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| LongArrow, | |
| /// The `#>` operator. | |
| /// | |
| /// On PostgreSQL, this operator extracts a JSON sub-object at the specified | |
| /// path, for example: | |
| /// | |
| /// ```notrust | |
| ///'{"a": {"b": ["foo","bar"]}}'::json #> '{a,b,1}' | |
| /// ``` | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| HashArrow, | |
| /// The `#>>` operator. | |
| /// | |
| /// A PostgreSQL-specific operator that extracts JSON sub-object at the | |
| /// specified path, for example | |
| /// | |
| /// ```notrust | |
| ///'{"a": {"b": ["foo","bar"]}}'::json #>> '{a,b,1}' | |
| /// ``` | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| HashLongArrow, | |
| /// The `@@` operator. | |
| /// | |
| /// On PostgreSQL, this is used for JSON and text searches. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| /// See <https://www.postgresql.org/docs/current/functions-textsearch.html>. | |
| AtAt, | |
| /// The `@>` operator. | |
| /// | |
| /// On PostgreSQL, this is used for JSON and text searches. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| /// See <https://www.postgresql.org/docs/current/functions-textsearch.html>. | |
| AtArrow, | |
| /// The `<@` operator. | |
| /// | |
| /// On PostgreSQL, this is used for JSON and text searches. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| /// See <https://www.postgresql.org/docs/current/functions-textsearch.html>. | |
| ArrowAt, | |
| /// The `#-` operator. | |
| /// | |
| /// On PostgreSQL, this operator is used to delete a field or array element | |
| /// at a specified path. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| HashMinus, | |
| /// The `@?` operator. | |
| /// | |
| /// On PostgreSQL, this operator is used to check the given JSON path | |
| /// returns an item for the JSON value. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| AtQuestion, | |
| /// The `?` operator. | |
| /// | |
| /// On PostgreSQL, this operator is used to check whether a string exists as a top-level key | |
| /// within the JSON value | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| Question, | |
| /// The `?&` operator. | |
| /// | |
| /// On PostgreSQL, this operator is used to check whether all of the the indicated array | |
| /// members exist as top-level keys. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| QuestionAnd, | |
| /// The `?|` operator. | |
| /// | |
| /// On PostgreSQL, this operator is used to check whether any of the the indicated array | |
| /// members exist as top-level keys. | |
| /// | |
| /// See <https://www.postgresql.org/docs/current/functions-json.html>. | |
| QuestionPipe, | |
| /// PostgreSQL-specific custom operator. | |
| /// | |
| /// See [CREATE OPERATOR](https://www.postgresql.org/docs/current/sql-createoperator.html) | |
| /// for more information. | |
| PGCustomBinaryOperator(Vec<String>), | |
| /// The `OVERLAPS` operator | |
| /// | |
| /// Specifies a test for an overlap between two datetime periods: | |
| /// <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#overlaps-predicate> | |
| Overlaps, | |
| /// `##` Point of closest proximity (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| DoubleHash, | |
| /// `<->` Distance between (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| LtDashGt, | |
| /// `&<` Overlaps to left? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| AndLt, | |
| /// `&>` Overlaps to right? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| AndGt, | |
| /// `<<|` Is strictly below? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| LtLtPipe, | |
| /// `|>>` Is strictly above? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| PipeGtGt, | |
| /// `&<|` Does not extend above? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| AndLtPipe, | |
| /// `|&>` Does not extend below? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| PipeAndGt, | |
| /// `<^` Is below? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| LtCaret, | |
| /// `>^` Is above? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| GtCaret, | |
| /// `?#` Intersects? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionHash, | |
| /// `?-` Is horizontal? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionDash, | |
| /// `?-|` Is perpendicular? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionDashPipe, | |
| /// `?||` Are Parallel? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| QuestionDoublePipe, | |
| /// `@` Contained or on? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| At, | |
| /// `~=` Same as? (PostgreSQL/Redshift geometric operator) | |
| /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html> | |
| TildeEq, | |
| /// ':=' Assignment Operator | |
| /// See <https://dev.mysql.com/doc/refman/8.4/en/assignment-operators.html#operator_assign-value> | |
| Assignment, | |
| } | |
| impl fmt::Display for BinaryOperator { | |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | |
| match self { | |
| BinaryOperator::Plus => f.write_str("+"), | |
| BinaryOperator::Minus => f.write_str("-"), | |
| BinaryOperator::Multiply => f.write_str("*"), | |
| BinaryOperator::Divide => f.write_str("/"), | |
| BinaryOperator::Modulo => f.write_str("%"), | |
| BinaryOperator::StringConcat => f.write_str("||"), | |
| BinaryOperator::Gt => f.write_str(">"), | |
| BinaryOperator::Lt => f.write_str("<"), | |
| BinaryOperator::GtEq => f.write_str(">="), | |
| BinaryOperator::LtEq => f.write_str("<="), | |
| BinaryOperator::Spaceship => f.write_str("<=>"), | |
| BinaryOperator::Eq => f.write_str("="), | |
| BinaryOperator::NotEq => f.write_str("<>"), | |
| BinaryOperator::And => f.write_str("AND"), | |
| BinaryOperator::Or => f.write_str("OR"), | |
| BinaryOperator::Xor => f.write_str("XOR"), | |
| BinaryOperator::BitwiseOr => f.write_str("|"), | |
| BinaryOperator::BitwiseAnd => f.write_str("&"), | |
| BinaryOperator::BitwiseXor => f.write_str("^"), | |
| BinaryOperator::DuckIntegerDivide => f.write_str("//"), | |
| BinaryOperator::MyIntegerDivide => f.write_str("DIV"), | |
| BinaryOperator::Match => f.write_str("MATCH"), | |
| BinaryOperator::Regexp => f.write_str("REGEXP"), | |
| BinaryOperator::Glob => f.write_str("GLOB"), | |
| BinaryOperator::Custom(s) => f.write_str(s), | |
| BinaryOperator::PGBitwiseXor => f.write_str("#"), | |
| BinaryOperator::PGBitwiseShiftLeft => f.write_str("<<"), | |
| BinaryOperator::PGBitwiseShiftRight => f.write_str(">>"), | |
| BinaryOperator::PGExp => f.write_str("^"), | |
| BinaryOperator::PGOverlap => f.write_str("&&"), | |
| BinaryOperator::PGRegexMatch => f.write_str("~"), | |
| BinaryOperator::PGRegexIMatch => f.write_str("~*"), | |
| BinaryOperator::PGRegexNotMatch => f.write_str("!~"), | |
| BinaryOperator::PGRegexNotIMatch => f.write_str("!~*"), | |
| BinaryOperator::PGLikeMatch => f.write_str("~~"), | |
| BinaryOperator::PGILikeMatch => f.write_str("~~*"), | |
| BinaryOperator::PGNotLikeMatch => f.write_str("!~~"), | |
| BinaryOperator::PGNotILikeMatch => f.write_str("!~~*"), | |
| BinaryOperator::PGStartsWith => f.write_str("^@"), | |
| BinaryOperator::Arrow => f.write_str("->"), | |
| BinaryOperator::LongArrow => f.write_str("->>"), | |
| BinaryOperator::HashArrow => f.write_str("#>"), | |
| BinaryOperator::HashLongArrow => f.write_str("#>>"), | |
| BinaryOperator::AtAt => f.write_str("@@"), | |
| BinaryOperator::AtArrow => f.write_str("@>"), | |
| BinaryOperator::ArrowAt => f.write_str("<@"), | |
| BinaryOperator::HashMinus => f.write_str("#-"), | |
| BinaryOperator::AtQuestion => f.write_str("@?"), | |
| BinaryOperator::Question => f.write_str("?"), | |
| BinaryOperator::QuestionAnd => f.write_str("?&"), | |
| BinaryOperator::QuestionPipe => f.write_str("?|"), | |
| BinaryOperator::PGCustomBinaryOperator(idents) => { | |
| write!(f, "OPERATOR({})", display_separated(idents, ".")) | |
| } | |
| BinaryOperator::Overlaps => f.write_str("OVERLAPS"), | |
| BinaryOperator::DoubleHash => f.write_str("##"), | |
| BinaryOperator::LtDashGt => f.write_str("<->"), | |
| BinaryOperator::AndLt => f.write_str("&<"), | |
| BinaryOperator::AndGt => f.write_str("&>"), | |
| BinaryOperator::LtLtPipe => f.write_str("<<|"), | |
| BinaryOperator::PipeGtGt => f.write_str("|>>"), | |
| BinaryOperator::AndLtPipe => f.write_str("&<|"), | |
| BinaryOperator::PipeAndGt => f.write_str("|&>"), | |
| BinaryOperator::LtCaret => f.write_str("<^"), | |
| BinaryOperator::GtCaret => f.write_str(">^"), | |
| BinaryOperator::QuestionHash => f.write_str("?#"), | |
| BinaryOperator::QuestionDash => f.write_str("?-"), | |
| BinaryOperator::QuestionDashPipe => f.write_str("?-|"), | |
| BinaryOperator::QuestionDoublePipe => f.write_str("?||"), | |
| BinaryOperator::At => f.write_str("@"), | |
| BinaryOperator::TildeEq => f.write_str("~="), | |
| BinaryOperator::Assignment => f.write_str(":="), | |
| } | |
| } | |
| } |