| // Licensed 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. |
| |
| #[cfg(not(feature = "std"))] |
| use alloc::boxed::Box; |
| |
| use crate::{ |
| ast::{BinaryOperator, Expr}, |
| dialect::Dialect, |
| keywords::Keyword, |
| }; |
| |
| /// [MySQL](https://www.mysql.com/) |
| #[derive(Debug)] |
| pub struct MySqlDialect {} |
| |
| impl Dialect for MySqlDialect { |
| fn is_identifier_start(&self, ch: char) -> bool { |
| // See https://dev.mysql.com/doc/refman/8.0/en/identifiers.html. |
| // Identifiers which begin with a digit are recognized while tokenizing numbers, |
| // so they can be distinguished from exponent numeric literals. |
| ch.is_alphabetic() |
| || ch == '_' |
| || ch == '$' |
| || ch == '@' |
| || ('\u{0080}'..='\u{ffff}').contains(&ch) |
| } |
| |
| fn is_identifier_part(&self, ch: char) -> bool { |
| self.is_identifier_start(ch) || ch.is_ascii_digit() |
| } |
| |
| fn is_delimited_identifier_start(&self, ch: char) -> bool { |
| ch == '`' |
| } |
| |
| fn parse_infix( |
| &self, |
| parser: &mut crate::parser::Parser, |
| expr: &crate::ast::Expr, |
| _precedence: u8, |
| ) -> Option<Result<crate::ast::Expr, crate::parser::ParserError>> { |
| // Parse DIV as an operator |
| if parser.parse_keyword(Keyword::DIV) { |
| Some(Ok(Expr::BinaryOp { |
| left: Box::new(expr.clone()), |
| op: BinaryOperator::MyIntegerDivide, |
| right: Box::new(parser.parse_expr().unwrap()), |
| })) |
| } else { |
| None |
| } |
| } |
| } |