◆ 昔エラーでたはず……なのに古いバージョンで試してもでなくて原因が気になる

ブログネタのメモを整理していたら出てきた 結構昔から放置されたものを確認していました

その中にあった mysql のエラー
確か postgresql だと問題なくて mysql だとエラーだったので不便だなって思っていたやつです

今は動くようになってたりしないのかな と確認したらエラーじゃなくなってました
改善したんだ と思ったのですが いつからなのか気になりました

エラー出るはずの処理

こんな SQL だったはずです

create database db;
use db;
create table test (id int primary key, rid int default null);
insert into test values (1, null), (2, 1), (3, 1);

select * from test where id = (select rid from test where id = 2)

ひとつのテーブルに主キーの id カラムと別レコードを参照するための rid カラムがあります
rid カラムは同じテーブルの別レコードの id が入ります

select 文でメインの where 句で同じテーブルを参照するサブクエリを使うと clause がどうこうってエラーが出てたはずです

どのバージョンでも出ない

可能性のあるバージョンをいろいろ試したのですがエラーなく動きます

+----+------+
| id | rid |
+----+------|
| 1 | NULL |
+----+------+

最新 5.7 では出ませんでした
SQL fiddle の 5.6 でも出ません

fedora や centos7 デフォルトの mariadb 10 や 5.5 でも出ません
使ったことある一番古い mysql は centos6 標準の 5.1 のはずですがこれでも出ませんでした

エラーが出るのはメインとサブクエリで同じテーブルを参照して 別レコードを参照する id を通して検索するもので間違いないはずです
テーブル構造か insert しているデータが違うとしか思えないのですが どう変えたらエラーになるのか想像できません

id がユニークでなくサブクエリで複数の結果があるとエラーですが clause がどうこういうエラーメッセージではないです

ぐぐってみると view を使った例がありますが私は mysql で view を使ったことないのでそれも違うはずです
いったいなんなんでしょう
気になって仕方がないです

追記:アップデートかも

メモには select 文が書いてあったので間違ってはないと思うのですが update ではそれらしいエラーが見つかりました

create table test (id int primary key, rid int default null, message varchar(10));
insert into test values
(1, null, 'foo'),
(2, 1, 'bar'),
(3, 2, 'baz');

update test set message = 'changed'
where id = (select rid from test where id = 2)

select で検索するのではなく 検索した結果で update します

You can't specify target table 'test' for update in FROM clause

とエラーになります
postgresql だと問題なく動くので条件にもあってます

でも update だったっけとちょっと腑に落ちません