mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-10 01:08:02 +00:00
Add Boolean value data type
remove unecessary consume of LParen and RParen in default value
This commit is contained in:
parent
2007995938
commit
78c054ea19
3 changed files with 51 additions and 3 deletions
|
@ -438,6 +438,8 @@ impl Dialect for GenericSqlDialect {
|
||||||
"REGCLASS",
|
"REGCLASS",
|
||||||
"TEXT",
|
"TEXT",
|
||||||
"BYTEA",
|
"BYTEA",
|
||||||
|
"TRUE",
|
||||||
|
"FALSE",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue