標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

【解説】SQL-Bless v0.14.0 を公開しました

v0.13 の時は修正内容が細かく多過ぎたので、解説記事を省いてしまったのですが、今回はがんばってかきました。

起動パラメータの改善

  • MySQL の TIMESTAMP を edit コマンドで適切に扱うには、起動パラメータの DSN で ?parseTime=true&loc=Local と指定しなければいけなかったが、プログラム側で自動でセットするようにした
    GoのMySQLドライバーと loc パラメーター "Local" とSQL-Bless
  • 起動パラメータが冗長だったので、ある程度短く書けるようにした
    sqlbless oracle oracle://USERNAME:PASSWORD@HOSTNAME:PORT/SERVICE
    sqlbless oracle://USERNAME:PASSWORD@HOSTNAME:PORT/SERVICE
    ( DSN部にドライバー名が含まれている場合はドライバー名を省略できるようにした )
  • os.Args[2] を DSN としていたのを strings.Join(os.Args[2:]," ") を DSN にするようにしたので、空白が含まれた DSN でも二重引用符で囲まなくてもよくなった
    sqlbless postgres "host=127.0.0.1 port=5555 user=USERNAME password=PASSWORD dbname=DBNAME sslmode=disable"sqlbless postgres host=127.0.0.1 port=5555 user=USERNAME password=PASSWORD dbname=DBNAME sslmode=disable (大してかわらんけど)

マルチラインコマンドライン部の改善

まず、go-multiline-ny を改良し1、ヒストリ操作で編集中の変更が失なわれないようにしました。

次に、入力終結させるためには Ctrl + J もしくは、最終行末尾にセミコロンを打った上で Enter を押下させるとしていましたが、これの弊害で OraclePL/SQL を実行できない問題がありました。

今回、-term string オプションを用意することで、セミコロンをスラッシュなど別の文字にできるようにしました。これで、OraclePL/SQL のコマンドも実行できるようにしました。

$ sqlbless -term "/" oracle://USERNAME:PASSWORD@HOSTNAME:PORTNO/SERVICENAME
# SQL-Bless v0.14.0-windows-amd64 by go1.22.3
  Ctrl-M or      Enter: Insert Linefeed
  Ctrl-J or Ctrl-Enter: Exec command

SQL> begin
  2>     for i in 1..100000 loop
  3>       insert into TABLENAME values(i);
  4>     end loop;
  5>     commit ;
  6> end;
  7> /
Ok
SQL>

-term のデフォルト値を最初から / にしてもよかったのですが、妙に互換性を崩す変更は今回控えました。

なお、-term の文字列によって

  • 1文字の場合は、最終行の末尾の空白を取り除いた上での最後の文字がそれであれば入力終結とする
  • 2文字以上の場合は、最終行の前後の空白を取り除いたものがそれであれば入力終結とする(ただし英大文字・小文字は区別しない

としているので、Microsoft SQL Server 向けに -term "go" とするのも Ok です。

EDITコマンドの改善

日付文字列のフォーマットが間違っていた場合、テキストスプレッドの入力でエラーになって、せっかく入力したテキストが破棄されてしまい、1から入力し直しになってしまっていました。

csvi 側を改良し2、エラーになった時、破棄して終了するのではなく、今入力した値をデフォルト値にして再入力させるようにしました。

不具合修正

v0.13.0 で

  • xd でセルにNULLを設定する機能を追加
  • -debug を指定することで、ヘッダーを3行にして、2行目、3行目にカラムの型情報を載せられるようにした

という機能を追加したのですが、両者を組み合わせると、型情報セルに NULL を設定できてしまっていました。これでヘッダー行に変更が発生するため、発行すべきではない UPDATE 文が発行できてしまう問題がありました。

まぁ、r キーによるセルのリストアや、SQL実行時のキャンセルや、rollback 文とか、なんぼでも取り消すタイミングがあるので、実害はほとんどないのですが。

あと、こっちの方がやや深刻なのですが、-debug 指定時に型情報の一部が得られないカラムがあった場合に panic が発生する問題があり、これを修正しました。

その他

解説動画を作っていただきました。

日本語版のキャプションがついていますが、本編は中国語です。ですが、日本語字幕がきちんとついているので内容は我々でもわかります。

解説の方はリンクされた記事の内容と .tw ドメインからすると、台湾 SQL Server のユーザの方のようです。嬉しいですね。これで身内に自慢できるというものです。