Merge branch 'master' into join-support

This commit is contained in:
Andy Grove 2019-01-12 08:33:12 -07:00 committed by GitHub
commit ab423bc9dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 10 deletions

View file

@ -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/"

View file

@ -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,
]; ];
} }

View file

@ -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;
} }

View file

@ -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(),
} }
} }
} }

View file

@ -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;

View file

@ -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)
} }

View file

@ -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),
}
}