2023/5/16 Dataform format をマシにしたい
#Dataform #OSS
問題
QUALIFY 句が横につながってしまう
sql-formatter-org/sql-formatter: A whitespace formatter for different query languages
内部でこれを使っているが古すぎる
これのバージョンを上げれば良さそう
当時なかった SQL エンジン別のフォーマッタもあるので、warehouse から決めてあげるとよいかも
設定読んで warehouse 切り替えるのが手間そう
バージョン上げた時に ${ref()} とかは大丈夫かどうか
sql-formatter/language.md at master · sql-formatter-org/sql-formatter · GitHub
デフォルトは language: "sql" でいい
Dataform がサポートする製品に一通り整合的な language を与えれるか
(dataform) -> (sql-formatter)
BigQuery → bigquery
Snowflake → snowflake
Redshift → redshift
Postgres → postgresql
Azure SQL data warehouse → 明確にこれってやつはない?
フォーマットしている場所
dataform-co/dataform@main - sqlx/format.ts#L202
何回もトライしている...
CLI から呼び出しているのは?
dataform-co/dataform@main - cli/index.ts#L713
formatFile → dataform-co/dataform@main - sqlx/format.ts#L34
df/sqlx/format が export しているのは format(text, ext) と formatFile(filename, options) だけ
formatFile の利用箇所は CLI のみ
formatはなさそうかな?
projectDirMustExistOption なので dir があることはチェック済みと見てよいか?
warehouse とってきて渡せる?
CLI 経由ならいけそうかな
core や api で他に config の warehouse とってきてるところ探す
dataform-co/dataform@main - cli/config.ts
これは ~/.dataform/settings.json にある利用状況の収集に同意するかの設定
プロジェクトではない
バージョン上げて動かしてみると失敗する
placeholder の扱いっぽい
ref とかを placeholder に置き換えて sql-formatter で format して placeholder を元に戻している
バージョン上げると placeholder 部分が syntax error になる?
文字列に quote してあげるとよさそうだが...
UUIDv4 の先頭 16 文字をとっている
select 1a こういうのは例外になる、文字列から始まればよさそうなので p とか頭につける
色々挙動が変わる
IF ( や UNNEST () のようなスペースが入る
r"" のような正規表現リテラル prefix で r "" になる
これいいのか?
SELECT r"hoge" はいいけど SELECT r "hoge" はエラーになる
sql-formatter 側が変?
SQL Formatter
あれ? これだと SELECT REGEXP_EXTRACT("", r"hoge") で BigQuery 選べば問題ない
ライブラリとして使った時 dialect や language が効いてない?
language: bigquery のとき、IF の後のカッコはつかなくなるが正規表現文字列リテラルはスペースが入る
単体で動かしてみる → web の playground と同じ
使う側が悪そうだが...
2箇所 format 呼ぶ場所があった... 両方パラメータ渡す
それでもテスト落ちるね、これはフォーマッタの挙動の差だと思う
dataform format では
IF, IFNULL の後のカッコ前にスペース入る
alter table\ntable になる
sql-formatter は UNNEST の後のカッコ前にスペース入る
この挙動を合わせるのはまあ無理
UNNEST はいけるかな? sql-formatter 側だわ
postgres はスペース入らない、関数として宣言されている
sql-formatter-org/sql-formatter@8b76638 - src/languages/postgresql/postgresql.functions.ts#L398
bq は定義されてない
これにあわせればいいけど、UNNEST って "関数" なのか?
unnest operator
関連して直りそうな問題
Make QUALIFY behave like HAVING or WHERE when formatter is run on the code · Issue 1077 · dataform-co/dataform
なおる
dataform format breaks triple-quoted strings in BigQuery · Issue 1444 · dataform-co/dataform
どうだろう
sql-formatter は問題ない、dataform 側で文字列パースする際に変になるかも...
これは dataform 側の lexer から修正しないといけない
手入れたけどかなりデカい変更になりそう
Formatter breaks BQ named arguments · Issue 1070 · dataform-co/dataform
これは sql-ormatter 側でもだめそう、まあ operator に追加するだけならすぐかな...
FORMATTING Named arguments in BigQuery · Issue 602 · sql-formatter-org/sql-formatter
Support named arguments for BigQuery by pokutuna · Pull Request 603 · sql-formatter-org/sql-formatter
このへんで、python に replace する試みが動いていそうなことに気づき萎える
dataform-co/dataform at sqly
Issue 立てたい
code:order
GitHub のオープンソースプロジェクトの Issue を作成して、問題を報告したいです
以下の内容をシンプルな英語に翻訳してください。
"""
タイトル: sql-formatter の更新によっていくつかの format についての issue が解決します
sql-formatter の更新をしませんか?
今 dataform が依存しているのは ^2.3.3 でおよそ4年前のバージョンです。
最新の sql-formatter は 12.2.1 です。
更新することでフォーマットに関するこれらの Issue が解決します。
- #1070
- sql-formatter-org/sql-formatter#602 で修正がマージされました
- #1077
- 現在の sql-formatter ではフォーマットできます
- #1444
- これは dataform の lexer も修正する必要があります、更新だけでは解決しません
## sql-formatter の方言の扱い
現行の sql-formatter にはデータベース製品ごとの "方言" の機能があります。
https://github.com/sql-formatter-org/sql-formatter/blob/master/docs/language.md
Dataform の warehouse 設定に応じた値をフォーマッタに渡すとより適切にフォーマットされることが期待できます。
中立的なデフォルトの StandardSQL を使うと UNNEST や QUALIFY のフォーマットがうまくできませんし、設定を参照する必要がでてくると思います。また、現行のテストでは方言の違いをカバーしきれませんし、詳細なテストを Dataform で行うのも適していないと思います。
また、いくつかの場合でフォーマット結果が変わることを確認しています。
現行の examples/formatter/ は BigQuery を仮定しているようなので、BigQuery としてフォーマットすると、
- IF, IFNULL の後のスペースがなくなる
- UNNEST の後にスペースが入る
- ALTER TABLE {name} の後に改行が入る
フォーマット結果に差異が生まれてしまいますが、QUALIFY は良く使われる語句ですし、名前付き引数はフォーマットをすることでクエリが壊れてしまいます。上げるメリットは十分にあるように思います。
https://github.com/dataform-co/dataform/issues/1489
https://github.com/dataform-co/dataform/pull/1490
実は lexer の修正も手元にはあるのだが差分が大きくなりすぎるし...とおいてある
→ やってマージされた