apache / apache/datafusion-sqlparser-rs

Inconsistent spans for function calls

Aperta
#2,050 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.