Posted at

ClickHouse公式JDBCドライバにプルリクを出した話


はじめに

ClickHouseというYandex社が中心となって開発しているOSSのDBMSがあります。ClickHouse公式でJDBCドライバが開発されています。

私は昨年このJDBCドライバのリポジトリに対して、プルリク

Enable to get a bound statement in ClickHousePreparedStatement #282

を出しました。このプルリクは無事にmasterブランチにマージされました。

私が第三者が管理するOSSでソースコードで貢献したのはこのときだけです。いまさらですが、このプルリクの内容を簡単に説明しようと思います。


プルリクの内容


概要

簡単にいうと、prepared statementで値を束縛したときのSQLを出力する関数を実装しただけです。

例えば下記のコードのように、プレースホルダーに値を束縛したとします。

String unboundStatement = "SELECT test.example WHERE id IN (?, ?)";

// connectionはClickHouseとの接続オブジェクト
ClickHousePreparedStatement statement = (ClickHousePreparedStatement)
connection.prepareStatement(unboundStatement);
statement.setInt(1, 123); // 1つ目のプレースホルダーに値123を束縛
statement.setInt(2, 456); // 2つ目のプレースホルダーに値456を束縛

ちゃんと値が束縛されているかどうか確認するために、デバッグ出力で

SELECT test.example WHERE id IN (123, 456)

になっているかどうかを見たいと思いました。しかし、値が束縛された後のSQLを出力するための関数がClickHousePreparedStatementクラスにありませんでした。そこでClickHousePreparedStatementtoSqlというメンバ関数を追加し、値が束縛された後のSQLを文字列として取得できるようにしました。


ClickHousePreparedStatement#toSqlの仕様

さきほどのコード例を出すと、何も値を束縛していないときはtoSqlから

SELECT test.example WHERE id IN (?, ?)

が文字列として返ってきます。

statement.setInt(1, 123);

statement.setInt(2, 456);

で値をすべて束縛した後でtoSqlを実行すると

SELECT test.example WHERE id IN (123, 456)

が返ってきます。

仮に全部の値を束縛しない、例えばstatement.setInt(1, 123)だけ実行してstatement.setInt(2, 456)を実行しない場合は、何も束縛されていない場合のSQL

SELECT test.example WHERE id IN (?, ?)

が返ってきます。本当は

SELECT test.example WHERE id IN (123, ?)

が返ってくるようにしたかったのですが、実現しようとすると、SQLを組み立てる関数の例外を出し方を変える等影響範囲が広い改修をする必要になるので、諦めました。


おまけ

プルリク内の追加したテストコードで変数unbindedStatementがありますが、綴りがおかしいですね。正しくはunboundStatementです。