SQLのサブクエリのユニークキー、Nullabilityを計算する
SQLのサブクエリのユニークキーの計算と、Nullabilityを計算するという2つの機能を持つプログラム。 動作の仕組みのメモはreadmeに書いた。
ちゃんと使えるようにすれば、バグの早期発見に多少は役立つのかもしれない。
このようなツールがすでにあったら知りたい。
ユニークキー
SQLでWHERE foo = (SELECT ... )
のように単一のレコードを返す必要がある箇所で複数のレコードが返ると実行時エラーになる。
SQLServerでは以下のメッセージ
メッセージ 512、レベル 16、状態 1、行 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
もちろん TOP 1 などでレコード数を最大1つにすればいいが、静的に検証したい。 ということで、試しにクエリのユニークキーを計算するプログラムを書いてみた。
スキーマはコード中に直書きしているし、対応している構文はごく一部になっている。
なんとなく動いた。
実際に使えるようになるには、where条件で主キーの絞り込みに対応したり、 サブクエリが式として使われる構文に対応する必要がありそう。
便利なのでIDEの機能につけばいいと思うが、なぜか見たことがない。自分が知らないだけかもしれない。 (フルのSQLに対応しようと難しいのだろうか。あるいは大して便利ではないのだろうか)
nullability
SQLの型検査でnullabilityを検査するやつを見たことないので簡単なものを作ってみた。
カラム自体のnullabilityはテーブル定義を見ればわかる。
外部結合によって結合先のテーブルのカラムがnullableになることがあるので、その検査をする。
SQLのNULLについて
C#などの言語でよくあるのは、オブジェクト型の変数の中身がnullになって、メソッド呼び出しでNullReferenceExceptionになるパターンである。
SQLの場合は、演算子のオペランドがnullになると結果もnullになるし、関数の引数にnullが渡ると結果がnullになることが多い。
つまり、C#でいうNull-conditional operator .?
のような動作がデフォルトになる。
意図せずにnullableになって問題になることもあれば、Null-conditional operator的な動作が便利で意図的に使うこともあるので、実際にnullableの検査を実装するとなると、ユーザへの表示の仕方が問題になりそう。