apache / apache/datafusion-sqlparser-rs

support scientific notation when parsing numbers

オープン
#610 コメント 2 件 リアクション 1 件 担当者 0 名 GitHub で見る
主要言語
Rust
スター
3.5k
フォーク
772
平均マージ
4日 9時間
マージ済み PR(30日)
17

説明

`select 1e3` currently identifies 1 as a number and e3 as alias. Instead, it should return 1e3 as part of the string Number.

```sql
select 1e3; -- returns now e3 as identifier and 1 as number, but should return 1e3 as number
select 1e3a; -- should return 1e3 as number, and a as identifier
select 1e; -- should return 1e as the number (currently returns 1 as number, e as identifier)
select 1e.5; -- correctly returns syntax error
select .5e2; -- should return .5e2 as number, but currently returns .5 as number, e2 as identifier
```

Since the user of the library will get back a string representing the number anyway and must parse it, we could recognize the e notation and leave it as part of the string in Number.

For example, Rust can parse scientific notation to f64:
```rust
let v = ["1", "1e3", "1e", ".5e2", "1e-1"];
for s in v {
let _ = s
.parse::()
.map(|i| println!("parsed {} as i64: {}", s, i))
.or_else(|_| {
s.parse::()
.map(|f| println!("parsed {} as f64: {}", s, f))
})
.map_err(|_| println!("couldn't parse {}", s));
}
```

```
parsed 1 as i64: 1
parsed 1e3 as f64: 1000
couldn't parse 1e
parsed .5e2 as f64: 50
parsed 1e-1 as f64: 0.1
```
Only problem is that `1e` parses to `1` in Postgres, but it wouldn't in this case without special handling by the parsers. In any case, this is an argument in favor of returning scientific notation as part of the existing Number enum value.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Issue ではファイルもテストも指定されていません。まず SQL lexer または数値トークンのパース処理のエントリポイントを特定し、次に記載された入力を再現して、末尾の識別子と指数の符号を含む科学表記法のカバレッジを追加してください。各例が要求された Number または identifier トークンを生成し、`1e.5` に対する既存の構文エラーを変更しなければ完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
rust, sql
領域
compilers, databases
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。