今時点のVoltDBにはcreate functionとかがなくて、ちょっとした変換は、存在するSQL Functionを組み合わせる必要があります。*1
自分らの都合だけでいうとinet_ntoaみたいなのが欲しい、と思う瞬間があったりします。アプリケーションとしてはVoltDBの思想からいくとProcedureで書けばたいていはよい結果が得られますし、sqlcmdのようなアドリブ的には
cast(BIT_SHIFT_RIGHT(BITAND(c,4278190080),24) as varchar) || '.' || BIT_SHIFT_RIGHT(BITAND(c,16711680),16) || ',' || BIT_SHIFT_RIGHT(BITAND(c,65280),8) || '.' || BITAND(c,255)
とか書けばいいのでしょうが、時間たってくるとこれがイヤ(というか手間にもほどがある)になってきてしまいました。それで改善案のひとつとしてsqlcmdでprocedureを登録してからcallを実行、とか考えたわけです。ある程度はスクリプト側で変換すればいいや、と。*2
でもそれもイヤになってきてしまい、まずは自分で追加できる?みたいなことを考えてみることにしました*3
https://github.com/VoltDB/voltdb/wiki/Implementing-sql-functionsを読んでみると
そうすると開発・検証用でしか、なかなか使いにくい、ということになります。でも、それでも使い勝手あがりそうです。
sqlcmdのところで関数定義して折り返すのはない?ととりあえず思ってみたけど、上記方法を試している過程でどうもorg.voltdb.utils.SQLCommandではVoltDBプロセスにコマンドライン丸ごと送っているようなので*4、その方法をするのはorg.voltdb.utils.SQLCommandにパースをいれるところから、になってしまいそうです。
とりあえずinet_ntoaぽいcustom functionの追加を試すのはできました。本質的新規追加関数のテストコード書くのは複雑だぞって説明にもあってregression-testコードの追加ができてません。確かに作った関数の呼び出しテストレベルはUnitTestでなくてもすぐにできましたがC++のコアの本質的なテストはどこまですればいいかみたいなのがわかりません*5*6
師匠の薦めにより、この修正をpull requestしました。gitを操作するのこのリンク*7を頼りにしました。