SQLクエリジェネレータsqlsmithを使ってみる

postgresql
この記事は約4分で読めます。

sqlsmithというSQLを自動生成してくれるソフトウェアがある。現在は,PostgreSQL9.1 or laterとSQLite3がサポートされているらしい。

GitHub - anse1/sqlsmith: A random SQL query generator
A random SQL query generator. Contribute to anse1/sqlsmith development by creating an account on GitHub.

Build on OSX

早速ビルドして試してみる。環境はOSX。

とREADME.mdのとおりにすると以下のようなエラーになってしまう。。どうもヘッダーファイルが見つからないらしい。

brew install postgresqlでインストールした先の情報は,以下のようになっており,/usr/local/Cellar/postgresql/9.6.2/includeにあるらしい。

postgres.hhの以下を変更することで対応した。

実行

--max-queriesを指定すると最大試行回数を指定できる。なおトランザクションは全てロールバックされる。

--dry-runするとSQLが標準出力に出力される。

コマンドラインオプション

オプション 説明
--target=constr 接続先 --target="host=/tmp port=5432 dbname=regression"
--sqlite=URI SQLiteへの接続先 --sqlite="foo.db"
--log-to=constr ログ出力先のデータベース。スキーマ定義は,log.sqlにある。 --log-to="host=/tmp port=5432 dbname=regression_log"
--seed シード --seed=$(date +%s)
--dump-all-graphs 生成された抽象構文木ASTを出力する --dump-all-graphs
--dry-run クエリを実行せず出力する --dry-run
--exclude-catalog リレーションにカタログテーブルを使わない --exclude-catalog
--max-queries この値に指定されたクエリを実行すると処理を終了する --max-queries=10

実行情報

--verboseオプションをつけると,クエリ実行の情報が標準エラー出力に表示される。

文字 意味
. 成功
t タイムアウト
s 構文エラー
c コネクションエラー
e その他のエラー

内部調査

全体の処理の流れは以下のようになっている。カスタマイズしたい時の参考になるかもしれない。

メイン処理

メイン部分の処理の流れは以下のとおり。コマンド実行すると,sqliteかpostgresqlかに応じてスキーマ及びドライバを初期化し,無限ループでひたすらクエリを生成して実行する。--max-queriesオプションが指定されていれば,指定回数のクエリが投入されてからプログラムは終了する。

ロガー

クエリ生成及び実行,エラーのタイミングで呼ばれる。処理内容は,generatedexecutederrorメソッドで実装する。loggerクラスの仮想関数をオーバーライドすれば独自のロガーを作成できる。

impedance_feedback

クエリ実行の統計を記録する

pqxx_logger

クエリ実行の統計情報をpostgresqlデータベースに記録する。

cerr_logger

標準エラー出力に情報を出力する。--verboseオプションが指定された場合に有効。

ast_logger

--dump-all-graphsオプションが指定された場合に有効。ASTをxml形式でファイルに出力する。sqlsmith-<実行回数>.xmlというファイル名で作業ディレクトリに出力される。xmlは,graphml形式に対応している。

クエリ生成

ASTノードはクラスで宣言されており,各ノードクラスのoutメソッドを呼ぶことでクエリが組み立てられる。ASTノードのベースクラスはprodクラスである。

またASTは,Visitorパターンで実装されている。ASTツリーをwalkしたい場合はVisitorを実装して,ルートノードのacceptにVisitorオブジェクトを渡して呼び出してやれば良い。

各ノードのクエリ生成をカスタマイズするには,ASTノードクラスのoutメソッドをオーバーライドすれば可能である。以下例である。

ASTノード生成の関数も少し触る必要がある。

参考リンク

  • https://korte.credativ.com/~ase/sqlsmith-talk.pdf
  • https://github.com/anse1/sqlsmith

コメント

タイトルとURLをコピーしました