apache / apache/datafusion-sqlparser-rs
Inconsistent spans for function calls
- Lenguaje dominante
- Rust
- Estrellas
- 3.5k
- Forks
- 772
- Merge medio
- 4 d 9 h
- PR fusionados (30 d)
- 17
Descripción
When using functions spans, it appears that sometimes the closing parenthesis is included, sometimes not.
Consider the following test:
```rust
#[test]
fn test_function_span() {
let sql = "SELECT database(), left(user(),instr(concat(user(),'@'),'@')-1);";
let r = Parser::parse_sql(&crate::dialect::MySqlDialect {}, sql).unwrap();
let query = match &r[0] {
crate::ast::Statement::Query(q) => q,
_ => panic!("Expected query"),
};
let select = match query.body.as_ref() {
crate::ast::SetExpr::Select(s) => s,
_ => panic!("Expected select"),
};
let database_func = match &select.projection[0] {
crate::ast::SelectItem::UnnamedExpr(crate::ast::Expr::Function(func)) => func,
_ => panic!("Expected function expression"),
};
let span = database_func.span();
assert_eq!(span.start, (1, 8).into());
assert_eq!(span.end, (1, 17).into()); // fails here
let left_func = match &select.projection[1] {
crate::ast::SelectItem::UnnamedExpr(crate::ast::Expr::Function(func)) => func,
_ => panic!("Expected function expression"),
};
let span = left_func.span();
assert_eq!(span.start, (1, 20).into());
assert_eq!(span.end, (1, 63).into());
}
```
In both cases, we're testing if the closing parenthesis is included in the span. The first span test for `database_func` fails:
```diff
Diff < left / right > :
-Location(1,16)
+Location(1,17)
```
If I comment that part, the second pair of span assertions passes correctly.
In other words, it seems that we only include closing parentheses for function calls with arguments, but not if there's no argument.
Related: #1548 #1563 #1676
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Comienza con el caso proporcionado test_function_span usando Parser::parse_sql y MySqlDialect; después, sigue cómo se producen los spans de función para database() y left(...). Compara los límites de los spans para las llamadas con y sin argumentos. La tarea está terminada cuando ambas assertions incluyen sistemáticamente el paréntesis de cierre y el test pasa.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- rust
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100