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]
name = "sqlparser"
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>"]
homepage = "https://github.com/andygrove/sqlparser-rs"
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,
BOOLEAN, DATE, TIME, TIMESTAMP, CASE, WHEN, THEN, ELSE, END, JOIN, LEFT, RIGHT, FULL,
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;
mod postgresql;
pub use self::ansi_sql::AnsiSqlDialect;
pub use self::generic_sql::GenericSqlDialect;
pub use self::postgresql::PostgreSqlDialect;

View file

@ -14,6 +14,7 @@ pub enum SQLOperator {
NotEq,
And,
Or,
Like,
}
impl ToString for SQLOperator {
@ -32,6 +33,7 @@ impl ToString for SQLOperator {
SQLOperator::NotEq => "!=".to_string(),
SQLOperator::And => "AND".to_string(),
SQLOperator::Or => "OR".to_string(),
SQLOperator::Like => "LIKE".to_string(),
}
}
}

View file

@ -1,7 +1,4 @@
use chrono::{
offset::{FixedOffset},
DateTime, NaiveDate, NaiveDateTime, NaiveTime,
};
use chrono::{offset::FixedOffset, DateTime, NaiveDate, NaiveDateTime, NaiveTime};
use uuid::Uuid;

View file

@ -329,6 +329,7 @@ impl Parser {
&Token::Mod => Ok(SQLOperator::Modulus),
&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 == "LIKE" => Ok(SQLOperator::Like),
_ => 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 == "AND" => Ok(10),
&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 => {
Ok(20)
}

View file

@ -632,17 +632,18 @@ PHP ₱ USD $
//assert_eq!(sql, ast.to_string());
}
#[ignore]
#[test]
fn parse_timestamps_example() {
let sql = "2016-02-15 09:43:33";
let ast = parse_sql(sql);
assert_eq!(sql, ast.to_string());
let _ = parse_sql(sql);
//TODO add assertion
}
#[test]
fn parse_timestamps_with_millis_example() {
let sql = "2017-11-02 19:15:42.308637";
let _ = parse_sql(sql);
//TODO add assertion
}
#[test]
@ -874,3 +875,25 @@ fn parser(sql: &str) -> Parser {
debug!("tokens: {:#?}", 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),
}
}