mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-24 07:54:06 +00:00
Merge branch 'master' into join-support
This commit is contained in:
commit
ab423bc9dc
7 changed files with 34 additions and 10 deletions
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "sqlparser"
|
name = "sqlparser"
|
||||||
description = "Extensible SQL Lexer and Parser with support for ANSI SQL:2011"
|
description = "Extensible SQL Lexer and Parser with support for ANSI SQL:2011"
|
||||||
version = "0.1.9-alpha.0"
|
version = "0.1.10-alpha.0"
|
||||||
authors = ["Andy Grove <andygrove73@gmail.com>"]
|
authors = ["Andy Grove <andygrove73@gmail.com>"]
|
||||||
homepage = "https://github.com/andygrove/sqlparser-rs"
|
homepage = "https://github.com/andygrove/sqlparser-rs"
|
||||||
documentation = "https://docs.rs/sqlparser/"
|
documentation = "https://docs.rs/sqlparser/"
|
||||||
|
|
|
@ -13,6 +13,7 @@ impl Dialect for GenericSqlDialect {
|
||||||
REAL, DOUBLE, PRECISION, INT, INTEGER, SMALLINT, BIGINT, NUMERIC, DECIMAL, DEC,
|
REAL, DOUBLE, PRECISION, INT, INTEGER, SMALLINT, BIGINT, NUMERIC, DECIMAL, DEC,
|
||||||
BOOLEAN, DATE, TIME, TIMESTAMP, CASE, WHEN, THEN, ELSE, END, JOIN, LEFT, RIGHT, FULL,
|
BOOLEAN, DATE, TIME, TIMESTAMP, CASE, WHEN, THEN, ELSE, END, JOIN, LEFT, RIGHT, FULL,
|
||||||
CROSS, OUTER, INNER, NATURAL, ON, USING,
|
CROSS, OUTER, INNER, NATURAL, ON, USING,
|
||||||
|
BOOLEAN, DATE, TIME, TIMESTAMP, CASE, WHEN, THEN, ELSE, END, LIKE,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ mod generic_sql;
|
||||||
pub mod keywords;
|
pub mod keywords;
|
||||||
mod postgresql;
|
mod postgresql;
|
||||||
|
|
||||||
|
|
||||||
pub use self::ansi_sql::AnsiSqlDialect;
|
pub use self::ansi_sql::AnsiSqlDialect;
|
||||||
pub use self::generic_sql::GenericSqlDialect;
|
pub use self::generic_sql::GenericSqlDialect;
|
||||||
pub use self::postgresql::PostgreSqlDialect;
|
pub use self::postgresql::PostgreSqlDialect;
|
||||||
|
@ -15,4 +14,4 @@ pub trait Dialect {
|
||||||
fn is_identifier_start(&self, ch: char) -> bool;
|
fn is_identifier_start(&self, ch: char) -> bool;
|
||||||
/// Determine if a character is a valid identifier character
|
/// Determine if a character is a valid identifier character
|
||||||
fn is_identifier_part(&self, ch: char) -> bool;
|
fn is_identifier_part(&self, ch: char) -> bool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ pub enum SQLOperator {
|
||||||
NotEq,
|
NotEq,
|
||||||
And,
|
And,
|
||||||
Or,
|
Or,
|
||||||
|
Like,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToString for SQLOperator {
|
impl ToString for SQLOperator {
|
||||||
|
@ -32,6 +33,7 @@ impl ToString for SQLOperator {
|
||||||
SQLOperator::NotEq => "!=".to_string(),
|
SQLOperator::NotEq => "!=".to_string(),
|
||||||
SQLOperator::And => "AND".to_string(),
|
SQLOperator::And => "AND".to_string(),
|
||||||
SQLOperator::Or => "OR".to_string(),
|
SQLOperator::Or => "OR".to_string(),
|
||||||
|
SQLOperator::Like => "LIKE".to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
use chrono::{
|
use chrono::{offset::FixedOffset, DateTime, NaiveDate, NaiveDateTime, NaiveTime};
|
||||||
offset::{FixedOffset},
|
|
||||||
DateTime, NaiveDate, NaiveDateTime, NaiveTime,
|
|
||||||
};
|
|
||||||
|
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,7 @@ impl Parser {
|
||||||
&Token::Mod => Ok(SQLOperator::Modulus),
|
&Token::Mod => Ok(SQLOperator::Modulus),
|
||||||
&Token::Keyword(ref k) if k == "AND" => Ok(SQLOperator::And),
|
&Token::Keyword(ref k) if k == "AND" => Ok(SQLOperator::And),
|
||||||
&Token::Keyword(ref k) if k == "OR" => Ok(SQLOperator::Or),
|
&Token::Keyword(ref k) if k == "OR" => Ok(SQLOperator::Or),
|
||||||
|
&Token::Keyword(ref k) if k == "LIKE" => Ok(SQLOperator::Like),
|
||||||
_ => parser_err!(format!("Unsupported SQL operator {:?}", tok)),
|
_ => parser_err!(format!("Unsupported SQL operator {:?}", tok)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -350,6 +351,7 @@ impl Parser {
|
||||||
&Token::Keyword(ref k) if k == "OR" => Ok(5),
|
&Token::Keyword(ref k) if k == "OR" => Ok(5),
|
||||||
&Token::Keyword(ref k) if k == "AND" => Ok(10),
|
&Token::Keyword(ref k) if k == "AND" => Ok(10),
|
||||||
&Token::Keyword(ref k) if k == "IS" => Ok(15),
|
&Token::Keyword(ref k) if k == "IS" => Ok(15),
|
||||||
|
&Token::Keyword(ref k) if k == "LIKE" => Ok(20),
|
||||||
&Token::Eq | &Token::Lt | &Token::LtEq | &Token::Neq | &Token::Gt | &Token::GtEq => {
|
&Token::Eq | &Token::Lt | &Token::LtEq | &Token::Neq | &Token::Gt | &Token::GtEq => {
|
||||||
Ok(20)
|
Ok(20)
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,17 +632,18 @@ PHP ₱ USD $
|
||||||
//assert_eq!(sql, ast.to_string());
|
//assert_eq!(sql, ast.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[ignore]
|
#[test]
|
||||||
fn parse_timestamps_example() {
|
fn parse_timestamps_example() {
|
||||||
let sql = "2016-02-15 09:43:33";
|
let sql = "2016-02-15 09:43:33";
|
||||||
let ast = parse_sql(sql);
|
let _ = parse_sql(sql);
|
||||||
assert_eq!(sql, ast.to_string());
|
//TODO add assertion
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_timestamps_with_millis_example() {
|
fn parse_timestamps_with_millis_example() {
|
||||||
let sql = "2017-11-02 19:15:42.308637";
|
let sql = "2017-11-02 19:15:42.308637";
|
||||||
let _ = parse_sql(sql);
|
let _ = parse_sql(sql);
|
||||||
|
//TODO add assertion
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -874,3 +875,25 @@ fn parser(sql: &str) -> Parser {
|
||||||
debug!("tokens: {:#?}", tokens);
|
debug!("tokens: {:#?}", tokens);
|
||||||
Parser::new(tokens)
|
Parser::new(tokens)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_like() {
|
||||||
|
let sql = String::from("SELECT * FROM customers WHERE name LIKE '%a'");
|
||||||
|
let ast = parse_sql(&sql);
|
||||||
|
assert_eq!(sql, ast.to_string());
|
||||||
|
match ast {
|
||||||
|
ASTNode::SQLSelect { selection, .. } => {
|
||||||
|
assert_eq!(
|
||||||
|
ASTNode::SQLBinaryExpr {
|
||||||
|
left: Box::new(ASTNode::SQLIdentifier("name".to_string())),
|
||||||
|
op: SQLOperator::Like,
|
||||||
|
right: Box::new(ASTNode::SQLValue(Value::SingleQuotedString(
|
||||||
|
"%a".to_string()
|
||||||
|
))),
|
||||||
|
},
|
||||||
|
*selection.unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => assert!(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue