apache / apache/datafusion-sqlparser-rs
Inconsistent spans for function calls
- Lingua principale
- Rust
- Stelle
- 3.5k
- Fork
- 772
- Merge medio
- 4g 9h
- PR unite (30g)
- 17
Descrizione
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
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
Inizia con il caso test_function_span fornito usando Parser::parse_sql e MySqlDialect, quindi traccia come vengono prodotti gli span delle funzioni per database() e left(...). Confronta i limiti degli span per le chiamate con e senza argomenti. Il lavoro è completato quando entrambe le assertions includono sistematicamente la parentesi di chiusura e il test passa.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- rust
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100