SQLのサブクエリのユニークキー、Nullabilityを計算する

SQLのサブクエリのユニークキーの計算と、Nullabilityを計算するという2つの機能を持つプログラム。 動作の仕組みのメモはreadmeに書いた。

github.com

ちゃんと使えるようにすれば、バグの早期発見に多少は役立つのかもしれない。

このようなツールがすでにあったら知りたい。

ユニークキー

SQLWHERE 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の検査を実装するとなると、ユーザへの表示の仕方が問題になりそう。