象と戯れ

 | 

2011-02-08

列無しテーブル

12:38 | 列無しテーブル - 象と戯れ を含むブックマーク はてなブックマーク - 列無しテーブル - 象と戯れ

SQLではよく「NULLとは何ぞや」という禅問答が繰り広げられます。曰く、「何も値がない状態」だったり、「どのような値かわからない何か」だったり、宗教論争みたいなものです(SQL標準という聖典はあるものの、それを実装した製品はなかったり)。「空とは何か」というのはSQLに留まらず深くて広い問題な訳です。0を発見したインド人はだから偉い。

閑話休題。CF2011-01のレビューとかやってたらテーブルに列がない状態ってありなんだってことに気がつきました。元々は列をDROPしたらできたテーブルなんですが、CREATE TABLEでもできます。

db1=# CREATE TABLE t();
CREATE TABLE

列無しでCREATE TABLEを許容するパーサってのもどうかと思うが。

SELECTするとどうなるのか。

db1=# SELECT * FROM t;
--
(0 rows)

CREATE TABLE後だから0行は当たり前、この出力は納得ですね。では行を挿入できるのか。

db1=# INSERT INTO t VALUES();
ERROR:  syntax error at or near ")"
LINE 1: INSERT INTO t VALUES();
                             ^

VALUESはパーサが空定義を受け入れないって矛盾してるような気もする。でもこんなことで挫けるようでは勇者としての経験値が足りません。

db1=# INSERT INTO t SELECT ('()'::t).*;
INSERT 0 1

リテラル表現で列無しテーブルの型をSELECTしちゃうことで、無事INSERTできた様子。で、SELECT。

db1=# SELECT * FROM t;
--
(1 row)

なんと。psqlはあいかわらず行を表示しないにもかかわらず「1行あります!」と無邪気です。

countも嘘はつきません。

db1=# SELECT count(*) FROM t;
 count 
-------
     1
(1 row)
db1=# INSERT INTO t SELECT ('()'::t).* FROM generate_series(1, 1000);
INSERT 0 1000
db1=# SELECT count(*) FROM t;
 count 
-------
  1001
(1 row)

カタログ上も問題なし。本当に列数が0というだけで一貫性は保たれていることが確認できます。

db1=# SELECT relpages FROM pg_class WHERE oid = 't'::regclass;
 relpages 
----------
        4
(1 row)

db1=# SELECT pg_size_pretty(pg_relation_size('t'));
 pg_size_pretty 
----------------
 32 kB
(1 row)

db1=# SELECT * FROM t;
--
(1001 rows)

やっぱりSELECTの結果はおかしいような気がするけど。

db1=# SELECT pg_column_size(t.*) FROM t;
 pg_column_size 
----------------
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24
             24

行のサイズは最低24バイトってことで、これはsizeof(PageHeaderData)ですね。ちなみに9.1develです。

RayshelonRayshelon2011/04/13 14:089Zy2o4 With the bases loaded you struck us out with that answer!

xzwmhpbxzwmhpb2011/04/13 19:30Dle74u <a href="http://wubbruqvewek.com/">wubbruqvewek</a>

rmxfgdrmxfgd2011/04/23 10:454MObZO <a href="http://tfxjjvjydjcj.com/">tfxjjvjydjcj</a>

ztpynnprabztpynnprab2011/04/24 16:30owKOcD , [url=http://uzhorlowgknc.com/]uzhorlowgknc[/url], [link=http://olmqomuybfst.com/]olmqomuybfst[/link], http://mkyhftyawoqj.com/

 |