mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-11-13 20:25:17 +00:00
Support qualified function names
...e.g. `db.schema.func()`
This commit is contained in:
parent
d4de248c73
commit
4a5dc8dd4b
3 changed files with 17 additions and 13 deletions
|
|
@ -54,7 +54,7 @@ pub enum ASTNode {
|
||||||
/// Qualified wildcard, e.g. `alias.*` or `schema.table.*`.
|
/// Qualified wildcard, e.g. `alias.*` or `schema.table.*`.
|
||||||
/// (Same caveats apply to SQLQualifiedWildcard as to SQLWildcard.)
|
/// (Same caveats apply to SQLQualifiedWildcard as to SQLWildcard.)
|
||||||
SQLQualifiedWildcard(Vec<SQLIdent>),
|
SQLQualifiedWildcard(Vec<SQLIdent>),
|
||||||
/// Multi part identifier e.g. `myschema.dbo.mytable`
|
/// Multi-part identifier, e.g. `table_alias.column` or `schema.table.col`
|
||||||
SQLCompoundIdentifier(Vec<SQLIdent>),
|
SQLCompoundIdentifier(Vec<SQLIdent>),
|
||||||
/// `IS NULL` expression
|
/// `IS NULL` expression
|
||||||
SQLIsNull(Box<ASTNode>),
|
SQLIsNull(Box<ASTNode>),
|
||||||
|
|
@ -100,9 +100,8 @@ pub enum ASTNode {
|
||||||
/// SQLValue
|
/// SQLValue
|
||||||
SQLValue(Value),
|
SQLValue(Value),
|
||||||
/// Scalar function call e.g. `LEFT(foo, 5)`
|
/// Scalar function call e.g. `LEFT(foo, 5)`
|
||||||
/// TODO: this can be a compound SQLObjectName as well (for UDFs)
|
|
||||||
SQLFunction {
|
SQLFunction {
|
||||||
name: SQLIdent,
|
name: SQLObjectName,
|
||||||
args: Vec<ASTNode>,
|
args: Vec<ASTNode>,
|
||||||
over: Option<SQLWindowSpec>,
|
over: Option<SQLWindowSpec>,
|
||||||
},
|
},
|
||||||
|
|
@ -176,7 +175,7 @@ impl ToString for ASTNode {
|
||||||
}
|
}
|
||||||
ASTNode::SQLValue(v) => v.to_string(),
|
ASTNode::SQLValue(v) => v.to_string(),
|
||||||
ASTNode::SQLFunction { name, args, over } => {
|
ASTNode::SQLFunction { name, args, over } => {
|
||||||
let mut s = format!("{}({})", name, comma_separated_string(args));
|
let mut s = format!("{}({})", name.to_string(), comma_separated_string(args));
|
||||||
if let Some(o) = over {
|
if let Some(o) = over {
|
||||||
s += &format!(" OVER ({})", o.to_string())
|
s += &format!(" OVER ({})", o.to_string())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -175,10 +175,10 @@ impl Parser {
|
||||||
expr: Box::new(self.parse_subexpr(p)?),
|
expr: Box::new(self.parse_subexpr(p)?),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// another SQLWord:
|
// Here `w` is a word, check if it's a part of a multi-part
|
||||||
|
// identifier, a function call, or a simple identifier:
|
||||||
_ => match self.peek_token() {
|
_ => match self.peek_token() {
|
||||||
Some(Token::LParen) => self.parse_function(w.as_sql_ident()),
|
Some(Token::LParen) | Some(Token::Period) => {
|
||||||
Some(Token::Period) => {
|
|
||||||
let mut id_parts: Vec<SQLIdent> = vec![w.as_sql_ident()];
|
let mut id_parts: Vec<SQLIdent> = vec![w.as_sql_ident()];
|
||||||
let mut ends_with_wildcard = false;
|
let mut ends_with_wildcard = false;
|
||||||
while self.consume_token(&Token::Period) {
|
while self.consume_token(&Token::Period) {
|
||||||
|
|
@ -197,10 +197,15 @@ impl Parser {
|
||||||
}
|
}
|
||||||
if ends_with_wildcard {
|
if ends_with_wildcard {
|
||||||
Ok(ASTNode::SQLQualifiedWildcard(id_parts))
|
Ok(ASTNode::SQLQualifiedWildcard(id_parts))
|
||||||
|
} else {
|
||||||
|
if self.consume_token(&Token::LParen) {
|
||||||
|
self.prev_token();
|
||||||
|
self.parse_function(SQLObjectName(id_parts))
|
||||||
} else {
|
} else {
|
||||||
Ok(ASTNode::SQLCompoundIdentifier(id_parts))
|
Ok(ASTNode::SQLCompoundIdentifier(id_parts))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_ => Ok(ASTNode::SQLIdentifier(w.as_sql_ident())),
|
_ => Ok(ASTNode::SQLIdentifier(w.as_sql_ident())),
|
||||||
},
|
},
|
||||||
}, // End of Token::SQLWord
|
}, // End of Token::SQLWord
|
||||||
|
|
@ -237,7 +242,7 @@ impl Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_function(&mut self, name: SQLIdent) -> Result<ASTNode, ParserError> {
|
pub fn parse_function(&mut self, name: SQLObjectName) -> Result<ASTNode, ParserError> {
|
||||||
self.expect_token(&Token::LParen)?;
|
self.expect_token(&Token::LParen)?;
|
||||||
let args = if self.consume_token(&Token::RParen) {
|
let args = if self.consume_token(&Token::RParen) {
|
||||||
vec![]
|
vec![]
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ fn parse_select_count_wildcard() {
|
||||||
let select = verified_only_select(sql);
|
let select = verified_only_select(sql);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&ASTNode::SQLFunction {
|
&ASTNode::SQLFunction {
|
||||||
name: "COUNT".to_string(),
|
name: SQLObjectName(vec!["COUNT".to_string()]),
|
||||||
args: vec![ASTNode::SQLWildcard],
|
args: vec![ASTNode::SQLWildcard],
|
||||||
over: None,
|
over: None,
|
||||||
},
|
},
|
||||||
|
|
@ -533,7 +533,7 @@ fn parse_scalar_function_in_projection() {
|
||||||
let select = verified_only_select(sql);
|
let select = verified_only_select(sql);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&ASTNode::SQLFunction {
|
&ASTNode::SQLFunction {
|
||||||
name: String::from("sqrt"),
|
name: SQLObjectName(vec![String::from("sqrt")]),
|
||||||
args: vec![ASTNode::SQLIdentifier(String::from("id"))],
|
args: vec![ASTNode::SQLIdentifier(String::from("id"))],
|
||||||
over: None,
|
over: None,
|
||||||
},
|
},
|
||||||
|
|
@ -555,7 +555,7 @@ fn parse_window_functions() {
|
||||||
assert_eq!(4, select.projection.len());
|
assert_eq!(4, select.projection.len());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&ASTNode::SQLFunction {
|
&ASTNode::SQLFunction {
|
||||||
name: "row_number".to_string(),
|
name: SQLObjectName(vec!["row_number".to_string()]),
|
||||||
args: vec![],
|
args: vec![],
|
||||||
over: Some(SQLWindowSpec {
|
over: Some(SQLWindowSpec {
|
||||||
partition_by: vec![],
|
partition_by: vec![],
|
||||||
|
|
@ -636,7 +636,7 @@ fn parse_delimited_identifiers() {
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&ASTNode::SQLFunction {
|
&ASTNode::SQLFunction {
|
||||||
name: r#""myfun""#.to_string(),
|
name: SQLObjectName(vec![r#""myfun""#.to_string()]),
|
||||||
args: vec![],
|
args: vec![],
|
||||||
over: None,
|
over: None,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue