goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

(Tsurugi)Tsubakuro 1.1.0の変更点

2023-12-21 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の21日目です。

2023/12/7にTsurugi 1.0.0-BETA2が公開されましたが、そのときにJavaの通信ライブラリーであるTsubakuroは1.1.0になりました。

Tsubakuro 1.0.1と1.1.0の大きな違いは、更新系SQLを実行するメソッド(TransactionのexecuteStatementメソッド)の戻り値の型が、FutureResponse<Void>からFutureResponse<ExecuteResult>に変わったことでしょうか。
つまり、1.0.1でFutureReponse<Void>を受け取るように書いたソースコードは、1.1.0ではコンパイルエラーになるということです。(awaitメソッドで受けて戻り値を無視していたら関係ありませんが^^;)

あと、service message versionも追加になっているますが、それについてはアドベントカレンダーの13日目をご覧ください。


Tsurugiで使えるSQLの演算子

2023-12-20 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の20日目です。

現時点のTsurugi(1.0.0-BETA2)では、まだ未対応のSQL構文や演算子があります。どんな構文が使えるかと、これから何が実装される予定なのかはAvailable SQL features in Tsurugiに書かれています。

未対応の演算子を使おうとすると、SYNTAX_EXCEPTIONが発生するケースとUNSUPPORTED_RUNTIME_FEATURE_EXCEPTIONが発生するケースがあります。

SYNTAX_EXCEPTIONは文法エラーですが、全く対応されていない構文や演算子に対しても発生します。
例えばinやbetweenを使おうとすると発生します。

UNSUPPORTED_RUNTIME_FEATURE_EXCEPTIONは、構文上は対応されているけれども内容が実装されていないものに対して発生するエラーです。
例えばlikeをTsurugi 1.0.0-BETA2で使おうとすると発生します。
ちなみにlikeをTsurugi 1.0.0-BETA1で使うとエラーは発生しませんが、実行結果は常にunknown扱い(where条件ではfalseと同じ)になります。


Tsurugiのcreate index

2023-12-18 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の18日目です。

TsurugiはRDBMSですが、内部はKVS(Key Value Store)です。
実体はMasstreeというものらしいですが、これはキー順に並べたデータ構造らしいです。つまり自動的にキーで並ぶので、プライマリキー専用のインデックスというものは作られません。

そして、プライマリキー以外のインデックスを作る手段がcreate indexです。
ただし、現時点(Tsurugi 1.0.0-BETA2)では、create indexでインデックスを作った後に入れたデータにしか作用しません。つまり、データが有る状態でcreate indexしても、既存データは索引対象になりません。
すなわち、既存RDBMSでよくある「テーブルにデータをロードしてからインデックスを作成することで高速化する」という手法は、現時点のTsurugiでは適用できないということになります。


Tsurugiのdrop table

2023-12-16 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の16日目です。

テーブルを削除するdrop table文ですが、現在のTsurugi(1.0.0-BETA2)では、DML実行中にdrop tableを行うのは危険です。
DMLで処理中のテーブルを削除すると、Tsurugiサーバーがクラッシュする可能性があります。


ところで、Tsurugi 1.0.0-BETA2では、drop table if existsが使えるようになりました。
テーブルが無い場合でもエラーにならないので便利です。

ちなみにテーブルの存在有無を確認する方法は(SQLを実行してtable not foundのエラーになる以外の方法は)、

  • Tsurugi SQLコンソール(tgsql)の場合は「\show table テーブル名」を実行する
  • Iceaxeの場合はTsurugiSessionのfindTableMetadataメソッドを実行する(テーブルが無ければOptional.emptyが返る)

といったものが考えられます。


Tsurugiのcreate table

2023-12-15 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の15日目です。

テーブルを作成するcreate table文は、Tsurugiではまだ未対応のデータ型があります。binaryとかBLOBとか。

char/varcharは対応していますが、現状(Tsurugi 1.0.0-BETA2)では、指定する桁数はバイト数であって文字数ではないことに注意が必要です。
char/varcharにinsert/updateするときは、UTF-8に変換されて入れられます。

また、今はchar/varcharにヌル文字(文字コード0)を含めることが出来ません。
Tsurugi 1.0.0-BETA1では、ヌル文字が含まれた文字列のinsertは出来ますが、select時にERR_DATA_CORRUPTIONが発生します。
Tsurugi 1.0.0-BETA2では、ヌル文字が含まれた文字列をinsertしようとするとINVALID_RUNTIME_VALUE_EXCEPTIONが発生します。
embulk-output-tsurugidb 0.1.3では、ヌル文字が含まれているレコードはinsertをスキップするようにしました。

それと、decimal(「decimal(4,1)みたいな」)や dateも使うことが出来ますが、リテラルが対応していません。
つまり、Tsurugi SQLコンソール(tgsql)からinsert文で値を入れることが出来ません^^;
decimalについては、castで代用することが出来ますが。
(decimalもdateも、Iceaxeからバインド変数を使って入れることは可能です)


ところで、Tsurugi 1.0.0-BETA2では、create table if not existsが使えるようになりました。
テーブルが存在しないときだけcreate tableを実行します。(テーブルが存在しているときは何もしません(エラーにもなりません))