Add Boolean value data type

remove unecessary consume of LParen and RParen in default value
This commit is contained in:
Jovansonlee Cesar 2018-09-24 05:53:58 +08:00
parent 2007995938
commit 78c054ea19
3 changed files with 51 additions and 3 deletions

View file

@ -438,6 +438,8 @@ impl Dialect for GenericSqlDialect {
"REGCLASS", "REGCLASS",
"TEXT", "TEXT",
"BYTEA", "BYTEA",
"TRUE",
"FALSE",
]; ];
} }

View file

@ -53,6 +53,8 @@ pub enum ASTNode {
SQLLiteralDouble(f64), SQLLiteralDouble(f64),
/// Literal string /// Literal string
SQLLiteralString(String), SQLLiteralString(String),
/// Boolean value true or false,
SQLBoolean(bool),
/// Scalar function call e.g. `LEFT(foo, 5)` /// Scalar function call e.g. `LEFT(foo, 5)`
SQLFunction { id: String, args: Vec<ASTNode> }, SQLFunction { id: String, args: Vec<ASTNode> },
/// SELECT /// SELECT

View file

@ -92,6 +92,8 @@ impl Parser {
"SELECT" => Ok(self.parse_select()?), "SELECT" => Ok(self.parse_select()?),
"CREATE" => Ok(self.parse_create()?), "CREATE" => Ok(self.parse_create()?),
"DELETE" => Ok(self.parse_delete()?), "DELETE" => Ok(self.parse_delete()?),
"TRUE" => Ok(ASTNode::SQLBoolean(true)),
"FALSE" => Ok(ASTNode::SQLBoolean(false)),
_ => return parser_err!(format!("No prefix parser for keyword {}", k)), _ => return parser_err!(format!("No prefix parser for keyword {}", k)),
}, },
Token::Mult => Ok(ASTNode::SQLWildcard), Token::Mult => Ok(ASTNode::SQLWildcard),
@ -385,9 +387,8 @@ impl Parser {
println!("column name: {}", column_name); println!("column name: {}", column_name);
if let Ok(data_type) = self.parse_data_type() { if let Ok(data_type) = self.parse_data_type() {
let default = if self.parse_keyword("DEFAULT"){ let default = if self.parse_keyword("DEFAULT"){
self.consume_token(&Token::LParen);
let expr = self.parse_expr(0)?; let expr = self.parse_expr(0)?;
self.consume_token(&Token::RParen); println!("expr: {:?}", expr);
Some(Box::new(expr)) Some(Box::new(expr))
}else{ }else{
None None
@ -472,7 +473,11 @@ impl Parser {
"BOOLEAN" => Ok(SQLType::Boolean), "BOOLEAN" => Ok(SQLType::Boolean),
"FLOAT" => Ok(SQLType::Float(self.parse_optional_precision()?)), "FLOAT" => Ok(SQLType::Float(self.parse_optional_precision()?)),
"REAL" => Ok(SQLType::Real), "REAL" => Ok(SQLType::Real),
"DOUBLE" => Ok(SQLType::Double), "DOUBLE" => if self.parse_keyword("PRECISION"){
Ok(SQLType::Double)
}else{
Ok(SQLType::Double)
}
"SMALLINT" => Ok(SQLType::SmallInt), "SMALLINT" => Ok(SQLType::SmallInt),
"INT" | "INTEGER" => Ok(SQLType::Int), "INT" | "INTEGER" => Ok(SQLType::Int),
"BIGINT" => Ok(SQLType::BigInt), "BIGINT" => Ok(SQLType::BigInt),
@ -500,6 +505,21 @@ impl Parser {
}else{ }else{
Ok(SQLType::Timestamp) Ok(SQLType::Timestamp)
} }
"TIME" => if self.parse_keyword("WITH"){
if self.parse_keywords(vec!["TIME","ZONE"]){
Ok(SQLType::Time)
}else{
parser_err!(format!("Expecting 'time zone', found: {:?}", self.peek_token()))
}
}else if self.parse_keyword("WITHOUT"){
if self.parse_keywords(vec!["TIME","ZONE"]){
Ok(SQLType::Time)
}else{
parser_err!(format!("Expecting 'time zone', found: {:?}", self.peek_token()))
}
}else{
Ok(SQLType::Timestamp)
}
"REGCLASS" => Ok(SQLType::Regclass), "REGCLASS" => Ok(SQLType::Regclass),
"TEXT" => { "TEXT" => {
if let Ok(true) = self.consume_token(&Token::LBracket){ if let Ok(true) = self.consume_token(&Token::LBracket){
@ -1164,6 +1184,30 @@ mod tests {
} }
} }
#[test]
fn parse_create_table_with_inherit() {
let sql = String::from("
CREATE TABLE bazaar.settings (
user_id uuid,
value text[],
settings_id uuid DEFAULT uuid_generate_v4() NOT NULL,
use_metric boolean DEFAULT true
)
INHERITS (system.record)");
let ast = parse_sql(&sql);
match ast {
ASTNode::SQLCreateTable { name, columns } => {
assert_eq!("bazaar.settings", name);
let c_name = &columns[0];
assert_eq!("user_id", c_name.name);
assert_eq!(SQLType::Custom("uuid".into()), c_name.data_type);
assert_eq!(true, c_name.allow_null);
}
_ => assert!(false),
}
}
#[test] #[test]
fn parse_scalar_function_in_projection() { fn parse_scalar_function_in_projection() {
let sql = String::from("SELECT sqrt(id) FROM foo"); let sql = String::from("SELECT sqrt(id) FROM foo");