Hatena::ブログ(Diary)

日々の記録 別館

2012-01-18

バイナリ形式COPY文の怪

ちょっと仕事の関係でバイナリフォーマットをCOPYしようと思って気がついたこと。
(環境はPostgreSQL 9.1.2)

PostgreSQLCOPY文ではOPTIONでFOMATの指定が可能なのだが、text, csvは普通に記述できるけど、binaryを書くとsyntaxエラーになってしまう。(´・ω・`)

db=# COPY foo FROM STDIN WITH ( FORMAT binary );
ERROR: syntax error at or near "binary"

もちろんtextやcsvはそのまま記述可能。
db=# COPY foo FROM STDIN WITH ( FORMAT text );
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>

binaryの場合は二重引用符で引用しないと駄目っぽい。
db=# COPY foo FROM STDIN WITH ( FORMAT "binary" ););
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>>

これは一体どういうことなのか・・・。PostgreSQL文書のCOPYのページにも、特にbinaryのときには二重引用符で引用しなければならない、とは記述がない。
ちょいと不思議な気がしたので、PostgreSQL文書のSQLキーワードのページを見ると・・・

binary予約(関数または型として使用可)
csv未予約
text未予約

となっている。そう、binaryだけキーワードの扱いが違うのだ。
逆に言えば、csvやtextというトークンは実はそのまま名標に書けるということだ。どういうことかと言うと、csvという名前のカラムやtextという名前のテーブルが作成できるということ。binaryという名前は引用しないとそういうことは出来ない。

こうなった経緯は良くわからなかったが、PostgreSQL - bugs - COPY .... WITH (FORMAT binary) causes syntax error at or near "binary" | Threaded Viewを流し読みした感じでは旧バージョン(7.3以前)との互換性などが関係しているようだ。

過去の経緯はともかくとして、とりあえずのPostgreSQL文書COPYのページには「binaryは二重引用符で括らないと駄目よ」という注意書きを書いて欲しいなあと思うのであった。

s87s87 2012/01/18 16:57 COPY table TO '/path' WITH binary; や COPY BINARY table ...; という古いシンタックスだと引用しなくてもOKですね。
pgsql-docsに投稿してみては? :)

nuko_yokohamanuko_yokohama 2012/01/19 08:48 > pgsql-docsに投稿してみては? :)
むむむ、ここで英文の壁が・・・

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/nuko_yokohama/20120118/1326864475