2023/5/16 Dataform format をマシにしたい
問題
QUALIFY 句が横につながってしまう
内部でこれを使っているが古すぎる
これのバージョンを上げれば良さそう
当時なかった SQL エンジン別のフォーマッタもあるので、warehouse から決めてあげるとよいかも
設定読んで warehouse 切り替えるのが手間そう
バージョン上げた時に ${ref()} とかは大丈夫かどうか
デフォルトは language: "sql" でいい
Dataform がサポートする製品に一通り整合的な language を与えれるか
(dataform) -> (sql-formatter)
BigQuery → bigquery
Snowflake → snowflake
Redshift → redshift
Postgres → postgresql
Azure SQL data warehouse → 明確にこれってやつはない?
フォーマットしている場所
何回もトライしている...
CLI から呼び出しているのは?
df/sqlx/format が export しているのは format(text, ext) と formatFile(filename, options) だけ
formatFile の利用箇所は CLI のみ
formatはなさそうかな?
projectDirMustExistOption なので dir があることはチェック済みと見てよいか?
warehouse とってきて渡せる?
CLI 経由ならいけそうかな
core や api で他に config の warehouse とってきてるところ探す
これは ~/.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 側が変?
あれ? これだと 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 はスペース入らない、関数として宣言されている
bq は定義されてない
これにあわせればいいけど、UNNEST って "関数" なのか?
unnest operator
関連して直りそうな問題
なおる
どうだろう
sql-formatter は問題ない、dataform 側で文字列パースする際に変になるかも...
これは dataform 側の lexer から修正しないといけない
手入れたけどかなりデカい変更になりそう
これは sql-ormatter 側でもだめそう、まあ operator に追加するだけならすぐかな...
このへんで、python に replace する試みが動いていそうなことに気づき萎える
Issue 立てたい
code:order
GitHub のオープンソースプロジェクトの Issue を作成して、問題を報告したいです
以下の内容をシンプルな英語に翻訳してください。
"""
タイトル: sql-formatter の更新によっていくつかの format についての issue が解決します
sql-formatter の更新をしませんか?
今 dataform が依存しているのは ^2.3.3 でおよそ4年前のバージョンです。
最新の sql-formatter は 12.2.1 です。
更新することでフォーマットに関するこれらの Issue が解決します。
- sql-formatter-org/sql-formatter#602 で修正がマージされました
- 現在の sql-formatter ではフォーマットできます
- これは dataform の lexer も修正する必要があります、更新だけでは解決しません
## sql-formatter の方言の扱い
現行の sql-formatter にはデータベース製品ごとの "方言" の機能があります。
Dataform の warehouse 設定に応じた値をフォーマッタに渡すとより適切にフォーマットされることが期待できます。
中立的なデフォルトの StandardSQL を使うと UNNEST や QUALIFY のフォーマットがうまくできませんし、設定を参照する必要がでてくると思います。また、現行のテストでは方言の違いをカバーしきれませんし、詳細なテストを Dataform で行うのも適していないと思います。
また、いくつかの場合でフォーマット結果が変わることを確認しています。
現行の examples/formatter/ は BigQuery を仮定しているようなので、BigQuery としてフォーマットすると、
- IF, IFNULL の後のスペースがなくなる
- UNNEST の後にスペースが入る
- ALTER TABLE {name} の後に改行が入る
フォーマット結果に差異が生まれてしまいますが、QUALIFY は良く使われる語句ですし、名前付き引数はフォーマットをすることでクエリが壊れてしまいます。上げるメリットは十分にあるように思います。
実は lexer の修正も手元にはあるのだが差分が大きくなりすぎるし...とおいてある
→ やってマージされた