やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.bail)謎

 何の役に立つのかわからなかった。

成果物

.help

.bail on|off             Stop after hitting an error.  Default OFF

 「エラーが発生した後に停止します。デフォルトOFF」

 OFFということは、エラーが発生しても停止しないということになる。本当か? 停止するのでは?

SQLエラーで停止する

sqlite3 :memory: \
"create table T(C text not null);" \
"insert into T values('A');" \
"insert into T values(NULL);" \
"insert into T values('B');" \
"select * from T;"
Error: NOT NULL constraint failed: T.C

.bailONでもOFFでも

sqlite3 :memory: \
".bail on" \
"create table T(C text not null);" \
"insert into T values('A');" \
"insert into T values(NULL);" \
"insert into T values('B');" \
"select * from T;"
Error: NOT NULL constraint failed: T.C
sqlite3 :memory: \
".bail off" \
"create table T(C text not null);" \
"insert into T values('A');" \
"insert into T values(NULL);" \
"insert into T values('B');" \
"select * from T;"
Error: NOT NULL constraint failed: T.C

 なら.bailとは一体……。

syntax errorでも

sqlite3 :memory: \
".bail off" \
"aaaaaaaaaa" \
"create table T(C text not null);" \
"insert into T values('A');" \
"insert into T values(NULL);" \
"insert into T values('B');" \
"select * from T;"
Error: near "aaaaaaaaaa": syntax error
sqlite3 :memory: \
".bail on" \
"aaaaaaaaaa" \
"create table T(C text not null);" \
"insert into T values('A');" \
"insert into T values(NULL);" \
"insert into T values('B');" \
"select * from T;"
Error: near "aaaaaaaaaa": syntax error

対話モードでも

 「停止」とは、SQLコマンド実行の中断ではなく、対話モードの強制終了を意味しているのでは? と思って試してみた。が、エラーでも嬌声終了されることなどなかった。

 ターミナルで以下コマンド実行。

sqlite3

 対話モードになる。

sqlite> 

 構文エラーでも中断されず。

.bail ON
aaaaaaaaaa;
Error: near "aaaaaaaaaa": syntax error

 NotNull制約エラーでも中断されず。

create table T(C text not null);
insert into T values('A');
insert into T values(NULL);
insert into T values('B');
select * from T;

 上記コマンドを対話モードにペーストすると、以下のような出力になった。エラーがあっても中断されず。

sqlite> create table T(C text not null);
sqlite> insert into T values('A');
sqlite> insert into T values(NULL);
Error: NOT NULL constraint failed: T.C
sqlite> insert into T values('B');
sqlite> select * from T;
A
B
sqlite> 

 上記を.bail OFFで試しても同じだった。

所感

 .bailコマンドって何の役に立つの? どういうときに使うの?

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで